Введение
Настало время глубже погрузиться во взаимодействие человека с ботом. Сегодня изучим декоратор message_handler(). Узнаем, как боту реагировать на конкретные сообщения от пользователя и отвечать на его команды.
Ну что, давай начинать!
Note: Для дальнейшей работы, необходимо использовать версию интерпретатора Python 3.9, и библиотеку aiogram версии 2.25.1.
Шаблон проекта можешь скачать с GitHub по ссылке ? жми сюда (НЕ ЗАБУДЬ УКАЗАТЬ ТОКЕН СВОЕГО БОТА!)
Немного теории
message_handler() или хэндлер обработки сообщений нужен для того, чтобы реагировать на входящие сообщения в Telegram-боте и содержать в себе функцию ответа. C его помощью можно указать, какие команды или сообщения от пользователя будет обрабатывать бот, и вызвать соответствующую функцию при их вводе.
Переходим к практике.
Практика
Сейчас мы разберём две ситуации использования хэндлера (на самом деле их гораздо больше, но об этом в следующих статьях):
- Получение ботом команд от пользователя (/commands)
- Получение ботом текстовых сообщений и их обработка (text/text_contains)
Получение команд
Для приёма команд от пользователя, необходимо написать следующий декоратор с параметром commands = []
В параметры хэндлера необходимо передать в виде списка команду, которую бот будет обрабатывать. В данном случае это команда start.
Также обязательно после декоратора создаём асинхронную (async) функцию (не забываем в качестве параметра передать наш message: types.Message), назвать её можно как угодно, но лучше дать имя, созвучное с обрабатываемой командой.
Напишем простейшую логику обработки. При получении команды start, бот будет отправлять сообщение пользователю, что он начал работу.
Запускаем в работу скрипт, заходим в бота и пишем команду start.
Обрати внимание, что команда записывается следующим образом: /текст_команды
После отправки получаем ожидаемый результат.
Если указать команду без / , то в ответ получим…
НИЧЕГО, так как теперь start для бота считается обычным сообщением, а их обработку мы ещё не сделали.
В аргументе commands можно указать разное количество команд.
При использовании их всех, бот будет обрабатывать общую для них функцию.
Чтобы расширить функционал бота, необходимо создавать разные декораторы хендлера для обработки отдельных команд.
Не забудь давать индивидуальные названия функциям.
Видим, что при использовании команд получаем ожидаемый результат.
Получение сообщений от пользователя
Для обработки обычных сообщений, необходимо использовать тот же декоратор, только уже с аргументом text.
Также не забывай передавать в качестве аргумента функции параметр message: types.Message.
Пропишем простейшую логику, будем вежливыми и на приветствие ответим приветствием.
Проверим работу скрипта.
Замечательно! Наш бот поздоровался с нами!
В таком исполнении обязательно указывать правильный текст сообщения, соблюдая регистры.
Видим, что когда указали начало слова в верхнем регистре, то бот уже нам ничего не ответил.
Для того чтобы бот обрабатывал не конкретное сообщение, а любое его вхождение, необходимо в хендлере указать параметр text_contains.
Теперь наш хендлер будет обрабатывать любое вхождение слова “дела”.
Обратите внимание, что слово, должно иметь 100% совпадение (такое как регистры букв).
Приоритет обработчиков
Ещё одна немаловажная деталь. Приоритет обработчиков означает, что при получении ботом сообщения, если два хендлера подходят под обработку, то обрабатываться будет сверху вниз, и где будет первое совпадение, тот и обработается!
Заключение
В этой статье познакомились с основными параметрами декоратора message_handler(), но это ещё не всё (в следующих статьях будем знакомиться с новыми возможностями). С помощью использования таких простых приемов можно построить достаточно обширную логику работы бота. Дальше изучим, как бот может отвечать нам стикерами, фотографиями, документами, видео, аудио и многое другое.