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

Кнопки в telegram-боте. Командные кнопки и другие

Кнопки в меню бота (BotCommand)

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

  • Появляются в меню бота (ввод строки /).

  • Настраиваются через BotFather или кодом.

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

from telegram import Update, BotCommand
from telegram.ext import Application, CommandHandler, CallbackContext

async def start(update: Update, context: CallbackContext):
    await update.message.reply_text("Бот запущен!")

async def help(update: Update, context: CallbackContext):
    await update.message.reply_text("Справка: /start, /help")

async def post_init(app: Application):
    commands = [
        BotCommand("start", "Запустить бота"),
        BotCommand("help", "Помощь"),
    ]
    await app.bot.set_my_commands(commands)

app = Application.builder().token("TOKEN").post_init(post_init).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help))
app.run_polling()  # post_init выполнится при старте


Установка списка команд (ваш код)

  • BotCommand("имя", "описание") — создаёт объект команды.

  • set_my_commands() — отправляет список команд серверам Telegram.
    → После этого они появятся в меню бота (при вводе /).

Телеграм не связывает команды из set_my_commands() с функциями автоматически. Нужно явно добавить CommandHandler.

Как Telegram понимает, какую функцию вызывать?

  1. Пользователь пишет /start в чате (нажимает на кнопку).
  2. Telegram отправляет боту Update с этим сообщением.
  3. Ваш код проверяет, есть ли обработчик для команды start (через CommandHandler).
  4. Если обработчик найден — вызывается привязанная функция (например, start(update, context)).

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

  1. Имена команд в BotCommand и CommandHandler должны совпадать (регистр неважен).

  2. Описания в BotCommand видны только в меню Telegram (при вводе /).

  3. Команды без обработчиков не будут работать, даже если они есть в set_my_commands()


Кнопки с запросом данных (KeyboardButton)

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

  • Могут запрашивать контактгеолокацию или создавать опрос.

  • Работают только с ReplyKeyboardMarkup.

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

Используется KeyboardButton с параметрами:

  • request_contact=True — запросить номер телефона.

  • request_location=True — запросить геопозицию.

  • request_poll=True — создать опрос.

Пример:

from telegram import KeyboardButton

async def ask_data(update: Update, context: CallbackContext):
    keyboard = [
        [KeyboardButton("Отправить контакт", request_contact=True)],
        [KeyboardButton("Отправить локацию", request_location=True)],
    ]
    reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True)
    await update.message.reply_text("Поделитесь данными:", reply_markup=reply_markup)

app.add_handler(CommandHandler("ask", ask_data))

Inline-кнопки с оплатой (PayButton)

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

  • Для приёма платежей через Telegram Payments.

  • Требует настройки платежей у @BotFather.

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

from telegram import InlineKeyboardButton

pay_button = InlineKeyboardButton("Оплатить", pay=True)
keyboard = InlineKeyboardMarkup([[pay_button]])
await update.message.reply_text("Купить товар:", reply_markup=keyboard)
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать