Inline- и reply-клавиатура в Telegram-боте: когда что использовать
Основы3 минРедакция Innovialabs
Коротко
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-правила для чистой навигации
- Редактируйте, а не плодите. При переходах по inline-меню меняйте текущее сообщение через
editMessageText, а не отправляйте новое. - Не больше 2–3 кнопок в ряд. Длинные подписи на телефоне обрезаются.
- Всегда давайте выход: кнопки «Назад» и «В главное меню».
- Не совмещайте без причины большую reply-клавиатуру и inline-кнопки в одном экране — пользователь не понимает, куда нажимать.
- Подтверждайте действие: короткое уведомление через
answerCallbackQueryвместо отдельного сообщения. - Учитывайте старые сообщения. Пользователь может нажать кнопку недельной давности — бот должен корректно ответить, что действие устарело.
Когда что выбирать
| Задача | Лучший вариант |
|---|---|
| Главное меню, которое всегда под рукой | reply-клавиатура или кнопка меню |
| Запрос телефона или геолокации | reply-кнопка со специальным типом |
| Каталог, пагинация, фильтры | inline-кнопки |
| Подтверждение «Да / Нет» | inline-кнопки |
| Переход на сайт или в Mini App | inline-кнопка url или web_app |