Кнопки в Telegram ботах на Python: от простого к сложному

Кнопки в Telegram ботах на Python: от простого к сложному

Интерактивные кнопки — это сердце удобного Telegram-бота. Они превращают скучный текстовый интерфейс в интуитивную панель управления, где пользователю не нужно запоминать команды. В этой статье мы глубоко погрузимся в мир кнопок Telegram Bot API с использованием Python, рассмотрев все типы, лучшие практики и скрытые возможности.

Почему кнопки? Эволюция взаимодействия

Ранние боты работали исключительно на текстовых командах (/start, /help). Кнопки, представленные в виде ReplyKeyboardMarkup и InlineKeyboardMarkup, совершили революцию. Первые появляются вместо клавиатуры, вторые — прямо в сообщении. Они снижают порог входа, направляют пользователя и делают бота профессиональным.

Библиотеки-фавориты: python-telegram-bot vs aiogram

В Python два основных игрока. python-telegram-bot (PTB) — проверенный временем, с отличной документацией. Aiogram — асинхронный, современный и очень популярный сейчас. Код создания кнопок в них схож по логике.

С 2023 года Telegram официально рекомендует использовать библиотеки, поддерживающие Bot API 6.0+. И aiogram, и PTB активно обновляются.

Типы кнопок: подробный разбор

1. Reply-клавиатура (ReplyKeyboardMarkup)

Классическая клавиатура, которая появляется внизу экрана. Идеальна для главного меню.

from telegram import ReplyKeyboardMarkup
keyboard = [['Меню', 'Помощь'], ['Профиль', 'Настройки']]
reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True)
context.bot.send_message(chat_id=update.effective_chat.id, text='Выберите действие:', reply_markup=reply_markup)
  • resize_keyboard=True — подгоняет размер.
  • one_time_keyboard=True — скрывает после нажатия.
  • selective=True — показывает клавиатуру только определённым пользователям (в групповых чатах).

2. Inline-кнопки (InlineKeyboardMarkup)

Кнопки, встроенные в сообщение. Они не закрывают основную клавиатуру и могут обновлять контент сообщения.

from telegram import InlineKeyboardButton, InlineKeyboardMarkup
keyboard = [
    [InlineKeyboardButton('Открыть сайт', url='https://example.com')],
    [InlineKeyboardButton('Выбрать вариант', callback_data='option_1')]
]
reply_markup = InlineKeyboardMarkup(keyboard)

Типы Inline-кнопок:

  1. callback_data (до 64 байт): отправляет данные вашему боту. Основа для интерактива.
  2. url: открывает веб-страницу.
  3. switch_inline_query: предлагает выбрать чат для отправки инлайн-запроса.
  4. login_url: для авторизации через Telegram.
  5. pay: для приёма платежей (требует специальной настройки).

callback_data — это не текст, а строка-идентификатор. Не пытайтесь хранить в ней большие объёмы данных. Используйте её как ключ для поиска информации в вашей БД или кэше.

Обработка нажатий: сердце логики

Для Reply-кнопок бот получает обычное текстовое сообщение. Для Inline-кнопок с callback_data нужен обработчик CallbackQuery.

# Пример для aiogram
from aiogram import types
@dp.callback_query_handler(lambda c: c.data == 'option_1')
async def process_callback_button1(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id) # Убираем "часики"
    await bot.send_message(callback_query.from_user.id, 'Вы выбрали вариант 1!')
    # Можно отредактировать исходное сообщение:
    # await bot.edit_message_text('Новый текст', callback_query.from_user.id, callback_query.message.message_id)

Продвинутые паттерны

  • Динамическая клавиатура: Генерация кнопок на лету из данных БД (например, список товаров).
  • Пагинация (кнопки "Вперёд/Назад"): В callback_data передаётся номер страницы (page_2).
  • Кнопки с эмодзи: Добавляют визуальной ясности. Просто используйте символы эмодзи в тексте кнопки.
  • Inline-кнопки в режиме инлайн: Когда ваш бот вызывается через @username в любом чате.

Лучшие практики и частые ошибки

  1. Не перегружайте. Максимум 8-10 кнопок в ряду для Reply и 3-5 для Inline.
  2. Логичная группировка. Связанные действия — в один ряд или колонку.
  3. Всегда убирайте "часики". Вызов answer_callback_query обязателен.
  4. Предусматривайте устаревание. Что, если пользователь нажмёт на кнопку от сообщения, которое отправлено сутки назад? Добавляйте проверки.
  5. Используйте удаление Reply-клавиатуры (ReplyKeyboardRemove), когда она больше не нужна.

FAQ: Часто задаваемые вопросы

Как сделать кнопку, которая отправляет телефон или геолокацию?

Используйте специальные типы Reply-кнопок: KeyboardButton с параметрами request_contact=True или request_location=True. Это работает только в Reply-клавиатуре.

Можно ли изменить кнопки в уже отправленном сообщении?

Да, но только для Inline-кнопок! Используйте метод edit_message_reply_markup, передав новый объект reply_markup.

Есть ли ограничение на количество кнопок?

Прямого ограничения в API нет, но Telegram может обрезать интерфейс. Практическое правило: не более 100 Inline-кнопок на сообщение и разумные размеры для Reply.

Как обрабатывать нажатия кнопок в группах?

Принцип тот же. Убедитесь, что бот является администратором (для некоторых действий). В callback_data можно зашивать ID пользователя, чтобы проверять права.

Какая библиотека лучше для новичка?

python-telegram-bot имеет более линейный синтаксис. Aiogram мощнее для сложных асинхронных задач. Выбор зависит от вашего проекта.