Пишем бота для «Отечественного WeChat» — Max на Python
Недавно VK сделал новый мессенджер - Max - который рекламируют как отечественный аналог WeChat. Пока что он немного сыроват, но в нём видно потенциал. Сегодня мы будем писать бота на Python для этого мессенджера.
Создаём бота
Для создания аккаунтов ботов есть специальный бот - @MasterBot. Переходим в него и нажимаем "Начать"
Дальше пишем /create, чтобы создать нового бота.
MasterBot предложит нам придумать уникальное имя пользователя для бота, которое должно быть больше 11 символов (да, не меньше) и должно заканчиваться на _bot или bot. Я назову своего бота @aiomax_test_bot.
Дальше пишем имя бота, которое будет отображаться в чатах и вверху диалога с ботом. Оно не должно быть уникальным. Я назову своего "Кликер бот"
Бюрократическая часть окончена! Копируем токен бота, который вам прислал MasterBot и переходим в редактор кода.
Скелет бота
Переходим в командную строку и пишем следующее:
В новом Python-файле пишем это:
Библиотека logging нам понадобится для проверки, точно ли бот работает и получать от него вывод. Использовать её необязательно.
Далее нам пригодится ранее скопированный токен бота. Добавляем к коду следующее:
Вместо TOKEN вставляем ваш токен.
default_format="markdown" устанавливает систему разметки Markdown сообщений по умолчанию. Если её не указать тут, то разметку (жирный, курсивный и все другие шрифты) использовать не получится.
В конец вашего файла пишем это:
logging.basicConfig(level=logging.INFO) настраивает логгер для вывода нужной информации, а bot.run() запустит бота при запуске Python-файла.
Скелет готов! Приступаем к созданию самого бота.
Эхо-бот
Очень часто первые написанные боты делают эхо-ботами. И мы не будем исключением. Пишем вот этот код до блока if __name__ == "__main__":
Давайте разберём код.
Декоратор @bot.on_bot_start() запускает функцию ниже него, когда кто-то запускает бота в мессенджере и передаёт функции параметр pd (Payload). У этого pd есть функция send, которая отправляет сообщение в чат тому, кто запустил бота.
Декоратор @bot.on_message() запускает функцию ниже него, когда кто-то отправляет сообщение в любой чат и передает функции параметр message (отправленное сообщение). У message есть функция send, которая отправляет сообщение в тот же чат, в который поступило сообщение, и параметр content, в котором содержится текст сообщения.
Вместо send в await message.send(message.content) можно написать reply - тогда вы не просто отправите сообщение в тот же чат, а ответите на поступившее сообщение.
Полный код бота, которого мы только что написали:
Запускаем Python-файл, пишем боту и видим, что всё работает!
Кликер-бот
А теперь напишем бота с кнопками у сообщений.
Есть глобальный счётчик. При нажатии пользователем на кнопку, этот счётчик будет увеличиваться для всех.
Для начала возьмём старый скелет и добавим туда функции:
Кроме привычного создания бота, его запуска, и декоратора on_bot_start, появилось ещё много нового. Давайте рассмотрим поближе.
kb = aiomax.buttons.KeyboardBuilder() создаёт новую клавиатуру, которую мы будем прикреплять к сообщениям.
button = aiomax.buttons.CallbackButton('Нажми на меня!', 'click') создаёт новую кнопку с текстом "Нажми на меня!" и специальным пейлоадом click, по которому можно проверять, какая именно кнопка нажата.И наконец, kb.add(button) добавляет эту кнопку на нашу клавиатуру.
@bot.on_command('tap') создаёт новую команду с именем "tap".Наш декоратор on_command вызовется тогда, когда пользователь отправит боту /tap.
Вместо message декоратор on_command передаёт нам объект CommandContext, который отличается от Message, но точно также имеет функции send и reply.
Функция после @bot.on_button_callback('click') запускается при нажатии кнопки с указанным ожидаемым пейлоадом. Так как пейлоад у нашей кнопки - click, тут напишем также.Этот декоратор возвращает объект Callback, который уже отличается от прошлых on_command и on_message. В нём есть функция answer - она отвечает на нажатие кнопки определенным действием. В нашем случае мы просто поменяем текст сообщения на новый, который напишем после text=.
Будьте внимательны - если не указать text=, а просто написать строку, то текст сообщения не изменится. Вместо этого пользователю отправится уведомление, которые сейчас отображаются только на iPhone.
Запускаем файл, и видим, что бот работает как нужно!
FSM
Если захотелось, чтобы у каждого пользователя был свой отдельный счётчик, то можно использовать FSM.
Можно сразу заметить, что taps сверху пропало, добавилось from aiomax import fsm и в каждой функции появились конструкции с cursor. Давайте рассмотрим.
Чтобы получить курсор пользователя в почти любом декораторе, в списках аргументов вашей функции можно добавить аргумент cursor - aiomax его увидит и передаст туда курсор. С помощью курсора можно менять состояние и данные определенного пользователя.
taps = cursor.get_data() получает данные, которые хранятся у пользователя в текущий момент.
if not taps: taps = 0 проверяет, хранятся ли какие-либо данные у пользователя - если нет, то сохраняет в переменной 0, дабы избежать ошибок.
cursor.change_data(taps) изменяет текущие хранящиеся данные пользователя на новые - в нашем случае новое количество нажатий.
Заключение
Если вы хотите подробнее ознакомиться с библиотекой aiomax, можете почитать документацию в репозитории проекта.