В 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)