Кнопки в Telegram-боте: обычные и инлайн
Чем обычная клавиатура отличается от инлайн-кнопок, когда какая нужна, как обрабатывать нажатия и почему обязательно подтверждать callback.
Все статьи гида Telegram-боты · 13
Кнопки - основной интерфейс бота, и от выбора типа зависит и удобство, и то, как устроен код.
Два типа клавиатур
Обычная клавиатура. Заменяет клавиатуру пользователя, кнопки видны внизу экрана. Нажатие отправляет обычное текстовое сообщение с текстом кнопки.
Практическое следствие: бот не отличает нажатие кнопки от того, что пользователь набрал тот же текст руками. Это и удобно, и опасно: любой может отправить текст кнопки в неподходящий момент.
Инлайн-кнопки. Прикреплены к конкретному сообщению, остаются в переписке вместе с ним. Нажатие отправляет скрытое событие с данными, которые вы сами задали, - пользователь их не видит.
Ключевое различие: инлайн-кнопка привязана к своему сообщению, и по нажатию это сообщение можно изменить. Отсюда все интерфейсы с навигацией внутри одного сообщения.
Когда какая
| Задача | Тип |
|---|---|
| Главное меню, доступное всегда | Обычная |
| Действие над конкретным объектом | Инлайн |
| Каталог с переходами и страницами | Инлайн |
| Быстрый ответ в диалоге | Обычная |
| Подтверждение операции | Инлайн |
| Запрос контакта или геолокации | Обычная (только она это умеет) |
Практическое правило: обычная клавиатура - для навигации, инлайн - для действий. Смешивать можно и нужно: постоянное меню внизу, а действия над карточками - инлайн-кнопками.
Обработка нажатий
Обычная кнопка приходит как текстовое сообщение. Обработчик сравнивает текст с ожидаемым.
Отсюда две проблемы:
- Изменили подпись кнопки - сломался обработчик. Тексты стоит держать в одном месте, а не дублировать в коде.
- Пользователь может отправить тот же текст вручную в любой момент, в том числе в середине другого сценария. Обработчик должен это переживать.
Инлайн-кнопка приходит как отдельное событие с данными, которые вы в неё заложили. Важные детали:
Данные ограничены по длине. Класть в них длинные значения нельзя. Практика: короткий код действия плюс идентификатор объекта; всё остальное берётся из базы.
Данные приходят от пользователя. Технически их можно подделать. Проверяйте права на стороне бота: то, что кнопка была показана только администратору, ничего не гарантирует.
Структурируйте данные. Разделитель и фиксированный формат - иначе разбор превращается в набор условий, которые никто не может прочитать через месяц.
Подтверждение нажатия
Отдельный пункт, потому что его регулярно забывают: на нажатие инлайн-кнопки нужно ответить подтверждением. Пока его нет, у пользователя крутится индикатор загрузки, и бот выглядит зависшим.
Правильный порядок: отправить подтверждение сразу, до тяжёлой работы, а результат показать отдельно - изменением сообщения или новым сообщением.
Полезная деталь: подтверждение может содержать короткий текст, который покажется всплывающим уведомлением. Удобно для быстрого ответа вроде «добавлено» без засорения переписки.
Типовые ошибки
- Меню на четыре уровня вложенности. Пользователь теряется. Если так получилось, задача переросла кнопки - см. Mini Apps.
- Кнопки из прошлого сообщения. Пользователь пролистал вверх и нажал кнопку недельной давности. Бот должен переживать неактуальные данные, а не падать.
- Нет подтверждения нажатия. Выглядит как зависание.
- Права проверяются наличием кнопки. Проверка должна быть в обработчике.
- Тексты кнопок разбросаны по коду. Первое же изменение подписи ломает обработчик.
Как это структурируется в реальном проекте - aiogram: роутеры и мидлвари. Обзор - гид по Telegram-ботам.
Вопросы и ответы
Чем инлайн-кнопки отличаются от обычных?
Обычная клавиатура заменяет клавиатуру пользователя и при нажатии отправляет обычное текстовое сообщение. Инлайн-кнопки прикреплены к конкретному сообщению и отправляют скрытое событие, которое можно обработать и изменить это же сообщение. Первое подходит для постоянного меню, второе - для действий над объектом.
Почему кнопка нажимается, а бот не реагирует?
Чаще всего обработчик не совпадает с данными кнопки: строка в кнопке и условие в обработчике отличаются. Вторая по частоте причина - для инлайн-кнопки написан обработчик текстовых сообщений, который её событие не видит.
Зачем подтверждать нажатие инлайн-кнопки?
Пока подтверждение не отправлено, у пользователя крутится индикатор загрузки на кнопке, и интерфейс выглядит зависшим. Подтверждение отправляют сразу, до тяжёлой работы, а результат показывают отдельно.
Ещё по теме
- Telegram-боты на Python: полный практический гидГид
- Конструкторы Telegram-ботов против кода: что выбратьКакие задачи закрывают конструкторы ботов, где они упираются в потолок, из чего складывается стоимость владения и как выбрать между конструктором и кодом.
- Оплата в Telegram-боте: приём платежей по шагамКакие есть способы принимать оплату в боте, чем они отличаются, как обрабатывать подтверждение платежа и почему идемпотентность здесь обязательна.
- Токен Telegram-бота: получение и безопасностьКак получить токен у BotFather, где его хранить, что делать при утечке и какие настройки бота стоит задать сразу после создания.
Сделаю под ключ
Сделаю Telegram-бота под ваш процесс
Заявки, оплата, выдача доступа, рассылки и воронка в одном боте, с админкой для вас.
от 300 $ · 3-7 дней
«Действительно гуру своего дела. Узнал массу новой и полезной информации по телеграм рассылкам. До этого сжег очень много денег на оплате услуг посредников, но после общения с исполнителем буду делать все сам)»