Интерактивные кнопки — это сердце удобного 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-кнопок:
- callback_data (до 64 байт): отправляет данные вашему боту. Основа для интерактива.
- url: открывает веб-страницу.
- switch_inline_query: предлагает выбрать чат для отправки инлайн-запроса.
- login_url: для авторизации через Telegram.
- 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 в любом чате.
Лучшие практики и частые ошибки
- Не перегружайте. Максимум 8-10 кнопок в ряду для Reply и 3-5 для Inline.
- Логичная группировка. Связанные действия — в один ряд или колонку.
- Всегда убирайте "часики". Вызов answer_callback_query обязателен.
- Предусматривайте устаревание. Что, если пользователь нажмёт на кнопку от сообщения, которое отправлено сутки назад? Добавляйте проверки.
- Используйте удаление 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 мощнее для сложных асинхронных задач. Выбор зависит от вашего проекта.