Найти в Дзене
Easy Linux - о Linux просто

Пишем чат-бота для МАX на отечественном Альт линукс

Приветствую, авантюрист. Сразу предвидя кучу сопливых комментаторов, отвечу. Я не пропагандирую и не заставляю никого использовать Max. Мне никто не заплатил за эту статью (к сожалению). Да, я прекрасно осознаю мерзость текущей принудительной политики распространения МАКСА. Но нам все равно придется с ним взаимодействовать. В особенности айтишникам. Поэтому, если ты очередной мамкин ломатель системы, который не способен ни на что, кроме как писать комментарии, то просто пропусти эту статью. А если ты айтишник, который адекватно оценивает текущую ситуацию и понимает неизбежность происходящего или просто хочет прокачать свои скилы, то милости прошу. И да, в МАX можно писать ботов, причем довольно с большой функциональностью, и там есть АПИ и прочие плюшки. Это к слову о тех, кто утверждает, что в МАКСе нет ничего, кроме сообщений, которые через раз доходят. И таких довольно много. Людей, которые даже в глаза не видели продукт, усерясь спорят о его непригодности. Теория Итак, чат-боты по

Приветствую, авантюрист. Сразу предвидя кучу сопливых комментаторов, отвечу. Я не пропагандирую и не заставляю никого использовать Max. Мне никто не заплатил за эту статью (к сожалению). Да, я прекрасно осознаю мерзость текущей принудительной политики распространения МАКСА. Но нам все равно придется с ним взаимодействовать. В особенности айтишникам. Поэтому, если ты очередной мамкин ломатель системы, который не способен ни на что, кроме как писать комментарии, то просто пропусти эту статью. А если ты айтишник, который адекватно оценивает текущую ситуацию и понимает неизбежность происходящего или просто хочет прокачать свои скилы, то милости прошу.

И да, в МАX можно писать ботов, причем довольно с большой функциональностью, и там есть АПИ и прочие плюшки. Это к слову о тех, кто утверждает, что в МАКСе нет ничего, кроме сообщений, которые через раз доходят. И таких довольно много. Людей, которые даже в глаза не видели продукт, усерясь спорят о его непригодности.

Теория

Итак, чат-боты появились довольно давно в мессенджере «Телеграм» или даже раньше. Чат-бот — это чат, на другой стороне которого находится не собеседник-человек, а собеседник-программа. Программа обрабатывает ваши сообщения и выдает вам в ответ свои сообщения. По сути, изобрели терминал только в мессенджере. ) Весь ввод-вывод исключительно текстовый. Чат-бот работает через токены. Регистрируя бота в системе (МАКС, «Телеграм» — не важно), она выдаст тебе токен, который ты будешь использовать в своем боте. Именно по этому токену и будет происходить коммуникация между системой и чат-ботом.

Регистрация чат-бота

Для регистрации бота нам нужно попасть в МАКС для бизнеса. Для этого переходим по ссылке https://business.max.ru/

Сразу стоит оговориться, что прямо на сайте написано.

А это значит, что если делаешь бота или канал для своей частной организации, то надо еще почитать, где, как и куда тебе надо зарегистрироваться. Тут я не подскажу, но, думаю, несложно, и информации в сети куча. Мы же работаем как школа, а школы и ВУЗы уже имеют возможность создавать каналы и чат-ботов. В этом плане нам легче.

МАX для бизнеса
МАX для бизнеса

Жмем «Войти в MAX для бизнеса». Нам предлагают авторизоваться. Если частная организация, то просто авторизуемся. А если школа, то, чтобы сработала магия и тебе дали доступ, тут надо зайти за пользователя, который является администратором организации на «Госуслугах». По крайней мере, в теории.

Авторизация в MAX бизнес
Авторизация в MAX бизнес

Дальше просто жмём «Создать бота», заполняем необходимые поля, такие как название, имя ссылки и т. д. После заполнения твой бот отправится на модерацию. Написано до 24 часов.

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

Панель настройки чат-бота и каналов в MAX
Панель настройки чат-бота и каналов в MAX

Жмем в окошке чат-бота «настроить» и там видим наш заветный токен.

Токен для чат-бота MAX
Токен для чат-бота MAX

На этом регистрация окончена. Токен у нас есть.

Подготовка среды

Итак, у нас есть некая документация для создания бота, ознакомиться можно с ней вот тут https://dev.max.ru/docs

