Чат-боты в Telegram на Python. Часть 2. Создаём и настраиваем меню
Продолжаем писать чат-бота для Telegram — добавляем кнопки и интерактив.


Иллюстрация: Катя Павловская для Skillbox Media
В первой части урока по чат-ботам для Telegram мы создали на Python эхо-бота с помощью библиотеки Aiogram. Сам эхо-бот работает просто, а его функция очевидна из названия: в ответ на сообщение пользователя он присылает тот же текст. Если вы ещё не читали первую часть, начните с неё.
Во второй части урока поработаем над меню: добавим для пользователей клавиатуру с быстрыми ответами и инлайн-кнопки для перехода на сайт Skillbox. Начнём с создания меню, но сначала разберёмся с видами возможных клавиатур.
Виды клавиатур
Библиотека Aiogram позволяет создать на Python клавиатуры двух видов, отличающиеся друг от друга расположением кнопок:
- Reply-кнопки для шаблонных ответов, которые закрепляются вместо основной клавиатуры на экране. Часто используются в чат-ботах как меню. Создаются с помощью метода ReplyKeyboardMarkup.
- Инлайн-кнопки, связанные с сообщениями в чате. При этом пользователь видит и основную клавиатуру. Создаются с помощью метода InlineKeyboardMarkup.
Создание меню
Наш эхо-бот для Telegram сейчас позволяет только отправлять текстовые сообщения и получать их обратно. Давайте проапгрейдим его и добавим кнопки с готовыми сообщениями, которые не надо вводить самому. Это будут reply-кнопки.
Нам понадобится класс ReplyKeyboardMarkup — для начала импортируем его и дополнительные необходимые классы:
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton
ReplyKeybordRemove и ReplyKeyboardMarkup позволяют создавать и удалять клавиатуру, а класс KeyboardButton используется для добавления кнопок.
Теперь создадим кнопки с готовыми фразами. Напишем код и разберёмся в нём:
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
kb = [
[
types.KeyboardButton(text="Сможешь повторить это?"),
types.KeyboardButton(text="А это?")
],
]
keyboard = types.ReplyKeyboardMarkup(keyboard=kb)
await message.reply("Привет!\nЯ Эхобот от Skillbox!\nОтправь мне любое сообщение, а я тебе обязательно отвечу.", reply_markup=keyboard)
Сначала создадим в нашем первом декораторе список kb, который будет хранить кнопки. Кнопка в Aiogram создаётся с помощью types.KeyboardButton(text=" "), где в параметре text мы передаём отображаемое название кнопки.
После этого необходимо создать клавиатуру и рассказать ей про наши кнопки. Делается это с помощью метода types.ReplyKeyboardMarkup(keyboard=list), где вместо list записывается название списка с кнопками — в нашем случае это список kb.
Теперь остаётся показать клавиатуру в Telegram-чате. Для этого добавляем в ответ строку reply_markup=keyboard, которая отображает клавиатуру после команды /start. Теперь при запуске бота мы видим, что в чате появились обе кнопки из списка kb:

Если нажать на любую кнопку, текст кнопки отправится в чат, а Telegram-бот пришлёт в ответ эту же фразу:

Можно создавать сколько угодно шаблонов, а также связывать кнопку с новыми действиями. Попробуем это на примере инлайн-клавиатур.
Инлайн-кнопки на Aiogram
Инлайн-кнопки отличаются от обычных тем, что связаны не с областью клавиатуры в мессенджере, а с каким-то сообщением в Telegram-чате. Самый простой пример инлайн-кнопки — это меню в канале @BotFather, с помощью которого мы создавали токен для доступа к API Telegram. Например, вот так в нём выглядит инлайн-меню с уже созданными ботами:

Создадим на Python для нашего бота инлайн-кнопки со ссылками на Skillbox Media и курсы по программированию. Для этого вернёмся к разделу с импортами в коде и добавим ещё одну строку, чтобы можно было использовать необходимые классы:
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
InlineKeyboardMarkup пригодится для инициализации инлайн-кнопок, а InlineKeyboardButton — для их создания.
Теперь создадим сами кнопки:
urlkb = InlineKeyboardMarkup(row_width=1)
urlButton = InlineKeyboardButton(text='Перейти в блог Skillbox', url='https://skillbox.ru/media/code/')
urlButton2 = InlineKeyboardButton(text='Перейти к курсам Skillbox', url='https://skillbox.ru/code/')
urlkb.add(urlButton,urlButton2)
@dp.message_handler(commands='ссылки')
async def url_command(message: types.Message):
await message.answer('Полезные ссылки:', reply_markup=urlkb)
Разберёмся в коде построчно. Сначала мы инициализируем клавиатуру с помощью InlineKeyboardMarkup, передав в качестве аргумента row_width число 1. Оно определяет, сколько кнопок будет находиться в одном ряду. Так как у нас надписи на кнопках длинные, лучше поместить их друг под другом.
После этого создаём для каждой кнопки отдельную переменную и инициализируем класс Button. В параметрах указываем:
- text — текст, который будет показан на кнопке в мессенджере;
- url — URL страницы, на которую пользователь будет переходить при нажатии на кнопку.
С помощью метода add добавляем две кнопки к уже созданной клавиатуре. Теперь необходимо написать message_handler, который будет вызывать в Telegram эти инлайн-кнопки. Делаем это по аналогии с обычными кнопками — с той лишь разницей, что в качестве команды вызова укажем ссылки, а в параметре reply_markup передадим название нашей клавиатуры — urlkb.
Повторно запустим нашего бота и посмотрим на результат:

Всё получилось. Теперь инлайн-клавиатура появляется при отправке команды /ссылки в бот.
Заключение
В нашем эхо-боте для Telegram появилось два вида меню, написанных на Python: reply-кнопки для быстрых сообщений и инлайн-кнопки для перехода на блог и сайт Skillbox. Для создания сложных ботов — например, ботов онлайн-магазинов — можно самостоятельно изучить документацию к библиотеке Aiogram: попробовать новые классы, методы и объекты.