В 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-кнопки
-
Создание кнопок → 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)
3. Отправка сообщения с кнопками
await update.message.reply_text("Выберите действие:", reply_markup=reply_markup)
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.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()
Важные нюансы
-
callback_data должен быть уникальным для каждой кнопки (если нужно различать их в обработчике).
-
query.answer() — всегда вызывайте его, иначе кнопка "зависнет".
-
Редактирование сообщения:
-
Можно менять текст (edit_message_text), клавиатуру (edit_message_reply_markup) или оба сразу.
-
Пример смены клавиатуры:
new_keyboard = InlineKeyboardMarkup([[ ... ]])
await query.edit_message_reply_markup(reply_markup=new_keyboard)