Перейти к содержимому
PD
Telegram-боты

Кнопки в Telegram-боте: обычные и инлайн

Чем обычная клавиатура отличается от инлайн-кнопок, когда какая нужна, как обрабатывать нажатия и почему обязательно подтверждать callback.

Все статьи гида Telegram-боты · 13

Кнопки - основной интерфейс бота, и от выбора типа зависит и удобство, и то, как устроен код.

Два типа клавиатур

Обычная клавиатура. Заменяет клавиатуру пользователя, кнопки видны внизу экрана. Нажатие отправляет обычное текстовое сообщение с текстом кнопки.

Практическое следствие: бот не отличает нажатие кнопки от того, что пользователь набрал тот же текст руками. Это и удобно, и опасно: любой может отправить текст кнопки в неподходящий момент.

Инлайн-кнопки. Прикреплены к конкретному сообщению, остаются в переписке вместе с ним. Нажатие отправляет скрытое событие с данными, которые вы сами задали, - пользователь их не видит.

Ключевое различие: инлайн-кнопка привязана к своему сообщению, и по нажатию это сообщение можно изменить. Отсюда все интерфейсы с навигацией внутри одного сообщения.

Когда какая

ЗадачаТип
Главное меню, доступное всегдаОбычная
Действие над конкретным объектомИнлайн
Каталог с переходами и страницамиИнлайн
Быстрый ответ в диалогеОбычная
Подтверждение операцииИнлайн
Запрос контакта или геолокацииОбычная (только она это умеет)

Практическое правило: обычная клавиатура - для навигации, инлайн - для действий. Смешивать можно и нужно: постоянное меню внизу, а действия над карточками - инлайн-кнопками.

Обработка нажатий

Обычная кнопка приходит как текстовое сообщение. Обработчик сравнивает текст с ожидаемым.

Отсюда две проблемы:

  • Изменили подпись кнопки - сломался обработчик. Тексты стоит держать в одном месте, а не дублировать в коде.
  • Пользователь может отправить тот же текст вручную в любой момент, в том числе в середине другого сценария. Обработчик должен это переживать.

Инлайн-кнопка приходит как отдельное событие с данными, которые вы в неё заложили. Важные детали:

Данные ограничены по длине. Класть в них длинные значения нельзя. Практика: короткий код действия плюс идентификатор объекта; всё остальное берётся из базы.

Данные приходят от пользователя. Технически их можно подделать. Проверяйте права на стороне бота: то, что кнопка была показана только администратору, ничего не гарантирует.

Структурируйте данные. Разделитель и фиксированный формат - иначе разбор превращается в набор условий, которые никто не может прочитать через месяц.

Подтверждение нажатия

Отдельный пункт, потому что его регулярно забывают: на нажатие инлайн-кнопки нужно ответить подтверждением. Пока его нет, у пользователя крутится индикатор загрузки, и бот выглядит зависшим.

Правильный порядок: отправить подтверждение сразу, до тяжёлой работы, а результат показать отдельно - изменением сообщения или новым сообщением.

Полезная деталь: подтверждение может содержать короткий текст, который покажется всплывающим уведомлением. Удобно для быстрого ответа вроде «добавлено» без засорения переписки.

Типовые ошибки

  • Меню на четыре уровня вложенности. Пользователь теряется. Если так получилось, задача переросла кнопки - см. Mini Apps.
  • Кнопки из прошлого сообщения. Пользователь пролистал вверх и нажал кнопку недельной давности. Бот должен переживать неактуальные данные, а не падать.
  • Нет подтверждения нажатия. Выглядит как зависание.
  • Права проверяются наличием кнопки. Проверка должна быть в обработчике.
  • Тексты кнопок разбросаны по коду. Первое же изменение подписи ломает обработчик.

Как это структурируется в реальном проекте - aiogram: роутеры и мидлвари. Обзор - гид по Telegram-ботам.

Вопросы и ответы

Чем инлайн-кнопки отличаются от обычных?

Обычная клавиатура заменяет клавиатуру пользователя и при нажатии отправляет обычное текстовое сообщение. Инлайн-кнопки прикреплены к конкретному сообщению и отправляют скрытое событие, которое можно обработать и изменить это же сообщение. Первое подходит для постоянного меню, второе - для действий над объектом.

Почему кнопка нажимается, а бот не реагирует?

Чаще всего обработчик не совпадает с данными кнопки: строка в кнопке и условие в обработчике отличаются. Вторая по частоте причина - для инлайн-кнопки написан обработчик текстовых сообщений, который её событие не видит.

Зачем подтверждать нажатие инлайн-кнопки?

Пока подтверждение не отправлено, у пользователя крутится индикатор загрузки на кнопке, и интерфейс выглядит зависшим. Подтверждение отправляют сразу, до тяжёлой работы, а результат показывают отдельно.

Ещё по теме

Сделаю под ключ

Сделаю Telegram-бота под ваш процесс

Заявки, оплата, выдача доступа, рассылки и воронка в одном боте, с админкой для вас.

от 300 $ · 3-7 дней

Похожий кейсTelegram-бот воронки продаж для онлайн-курсовTelegram-бот, который ведёт всю воронку - лид-магнит → гайд → интенсив → курс - с оплатой, автовыдачей доступа и админ-панелью.

«Действительно гуру своего дела. Узнал массу новой и полезной информации по телеграм рассылкам. До этого сжег очень много денег на оплате услуг посредников, но после общения с исполнителем буду делать все сам)»

viktorTR · Kwork