Не прошло и недели с момента выхода нового мессенджера MAX от VK, а мы сейчас сделаем для него своего первого бота.
ШАГ 1. Регистрируем своего бота и получаем для него токен.
Похоже на ТГ. Пишем в поиске "MasterBot", должны увидеть в результатах официальный бот masterbot
Выбираем команду /create, вводим имя бота по правилам (должно заканчиваться на bot). Если такой бот есть, то вас попросят ввести имя и потом покажут сообщение с токеном бота
ШАГ 2. Устанавливаем maxgram
На момент написания официальная библиотека от разработчиков - только под JS. А для Python нам понадобится опенсорсная библиотека 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