Почему не работает state.set_state() в Aiogram3?
Когда я нажимаю на "✅ Согласен", callback работает (Выводит сообщение: "Хорошо, добавляем вас в нашу базу данных, ожидайте..."), но почему-то не переходит состояние в RegistrationState.TelegramID
, из-за чего дальнейшие действия не происходит. Я думаю, что всё из-за callback_query, но не уверен в этом.
Вот мой код:
bot = Bot("XXXXXXXXXX")
storage = MemoryStorage()
dp = Dispatcher(storage=storage)
router = Router()
dp.include_router(router)
database: Database = None
class RegistrationState(StatesGroup):
TelegramID = State()
Username = State()
PhotoURL = State()
FullName = State()
# ...
@router.message(CommandStart())
async def start(msg: Message, state: FSMContext):
builder = InlineKeyboardBuilder()
builder.add(InlineKeyboardButton(
text="✅ Согласен",
callback_data="agree")
)
with open("PRIVACY.md", encoding="UTF-8") as privacy:
await msg.answer(privacy.read(), parse_mode="HTML", reply_markup=builder.as_markup())
@router.callback_query(lambda c: c.data == 'agree')
async def agree_callback(callback_query: CallbackQuery, state: FSMContext):
await callback_query.answer("Хорошо, добавляем вас в нашу базу данных, ожидайте...")
await state.set_state(RegistrationState.TelegramID)
@router.message(RegistrationState.TelegramID)
async def process_telegram_id(msg: Message, state: FSMContext):
global database
#...
await msg.answer(f"Добро пожаловать, {data['FullName']}! Чтобы начать поиск объявлений, нажмите на 'Поиск'. Если вы хотите продать своего щенка, нажмите на режим 'Бизнеса'")
await state.finish()
Ответы (2 шт):
если вы хотите сделать хендлере проверку на состояние то нужно указывать в хендлере RegistrationState.TelegramID.filter() а не просто передать RegistrationState.TelegramID
@router.message(RegistrationState.TelegramID.filter()) async def process_telegram_id(msg: Message, state: FSMContext): global database #...текст курсивом
await msg.answer(f"Добро пожаловать, {data['FullName']}! Чтобы начать поиск объявлений, нажмите на 'Поиск'. Если вы хотите продать своего щенка, нажмите на режим 'Бизнеса'")
await state.finish()
Ты не записываешь в стейт ничего, поэтому там ничего и нет.
Обработка в твоем случае происходит следующим образом: При нажатии на кнопку старт бот отправляет сообщение с инлайн кнопкой. При нажатии на кнопку - срабатывает коллбэк и устанавливается стейт. Дальнейшая обработка останавливается.
Следующий хендлер сработает только при отправке боту чего-либо: сообщения, картинки, видео и тд. Потому что ты составил хендлер так:
@router.message(RegistrationState.TelegramID)