Кнопки в меню бота (BotCommand
)
Особенности:
Как добавить?
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 понимает, какую функцию вызывать?
- Пользователь пишет
/start
в чате (нажимает на кнопку).
- Telegram отправляет боту
Update
с этим сообщением.
- Ваш код проверяет, есть ли обработчик для команды
start
(через CommandHandler
).
- Если обработчик найден — вызывается привязанная функция (например,
start(update, context)
).
Важные нюансы
-
Имена команд в BotCommand
и CommandHandler
должны совпадать (регистр неважен).
-
Описания в BotCommand
видны только в меню Telegram (при вводе /
).
-
Команды без обработчиков не будут работать, даже если они есть в set_my_commands()
Кнопки с запросом данных (KeyboardButton
)
Особенности:
Как добавить?
Используется 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
)
Особенности:
Как добавить?
from telegram import InlineKeyboardButton
pay_button = InlineKeyboardButton("Оплатить", pay=True)
keyboard = InlineKeyboardMarkup([[pay_button]])
await update.message.reply_text("Купить товар:", reply_markup=keyboard)