В статье по шагам разберём, как сделать бота удобным: команды, кнопки под сообщением (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-режим — вызов бота из любого диалога. Комбинируя их, можно сделать удобного и понятного пользователю бота.