Пишу бота в телеграмм на питоне, при помощи библиотеки aiogram, бот работает, запускается, но FSM машина состояний не запускается, что делать?
from aiogram import Bot, types, Dispatcher
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.utils import executor
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters import Text
from config23 import TOKEN
ID = None
class FSMAdmin(StatesGroup):
name = State()
date = State()
storage = MemoryStorage()
bot = Bot(token=TOKEN)
dp = Dispatcher(bot, storage=storage)
b1 = KeyboardButton('/Продолжить')
b2 = KeyboardButton('/загрузить')
kb_client = ReplyKeyboardMarkup(resize_keyboard=True)
form = ReplyKeyboardMarkup(resize_keyboard=True)
kb_client.add(b1)
form.add(b2)
@dp.message_handler(commands=['start', 'help'])
async def commands_start(message: types.Message):
try:
await bot.send_message(message.from_user.id, 'Привет, я бот, который поможет тебе в напоминании'
' о чем-либо, для '
'продолжения работы нажми на кнопку.',
reply_markup=kb_client)
await message.delete()
except:
await message.reply('Общение с ботом работает исключитьно через ЛС, напишите ему:'
'\nhttps://t.me/Reminderfunbot')
@dp.message_handler(commands=['Продолжить'])
async def prod(message: types.Message):
await bot.send_message(message.from_user.id, 'Сейчас мы заполним согласно формату данные, которые мне необходимы '
'и в указанное время я оповещу тебя)\n'
'ВАЖНО: Если хотите, чтобы бот работал правильно, после нажатия на'
' кнопку делайте только то, что от вас требует бот.',
reply_markup=form)
# @dp.message_handler(commands="загрузить", state="*")
async def cm_start(message: types.Message):
if message.from_user.id == ID:
await FSMAdmin.name.set()
await message.reply('Напиши мне название мероприятия')
# @dp.message_handler(state=FSMAdmin.name)
async def load_name(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['name'] = message.text
await FSMAdmin.next()
await message.reply('Напиши дату')
# @dp.message_handler(state=FSMAdmin.date)
async def load_date(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['date'] = message.text
async with state.proxy() as data:
await message.reply(str(data))
await state.finish()
# @dp.message_handler(state="*", commands='отмена')
# @dp.message_handler(Text(equals='', ignore_case=True), state="*")
async def cancel_handler(message: types.Message, state: FSMContext):
current_state = await state.set_state()
if current_state is None:
return
await state.finish()
await message.reply('ОК')
def reg_handlers(dp: Dispatcher):
dp.register_message_handler(cm_start, commands='загрузить', state=None)
dp.register_message_handler(load_name, state=FSMAdmin.name)
dp.register_message_handler(load_date, state=FSMAdmin.date)
dp.register_message_handler(cancel_handler, state="*", commands='отмена')
dp.register_message_handler(cancel_handler, Text(equals='', ignore_case=True), state="*")
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Вот весь код, помогите пожалуйста :(
Источник: Stack Overflow на русском