5

Делаем первого бота для нового мессенджера MAX на Python

Не прошло и недели с момента выхода нового мессенджера MAX от VK, а мы сейчас сделаем для него своего первого бота.


ШАГ 1. Регистрируем своего бота и получаем для него токен.

Похоже на ТГ. Пишем в поиске "MasterBot", должны увидеть в результатах официальный бот masterbot

Выбираем команду /create, вводим имя бота по правилам (должно заканчиваться на bot). Если такой бот есть, то вас попросят ввести имя и потом покажут сообщение с токеном бота


ШАГ 2. Устанавливаем maxgram

На момент написания официальная библиотека от разработчиков - только под JS. А для Python нам понадобится опенсорсная библиотека maxgram.

pip install maxgram

Библиотека пока совсем новая, но поддерживает уже прием и отправку сообщений, установку подсказок и кнопки бота.


ШАГ 3. Делаем эхо-бота, играющего в пинг-понг

Он будет обрабатывать команды и повторять сообщения пользователя

Создаем файл, например, bot.py - работаем дальше в нем. Импортируем в него класс Bot, инициализируем бота и устанавливаем подсказки для команд бота - они всплывут, если ввести слэш (работает на мобильном клиенте)

from maxgram import Bot

bot = Bot("YOUR_BOT_TOKEN")

# Установка подсказок для команд бота

bot.set_my_commands({

"help": "Получить помощь",

"ping": "Проверка работы бота",

"hello": "Приветствие"

})

Вместо YOUR_BOT_TOKEN используйте полученный ранее токен.

⚠️ Правильнее не хранить его так в коде, конечно, а использовать файл .env, но в статье показываю только основы по самому боту.

Дальше добавляем обработчики на событие присоединения к боту bot.on("bot_started") и на обработку сообщения @bot.hears("ping"), чтобы бот отвечал pong на ping

# Обработчик события запуска бота

@bot.on("bot_started")

def on_start(context):

context.reply("Привет! Скажи что-нибудь и я повторю это!")

# Обработчик для сообщения с текстом 'ping'

@bot.hears("ping")

def ping_handler(context):

context.reply("pong")

Теперь научимся повторять сообщения пользователя. Добавляем обработчик @bot.on("message_created")

# Обработчик для всех остальных входящих сообщений

@bot.on("message_created")

def echo(context):

# Проверяем, что есть сообщение и тело сообщения

if context.message and context.message.get("body") and "text" in context.message["body"]:

# Получаем текст сообщения

text = context.message["body"]["text"]

# Проверяем, что это не команда и не специальные сообщения с обработчиками

if not text.startswith("/") and text != "ping":

context.reply(text)

Наконец, добавляем блок запуска бота

# Запуск бота

if __name__ == "__main__":

try:

bot.run()

except KeyboardInterrupt:

bot.stop()

Теперь, если вы запустите получившийся python файл (python bot.py в нашем случае), то ваш бот должен уметь повторять за пользователем и играть в пинг-понг


ШАГ 4. Добавляем кнопки

Для этого импортируем из библиотеки класс клавиатуры и создаем нужные нам кнопки

from maxgram.keyboards import InlineKeyboard

# Создание клавиатуры

main_keyboard = InlineKeyboard(

[

{"text": "Отправить новое сообщение", "callback": "button1"},

],

[

{"text": "Изменить сообщение", "callback": "button2"},

{"text": "Показать Назад", "callback": "button3"}

],

[

{"text": "Открыть ссылку", "url": "https://pypi.org/project/maxgram/"}

]

)

Принцип такой: каждый список - это одна строка кнопок. Один словарь внутри списка - одна кнопка. Если несколько словарей добавить внутрь списка, то будет несколько кнопок равной ширины в одной строке. Сейчас посмотрим, как это выглядит.

Пусть клавиатура будет показываться при отправке команды /keyboard - добавляем обработчик

# Отправить клавиатуру по команде '/keyboard'

@bot.command("keyboard")

def keyboard_command(context):

context.reply(

"Вот клавиатура. Выбери одну из опций:",

keyboard=main_keyboard

)

Если запустить сейчас бота и отправить команду /keyboard, то увидите примерно следующее

Но нужно еще обрабатывать нажатия на сами кнопки


ШАГ 5. Обрабатываем нажатия на кнопки

Используем @bot.on("message_callback"). Уникальные названия кнопок (которые выше задавали, как button1, button2, button3) принимаем в обработчике из context.payload, а отвечаем на нажатия с помощью context.reply_callback()

# Обработчик нажатий на кнопки

@bot.on("message_callback")

def handle_callback(context):

button = context.payload

if button == "button1":

context.reply_callback("Вы отправили новое сообщение")

elif button == "button2":

context.reply_callback("Вы изменили текущее сообщение", is_current=True)

elif button == "button3":

context.reply_callback("Вы изменили текущее сообщение с новой клавиатурой",

keyboard=InlineKeyboard(

[{"text": "Вернуться к меню", "callback": "back_to_menu"}]

),

is_current=True)

elif button == "back_to_menu":

context.reply_callback(

"Вернемся к основному меню",

keyboard=main_keyboard,

is_current=True

)

При этом специальный параметр is_current = True задает, чтобы новое сообщение показывалось путем редактирования текущего, а не через отправку нового.


Первая часть завершена. Если будет интерес, то в следующих частях сделаем того самого AI-ассистента, который показан в начале гайда на видео.

Кстати, потестить ИИ-ассистента на MAX можно прямо сейчас по ссылке - max.ru/AssistantsBot

Это обычный бесплатный чат-бот с ИИ. Но первый на MAX! Или один из первых.

Пишу о своих разработках и о том, как делаю стартап, в ТГ-канале t.me/it_sabat

Лига программистов

2.1K постов11.9K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества