Статья Автор: Деникина Н.В., Деникин А.В.

Кнопки в telegram-боте. Inline-кнопки

В Telegram-боте можно создавать разные типы кнопок, которые помогают пользователям взаимодействовать с ботом. Разберём основные виды и их реализацию в библиотеке python-telegram-bot (PTB).
 

Inline-кнопки (InlineKeyboardButton)

Особенности:

  • Появляются под сообщением.

  • Не исчезают после нажатия.

  • Могут открывать ссылки или отправлять callback_data боту.

Как добавить?

Используется InlineKeyboardMarkup + CallbackQueryHandler для обработки нажатий.

Пример:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import CallbackQueryHandler

async def start(update: Update, context: CallbackContext):
    keyboard = [
        [InlineKeyboardButton("Кнопка 1", callback_data="btn1")],
        [InlineKeyboardButton("Кнопка 2", callback_data="btn2")],
        [InlineKeyboardButton("Открыть Google", url="https://google.com")],
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.message.reply_text("Выберите действие:", reply_markup=reply_markup)

async def button_click(update: Update, context: CallbackContext):
    query = update.callback_query
    await query.answer()  # Подтверждаем нажатие
    await query.edit_message_text(f"Вы нажали: {query.data}")

app = Application.builder().token("TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CallbackQueryHandler(button_click))
app.run_polling()
 

Алгоритм добавления inline-кнопки

  1. Создание кнопок → 2. Формирование клавиатуры → 3. Отправка сообщения → 4. Обработка нажатия.


 

1. Создание кнопок (InlineKeyboardButton)

keyboard = [
    [InlineKeyboardButton("Кнопка 1", callback_data="btn1")],
    [InlineKeyboardButton("Кнопка 2", callback_data="btn2")],
    [InlineKeyboardButton("Открыть Google", url="https://google.com")],
]
  • Каждая кнопка создаётся через InlineKeyboardButton.

    • Параметры:

      • text — текст на кнопке (например, "Кнопка 1").

      • callback_data — данные, которые бот получит при нажатии (например, "btn1").
        ⚠️ Максимум 64 байта!

      • url — ссылка, которая откроется при нажатии (альтернатива callback_data).

  • Кнопки группируются в списки строк:

    [ [Кнопка1], [Кнопка2], [Кнопка3-ссылка] ]

2. Создание клавиатуры (InlineKeyboardMarkup)

reply_markup = InlineKeyboardMarkup(keyboard)
  • InlineKeyboardMarkup преобразует список кнопок в формат, который понимает Telegram.


3. Отправка сообщения с кнопками

await update.message.reply_text("Выберите действие:", reply_markup=reply_markup)
  • reply_markup прикрепляет клавиатуру к сообщению.

  • Результат:

    Выберите действие:
    [Кнопка 1] [Кнопка 2]
    [Открыть Google]

4. Обработка нажатия (CallbackQueryHandler)

async def button_click(update: Update, context: CallbackContext):
    query = update.callback_query
    await query.answer()  # Подтверждаем нажатие
    await query.edit_message_text(f"Вы нажали: {query.data}")
  • update.callback_query — содержит данные о нажатии:

    • query.data — это callback_data кнопки ("btn1" или "btn2").

  • query.answer() — обязательное подтверждение нажатия (убирает "часики" у кнопки).

  • query.edit_message_text() — редактирует исходное сообщение.


5. Регистрация обработчиков

app = Application.builder().token("TOKEN").build()
app.add_handler(CommandHandler("start", start))  # Обработчик команды /start
app.add_handler(CallbackQueryHandler(button_click))  # Обработчик нажатий на inline-кнопки
app.run_polling()
  • CallbackQueryHandler ловит все нажатия на inline-кнопки и передаёт их в функцию button_click.


Важные нюансы

  1. callback_data должен быть уникальным для каждой кнопки (если нужно различать их в обработчике).

  2. query.answer() — всегда вызывайте его, иначе кнопка "зависнет".

  3. Редактирование сообщения:

    • Можно менять текст (edit_message_text), клавиатуру (edit_message_reply_markup) или оба сразу.

    • Пример смены клавиатуры:

      new_keyboard = InlineKeyboardMarkup([[ ... ]])
      await query.edit_message_reply_markup(reply_markup=new_keyboard)
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать