Назад к статьям

Telegram Bot API: команды, кнопки и inline-режим

В статье по шагам разберём, как сделать бота удобным: команды, кнопки под сообщением (inline) и под полем ввода (reply), а также inline-режим. Все примеры на Python и aiogram 3.

Команды бота

Команды — это сообщения, начинающиеся с / (например /start, /help). В Bot API они приходят в message.text. Чтобы в клиенте Telegram отображалось меню с подсказками команд, зарегистрируйте их через setMyCommands (в aiogram это делается при старте бота).

Пример: обработка команд и регистрация меню.

from aiogram import Bot, Dispatcher, types from aiogram.filters import Command from aiogram.types import BotCommand bot = Bot(token="BOT_TOKEN") dp = Dispatcher() # Меню команд (видно при нажатии на / в чате). Вызвать при старте: # async def on_start(): await bot.set_my_commands([...]); await dp.start_polling(bot) await bot.set_my_commands([ BotCommand(command="start", description="Начать"), BotCommand(command="help", description="Помощь"), ]) @dp.message(Command("start")) async def cmd_start(message: types.Message): await message.answer("Привет! Я бот. Команды: /help") @dp.message(Command("help")) async def cmd_help(message: types.Message): await message.answer("Помощь: используй кнопки ниже")

Reply-клавиатура (кнопки под полем ввода)

Кнопки отображаются под полем ввода и заменяют обычную клавиатуру. Создаётся через ReplyKeyboardMarkup. Удобно для выбора вариантов (например «Да» / «Нет» или «Каталог» / «Поддержка»).

from aiogram.types import ReplyKeyboardMarkup, KeyboardButton kb = ReplyKeyboardMarkup( keyboard=[ [KeyboardButton(text="Каталог"), KeyboardButton(text="Поддержка")], [KeyboardButton(text="Отмена")], ], resize_keyboard=True, ) await message.answer("Выберите действие:", reply_markup=kb)

Inline-кнопки (под сообщением)

Кнопки прикрепляются к конкретному сообщению. Нажатие не отправляет новое сообщение в чат, а приходит как callback_query с callback_data (до 64 байт). Обрабатывается в @dp.callback_query(). Пример: кнопки «Да»/«Нет» и кнопка-ссылка.

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton keyboard = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Да", callback_data="yes"), InlineKeyboardButton(text="Нет", callback_data="no")], [InlineKeyboardButton(text="Сайт", url="https://botmasterpro.ru")] ]) await message.answer("Продолжить?", reply_markup=keyboard) @dp.callback_query() async def process_callback(callback: types.CallbackQuery): if callback.data == "yes": await callback.message.edit_text("Вы нажали Да") await callback.answer() # убирает "часики" у кнопки

Inline-режим

Inline-режим позволяет вызывать бота из любого чата: пользователь вводит @username_bot запрос и получает варианты ответа. Включение через @BotFather → Bot Settings → Inline Mode. В коде обрабатывается InlineQuery. Подробнее: Bot API: Inline mode.

# Обработка inline-запросов (aiogram) from aiogram.types import InlineQueryResultArticle, InputTextMessageContent @dp.inline_query() async def inline_handler(query: types.InlineQuery): results = [ InlineQueryResultArticle( id="1", title="Ответ 1", input_message_content=InputTextMessageContent( message_text=query.query + " — обработано ботом" ) ) ] await query.answer(results, cache_time=60)

Итоги

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