← Все вопросы

Как обработать нажатие инлайн-кнопки (callback) в aiogram?

Задан 30 месяцев назад830 просмотров2 ответа
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].

Ваш ответ

Войдите, чтобы ответить на вопрос.