Бот запускается, но не работают стейты, что исправить в коде?
Подскажите пожалуйста, бот запускается, но не работают стейты, нажимаешь посмотреть анкету, но ничего не происходит, что исправить в коде?
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
import config
import random
from on_startup_notify import on_startup_notify
from memorystate import Test
from aiogram import types, Bot, executor, Dispatcher
bot = Bot(token=config.BOT_TOKEN, parse_mode=types.ParseMode.HTML)
dp = Dispatcher(bot)
storage = MemoryStorage()
async def on_startup(dispatcher):
await on_startup_notify(dispatcher)
@dp.message_handler(commands=['start'])
async def startpg(message: types.Message, state: FSMContext):
startmenu = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup1 = types.KeyboardButton("Посмотреть анкету")
startmenu.add(markup1)
await bot.send_message(chat_id=message.chat.id, text='Добро пожаловать!\nНаш бот познакомит Вас с девушками с Вашего города! Жми на посмотреть анкету!',reply_markup=startmenu)
await state.set_data(Test.N1)
@dp.message_handler(text=['Посмотреть анкету'], state=Test.N1)
async def osnova(message: types.Message, state: FSMContext):
await bot.send_message(message.chat.id, 'Введите своё имя:')
answer = message.text
await state.update_data(answer1=answer)
await Test.N2.set()
Ответы (1 шт):
Автор решения: Zhymabek Roman
→ Ссылка
Вот полностью рабочии ваш код. Я убрал не нужные импорты а также добавил memory_storage в диспечер, чтобы он сохранял состояние FSM. Также я написал в некоторых местах коментарии-пояснении к коду, чтобы было вам понятно
from aiogram import types, Bot, executor, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
import random
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
# Initialize FSM storage
memory_storage = MemoryStorage()
# Initialize bot and dispatcher
bot = Bot(token="BOT TOKEN HERE", parse_mode=types.ParseMode.HTML)
dp = Dispatcher(bot, storage=memory_storage)
class QuestionnaireState(StatesGroup):
step_1 = State()
@dp.message_handler(commands=['start'])
async def startpg(message: types.Message, state: FSMContext):
startmenu = types.ReplyKeyboardMarkup(resize_keyboard=True)
markup1 = types.KeyboardButton("Посмотреть анкету")
startmenu.add(markup1)
await message.reply('Добро пожаловать!\nНаш бот познакомит Вас с девушками с Вашего города!\nЖми на посмотреть анкету!', reply_markup=startmenu)
@dp.message_handler(text='Посмотреть анкету')
async def osnova(message: types.Message, state: FSMContext):
await message.reply('Введите своё имя:', reply_markup=types.ReplyKeyboardRemove()) # types.ReplyKeyboardRemove() здесь нужен для того чтобы удалить reply_markup с надписью "Посмотреть анкету" от глаз пользывателя
await QuestionnaireState.step_1.set()
@dp.message_handler(state=QuestionnaireState.step_1, content_types=types.ContentTypes.TEXT)
async def questionnaire_state_1_message(message: types.Message, state: FSMContext):
async with state.proxy() as user_data:
# Здесь user_data является хранилищем (а точнее словарем), куда можно сохранять определенные данные и вытаскивать если нужно в любой момент
user_data['name'] = message.text.replace('\n',' ') # Вы возможно спросите - для чего нужен здесь replace, он нужен в случае если юзер умудрится написать свое имя на двух строках, у меня на практике такое было несколько раз
await message.reply(f"Ваше имя: {user_data['name']}")
await state.finish() # Оканчиваем наш FSM опрос от пользывателя
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
RTFM и Удачи Вам!
