В Telegram-боте для кнопок есть два вида клавиатур: reply-клавиатура заменяет клавиатуру снизу, inline-кнопки крепятся к сообщению; отдельно настраивается меню команд, список после нажатия на слэш. Сделать кнопки можно двумя путями: в визуальном конструкторе без единой строки кода или прямо в коде бота.
Какие кнопки бывают в боте
Внешне все три выглядят как кнопки, но бот получает от них разное: текст сообщения, скрытый сигнал callback или команду со слэшем.
- Reply-кнопки (обычная клавиатура). Появляются внизу экрана вместо системной клавиатуры. Нажатие отправляет в чат текст кнопки, будто пользователь сам его написал. Подходят для главного меню: «Каталог», «Записаться», «Связаться».
- Inline-кнопки. Прикреплены к конкретному сообщению и остаются на месте в переписке. По нажатию бот получает скрытый сигнал (callback) и может, например, перелистнуть страницу или раскрыть подраздел, не засоряя чат. Ещё inline-кнопка умеет вести на ссылку.
- Меню команд. Список команд, который открывается по кнопке слева от поля ввода или после ввода слэша. Содержит подсказки с командами вроде
/startи/help.
Разница на практике такая: reply-кнопки ведут диалог как меню, inline-кнопки управляют содержимым сообщения, а меню команд помогает быстро вызвать нужную команду. В одном боте обычно используют все три.
Как сделать меню команд через BotFather
Меню команд настраивается в BotFather без кода: командой /setcommands или через кнопки настроек. BotFather управляет именем, описанием, аватаром, списком команд, токеном и inline-режимом. Логику кнопок и ответы бота нужно задать в конструкторе или коде. Путь через настройки такой:
- Откройте чат с @BotFather и отправьте команду
/mybots. - Выберите в списке своего бота и нажмите Edit Bot.
- Нажмите Edit Commands.
- Одним сообщением отправьте список команд в формате
команда - описание, каждая с новой строки. Название пишется без слэша и содержит 1-32 символа: строчные латинские буквы, цифры и подчёркивание; описание содержит 1-256 символов (BotCommand). - BotFather подтвердит сохранение. Меню обновляется через несколько секунд; если оно не появилось рядом с полем ввода, закройте и снова откройте чат с ботом (справка BotHelp).
Пример такого сообщения (инструкция TextBack): start - Запустить бота, следующей строкой help - Помощь, ещё строкой menu - Открыть меню. Если раньше бота создавали через конструктор или нейросеть, то к самому созданию можно вернуться в нашем разборе, как создать бота в Telegram без программирования.
Кнопки делают бота удобным, а ИИ-агент делает его полезным. Завтра в 12:00 МСК на бесплатном мастер-классе Яков Юдин показывает своего агента в Telegram, который сам готовит дайджест новостей голосом.
Записаться бесплатноКнопки без кода: конструкторы
Reply- и inline-кнопки с логикой удобнее всего собирать в визуальном конструкторе. Вы рисуете цепочку сообщений, к каждому прикрепляете кнопки и указываете, куда они ведут, всё мышкой. В России доступны следующие платформы; цены указаны на октябрь 2026:
- SaleBot. Визуальный редактор сценариев, где к сообщению добавляются и обычные (reply), и inline-кнопки. Подходит под воронки и мини-CRM. Тариф «Бесплатный» стоит 0 ₽ без ограничения по времени, «Бизнес» стоит 2 999 ₽ в месяц.
- BotHelp. Простой конструктор с готовыми шаблонами и рассылками, ориентирован на быстрый запуск без опыта. Тариф PRO стоит от 1 599 ₽ в месяц; есть 14 дней бесплатного доступа, постоянного бесплатного тарифа нет.
- PuzzleBot и другие no-code сервисы работают по похожему принципу: блок сообщения плюс кнопки под ним. В PuzzleBot тариф «Бесплатный» стоит 0 ₽ и содержит рекламу, «Креативный» стоит 891 ₽ в месяц с автоплатежом или 990 ₽ без него.
Порядок в большинстве конструкторов похожий: создаёте блок с текстом, добавляете к нему кнопку, задаёте её надпись и действие (перейти к другому блоку, открыть ссылку, вызвать сценарий). Названия и отдельные шаги отличаются: например, в PuzzleBot кнопку-условие создают отдельно, а затем связывают с кнопкой сообщения. Если хотите сравнить именно бесплатные варианты, посмотрите разбор, как создать бота бесплатно.
Inline-меню отвечает на нажатия, а агент берёт на себя целую работу. На мастер-классе покажут Telegram-агента Якова Юдина: контент-завод канала, бот-транскрибатор, ежедневный дайджест голосом. И честно обсудят, что агенту можно доверить.
Хочу на мастер-классКак добавить кнопки в коде
В коде бота кнопки задаются через параметр reply_markup при отправке сообщения, например на Python с библиотеками aiogram или pyTelegramBotAPI. Для примера на aiogram 3 установите библиотеку командой pip install aiogram: актуальная версия aiogram 3.31.0 поддерживает Python 3.10-3.14; токен возьмите у BotFather и подставьте вместо ТОКЕН_ОТ_BOTFATHER в коде.
- Для нижнего меню собираете объект reply-клавиатуры и передаёте в него список кнопок. По нажатию бот получит текст кнопки как обычное сообщение и отреагирует по совпадению текста.
- Для inline-кнопок собираете inline-клавиатуру. Два частых действия:
callback_data(скрытый код нажатия) иurl(ссылка); также естьweb_appдля мини-приложения иcopy_textдля копирования текста. Для одной кнопки выбирается одно действие (InlineKeyboardButton). - На нажатие inline-кнопки с
callback_dataбот получает событие callback и по значениюcallback_dataрешает, что показать дальше. URL-кнопка просто открывает ссылку. - Готовую клавиатуру передаёте в
reply_markupпри отправке сообщения.
import asyncio
from aiogram import Bot, Dispatcher, F
from aiogram.filters import CommandStart
from aiogram.types import CallbackQuery, Message
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
dp = Dispatcher()
@dp.message(CommandStart())
async def start(message: Message):
menu = ReplyKeyboardBuilder()
menu.button(text="Каталог")
menu.button(text="Связаться")
await message.answer(
"Главное меню",
reply_markup=menu.as_markup(resize_keyboard=True),
)
@dp.message(F.text == "Каталог")
async def catalog(message: Message):
kb = InlineKeyboardBuilder()
kb.button(text="Тарифы", callback_data="prices", style="primary")
kb.button(text="Сайт", url="https://example.com")
kb.adjust(1)
await message.answer("Выберите раздел", reply_markup=kb.as_markup())
@dp.callback_query(F.data == "prices")
async def prices(callback: CallbackQuery):
await callback.answer()
await callback.message.answer("Здесь список тарифов")
async def main():
bot = Bot(token="ТОКЕН_ОТ_BOTFATHER")
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
В примере callback.answer() убирает индикатор ожидания на кнопке, а kb.adjust(1) ставит кнопки по одной в ряд; адрес example.com служит заглушкой для ссылки. Для кнопки «Связаться» в этом примере обработчика нет: его нужно добавить под ваш сценарий.
В callback_data хранится внутренняя метка, по которой код понимает, какую кнопку нажали. Связка inline-кнопки и обработчика callback позволяет переключать экраны бота. Если вы пишете бота с нейросетью в помощь, пригодится наш гайд, как сделать чат-бота на нейросети.
С Bot API 9.4 от 9 февраля 2026 у reply- и inline-кнопок есть поле style: danger задаёт красный цвет, success зелёный, primary синий; без поля клиент рисует кнопку в своём стиле. В aiogram 3.31.0 параметр style= поддерживается, поэтому в примере кнопке «Тарифы» задано style="primary".
В том же обновлении появилось поле icon_custom_emoji_id для кастомного эмодзи перед текстом кнопки. Для использования этого поля нужен дополнительный юзернейм бота, купленный на Fragment, или Telegram Premium у его владельца.
Не делайте больше 2-3 reply-кнопок в строке: на телефоне длинные надписи переносятся и меню выглядит рвано. Лучше короткие подписи в один-два ряда, тогда по нему удобно попадать пальцем.
По теме: Как создать команду боту в Telegram в 2026: меню и обработчик
Ограничения и частые ошибки
Ограничения подписи и числа кнопок зависят от конструктора: в BotHelp для меню и кнопок текстового блока подпись содержит до 64 символов, в ряду помещается до 8 кнопок, в блоке до 64. Там же выбирается цвет кнопки: «Обычный», «Голубой», «Зелёный» или «Красный». Держите подписи короткими, а широкие ряды разбивайте на несколько строк.
- В документации Bot API числового предела для подписи кнопки нет, а у
callback_dataон жёсткий: 1-64 байта (Telegram Bot API). Русская буква в UTF-8 занимает 2 байта, поэтому метку лучше писать латиницей, напримерpricesилиpage_2. - Reply-кнопка отправляет в чат свой текст, а inline-кнопка нет, поэтому для «тихих» действий берите именно inline.
- Команда из меню отправляет боту
/команду; ответ на неё нужно настроить сценарием в конструкторе или обработчиком в коде, иначе бот промолчит. Один список команд в BotFather не задаёт ответы (документация Telegram).
По умолчанию reply-клавиатура остаётся, пока бот не пришлёт новую. Параметр one_time_keyboard=True просит клиент скрыть её после нажатия, а resize_keyboard=True делает компактнее. Чтобы убрать клавиатуру совсем, отправьте сообщение с ReplyKeyboardRemove в reply_markup.
Частые вопросы
Как сделать кнопки в боте без программирования?
Через визуальный конструктор (SaleBot, BotHelp и подобные): создаёте блок сообщения и прикрепляете к нему reply- или inline-кнопки мышкой, указывая действие для каждой. Код при этом не нужен.
Чем reply-кнопки отличаются от inline?
Reply-кнопки заменяют клавиатуру снизу и по нажатию отправляют свой текст в чат. Inline-кнопки прикреплены к сообщению, не пишут ничего в чат и передают боту скрытый сигнал или ведут по ссылке.
Можно ли поменять кнопки после запуска бота?
Да. В конструкторе достаточно отредактировать блок с кнопками, а меню команд в любой момент переписать через BotFather кнопкой Edit Commands или командой /setcommands. В коде поправьте клавиатуру: новая версия появится, когда бот отправит её снова. Inline-кнопки у уже отправленного сообщения меняют методом editMessageReplyMarkup: правка кода старые сообщения не обновит.
Почему кнопка не нажимается или бот не реагирует?
Обычно причина в том, что для inline-кнопки не задан обработчик нажатия (callback), либо текст reply-кнопки не совпадает с тем, что ждёт бот. Если после нажатия callback-кнопки остаются «часики», бот не ответил на callback: Telegram показывает индикатор, пока не вызван answerCallbackQuery, в aiogram это await callback.answer(). Проверьте, что каждой кнопке соответствует действие или сценарий, а обработчик callback отправляет ответ.
Кнопки в боте у вас уже получатся. Следующий шаг интереснее: завтра в 12:00 МСК на бесплатном мастер-классе покажут Telegram-агента, который каждый день делает работу за автора канала, и как такие сервисы собирают без кода. Досмотревшим 30 идей с промптами.
Забронировать место