← Все вопросы
Как обработать нажатие инлайн-кнопки (callback) в aiogram?
7
Сделал инлайн-кнопки «Да» и «Нет» с callback_data. Но когда нажимаю — ничего не происходит, и наверху телеграма крутится «часики». Как поймать само нажатие и убрать эту загрузку?
2 ответа
13
✓ Принятый ответ — помог автору
Нажатие инлайн-кнопки — это не сообщение, а callback query, и ловится оно другим декоратором:
from aiogram.types import CallbackQuery
@dp.callback_query(F.data == "yes")
async def on_yes(callback: CallbackQuery):
await callback.message.answer("Отлично, ты программист в душе!")
await callback.answer() # убирает "часики"
@dp.callback_query(F.data == "no")
async def on_no(callback: CallbackQuery):
await callback.message.answer("Ничего, ещё распробуешь :)")
await callback.answer()
Два ключевых момента:
F.data == "yes"сравнивается с темcallback_data, который ты задал кнопке.- Обязательно вызови
callback.answer()в конце — иначе у пользователя бесконечно крутятся «часики». Это и есть причина твоего зависания.
callback.message.answer(...) шлёт новое сообщение, а callback.answer("текст") показывает короткое всплывающее уведомление.
5
Если кнопок много и callback_data у них похожие (например buy_1, buy_2), не пиши хендлер на каждую. Лови по началу строки: @dp.callback_query(F.data.startswith("buy_")), а потом внутри бери номер: num = callback.data.split("_")[1].
Ваш ответ
Войдите, чтобы ответить на вопрос.