Из этой же документации мы видим, что писать код мы можем только на JavaScript или на (прости господи) Golang. Библиотек для работы с МАКСом на других языках пока нет. Но, думаю, появится хотя бы на Python. Писать мы будем под Альт Линукс, а значит, JavaScript нам не подойдет, так как nodejs в официальных репозиториях только версии 16, а требуется не ниже 18. Возиться и устанавливать новый nodejs мне было лень, а значит, будем делать на GO. Сразу обозначу свое отношение к этому языку — мерзостный язык. Не понимаю и не разделяю восторгов его фанатов. Хотя опыта у меня с ним немного. Возможно, не до конца вкусил.

Ну что ж, меньше слов, погнали. Ставим компилятор и прочую нечисть языка GO

# apt-get insstall golang -y

Далее создадим каталог для бота

$ mkdir max_bot && cd max_bot

Теперь инициируем проект

$ go mod init first-max-bot

Далее установи библиотеку для работы с MAX API на golang

$ go get github.com/max-messenger/max-bot-api-client-go

Подготовка выполнена, теперь в каталоге нужно создать файл нашего бота

$ touch bot.go

В нем мы и будем писать наш код. Кстати, к документации, которую я привел выше, если ты тоже решил писать на GO, советую также ознакомиться с гихабом вот тут https://github.com/max-messenger/max-bot-api-client-go/tree/main/docs . Там есть хорошие примеры.

Написание кода

Разберем пример из документации. Первым делом мы подключаем всякие нужные штуки

import (
"context"
"fmt"
"os"
"os/signal"
"syscall"

maxbot "github.com/max-messenger/max-bot-api-client-go"
"github.com/max-messenger/max-bot-api-client-go/schemes"

)

Затем создаем главную функцию нашего модуля

func main() {

ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, os.Interrupt)

defer stop()

api, _ := maxbot.New(os.Getenv("TOKEN"))

// Some methods demo:
info, err := api.Bots.GetBot(ctx)
fmt.Printf("Get me: %#v %#v", info, err)


for upd := range api.GetUpdates(ctx) { // Чтение из канала с обновлениями
switch upd := upd.(type) { // Определение типа пришедшего обновления
case *schemes.MessageCreatedUpdate:
// Отправка сообщения
message := maxbot.NewMessage().
SetChat(upd.Message.Recipient.ChatId).
SetText("Hello from Bot")

api.Messages.Send(ctx, message)

}
}

}

Вот тут мы прописываем наш токен

api, _ := maxbot.New(os.Getenv("TOKEN"))

В примере советуют брать его из переменной среды окружения, что верно, но я поступлю проще и просто впишу его строкой

api, _ := maxbot.New(«ТУТ Я ВСТАВЛЯЮ МОЙ ТОКЕН»)

Следующий код

fmt.Printf("Get me: %#v %#v", info, err)

Выводит некую информацию о боте. Она нужна для нас самих. Оставим ее, мало ли пригодится.

for upd := range api.GetUpdates(ctx) — это начало нашего цикла обработки сообщений. Он работает бесконечно.

А эти строчки отправляют сообщения в чат

message := maxbot.NewMessage().

SetChat(upd.Message.Recipient.ChatId).
SetText("Hello from Bot")

api.Messages.Send(ctx, message)

Данный бот будет просто отвечать на каждое сообщение от собеседника фразой «Hello from Bot».

Если ты хочешь получить сообщение, то используй следующий код

msg := upd.Message.Body.Text

На самом деле этого более чем достаточно, чтобы уже делать полноценного бота. Ты можешь получить, что тебе написал собеседник, и отправить ему нужную информацию. К примеру, если собеседник отправит сообщение «помощь», выведем ему некую подсказку. Сделать это можно так.

msg := upd.Message.Body.Text

if msg == «помощь» {

message := maxbot.NewMessage().

SetChat(upd.Message.Recipient.ChatId).

SetText("Это помощь: наш бот может то-то и так-то, а для вот этого напишите то-то")

api.Messages.Send(ctx, message)

}

Итог

Как видишь, написать простейшего бота не сложно. В качестве реально рабочего бота я реализовал простейший функционал: собеседник отправляет класс, например 6а, бот в ответ выдает ему расписание для данного класса.

Так как наше расписание хранится в базе данных, то подключиться боту к базе и выбрать оттуда нужные данные не составило труда. Работа с базами данных на языке GO, естественно, есть.

-6

Вот так это работает. Как и сказал, функционал простейший, но на самом деле чертовски полезный. Дальше можно развивать. Например, сделать указание даты или вывод времени и т. д. Боты в МАКСЕ умеют и меню, и кнопки, и другие штуки, но об этом уже в следующих статьях.

А пока. Удачи. Авантюрист.