Код
#статьи

Чат-боты в 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:

Скриншот: aiogram / Skillbox Media

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

Скриншот: aiogram / Skillbox Media

Можно создавать сколько угодно шаблонов, а также связывать кнопку с новыми действиями. Попробуем это на примере инлайн-клавиатур.

Инлайн-кнопки на aiogram

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

Скриншот: aiogram / Skillbox Media

Создадим на 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.

Повторно запустим нашего бота и посмотрим на результат:

Скриншот: aiogram / Skillbox Media

Всё получилось. Теперь инлайн-клавиатура появляется при отправке команды /ссылки в бот.

Заключение

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

Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Научитесь: SMM-специалист с нуля Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована