Перейти к содержанию
Innovialabs

Inline- и reply-клавиатура в Telegram-боте: когда что использовать

Основы3 мин

Коротко

Reply-клавиатура заменяет обычную клавиатуру и отправляет текст от имени пользователя — она для постоянного главного меню, а inline-кнопки прикреплены к сообщению и тихо передают боту callback data — они для действий над конкретным сообщением.

Главное различие

В Telegram-боте есть два типа кнопок, и они работают принципиально по-разному.

  • Reply-клавиатура (ReplyKeyboardMarkup) появляется вместо обычной клавиатуры телефона. Нажатие кнопки отправляет в чат текст от имени пользователя, как будто он его набрал.
  • Inline-клавиатура (InlineKeyboardMarkup) прикреплена к конкретному сообщению бота. Нажатие ничего не пишет в чат: бот получает callback query со скрытыми данными callback_data и может изменить это же сообщение.

Отсюда простое правило: reply — для постоянной навигации, inline — для действий в контексте сообщения.

Reply-клавиатура: возможности и ограничения

Что полезно знать:

  • resize_keyboard подгоняет высоту кнопок под содержимое — без него они получаются огромными.
  • one_time_keyboard скрывает клавиатуру после нажатия, is_persistent оставляет её на экране.
  • input_field_placeholder показывает подсказку в поле ввода.
  • Специальные кнопки умеют запросить контакт, геолокацию или открыть Mini App.
  • Убрать клавиатуру можно, отправив ReplyKeyboardRemove.

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

Inline-клавиатура: возможности и ограничения

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

  • callback_data — передать боту данные (до 64 байт);
  • url — открыть ссылку;
  • web_app — открыть Mini App;
  • switch_inline_query — запустить inline-режим бота в другом чате;
  • pay — кнопка оплаты в счёте;
  • copy_text — скопировать текст в буфер.

Главное правило: на каждый callback query бот должен вызвать answerCallbackQuery, иначе у пользователя будет висеть индикатор загрузки. В этот же вызов можно передать короткое уведомление или alert.

Пример inline-клавиатуры на aiogram 3:

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

kb = InlineKeyboardMarkup(inline_keyboard=[
    [InlineKeyboardButton(text="Подробнее", callback_data="item:42:info")],
    [InlineKeyboardButton(text="В корзину", callback_data="item:42:add")],
])

Ограничение в 64 байта означает, что в callback_data кладут короткий идентификатор, а не JSON с данными. Остальное бот берёт из базы.

Команды и кнопка меню

Помимо клавиатур есть ещё два элемента навигации:

  • Команды (/start, /help, /catalog) задаются через BotFather или метод setMyCommands. Их список можно сделать разным для языков и для типов чатов.
  • Кнопка меню слева от поля ввода. Через setChatMenuButton она показывает либо список команд, либо открывает Mini App.

Для большинства ботов хорошо работает связка: команды — для входа в основные разделы, inline-кнопки — для работы внутри раздела.

UX-правила для чистой навигации

  1. Редактируйте, а не плодите. При переходах по inline-меню меняйте текущее сообщение через editMessageText, а не отправляйте новое.
  2. Не больше 2–3 кнопок в ряд. Длинные подписи на телефоне обрезаются.
  3. Всегда давайте выход: кнопки «Назад» и «В главное меню».
  4. Не совмещайте без причины большую reply-клавиатуру и inline-кнопки в одном экране — пользователь не понимает, куда нажимать.
  5. Подтверждайте действие: короткое уведомление через answerCallbackQuery вместо отдельного сообщения.
  6. Учитывайте старые сообщения. Пользователь может нажать кнопку недельной давности — бот должен корректно ответить, что действие устарело.

Когда что выбирать

ЗадачаЛучший вариант
Главное меню, которое всегда под рукойreply-клавиатура или кнопка меню
Запрос телефона или геолокацииreply-кнопка со специальным типом
Каталог, пагинация, фильтрыinline-кнопки
Подтверждение «Да / Нет»inline-кнопки
Переход на сайт или в Mini Appinline-кнопка url или web_app

Частые вопросы

Да, но не в одном сообщении: у сообщения может быть только одна разметка. Reply-клавиатура остаётся на экране после предыдущего сообщения, а inline-кнопки прикрепляются к новому.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.