maxbot
Rust-библиотека для создания ботов на платформе MAX
API: https://dev.max.ru/docs-api
Библиотека предоставляет удобный, асинхронный и типобезопасный интерфейс ко всем методам API MAX: отправка сообщений (с разбиением длинного текста), загрузка файлов, управление чатами и участниками, inline-клавиатуры, обработка callback-запросов, webhook/long polling и многое другое.
Важно: API MAX доступен только для российских юридических лиц и индивидуальных предпринимателей. Для получения токена бота обратитесь к документации MAX https://business.max.ru/self.
📦 Установка
Добавьте в Cargo.toml:
[]
= "0.1"
= { = "1", = ["full"] }
🚀 Быстрый старт
1. Создайте клиент
use MaxClient;
let token = var.expect;
let client = new;
Перед началом работы убедитесь, что бот активен и токен корректен.
let me = client.get_me.await?;
println!;
2. Узнайте идентификатор своей группы (chat_id)
Для отправки сообщений в группу необходимо знать её числовой идентификатор chat_id.
Алгоритм:
- Создайте группу в MAX (через приложение или веб-интерфейс).
- Добавьте бота в эту группу.
- Запросите список чатов, в которых участвует бот, и найдите нужный по полю
title.
// Получаем первые 10 чатов (можно увеличить count)
let = client.get_chats.await?;
for chat in chats
Вы увидите список групп, где присутствует бот. Найдите нужную по заголовку (title) и запомните chat_id.
Это число нужно будет подставлять в параметры chat_id при вызове SendMessageParamsBuilder::new().chat_id(...).
3. Отправьте простое сообщение через построитель
use ;
let mids = client.send_message_builder.await?;
println!;
4. Отправьте сообщение с inline-клавиатурой и обработайте нажатие
use ;
// Отправка сообщения с клавиатурой
let keyboard = new
.button
.button
.build;
let mids = client.send_message_builder.await?;
// Ожидание callback
let params = GetUpdatesParams ;
let = client.get_updates.await?;
for update in updates
5. Отправка файла (изображения, видео, аудио, документа)
use ;
let builder = new
.text
.chat_id
.attachment;
client.send_message_builder.await?;
🔒 Проксирование запросов через nginx (безопасное хранение токенов)
По умолчанию библиотека обращается напрямую к API MAX (https://platform-api.max.ru), и токен бота передаётся в заголовке Authorization каждого запроса. Это означает, что любой разработчик, имеющий доступ к исходному коду или переменным окружения, может увидеть токен.
Проблема: Токен бота — секретная информация. Если вы не хотите раскрывать его всем разработчикам или хранить в файлах конфигурации, можно развернуть собственный прокси-сервер (например, на базе nginx), который будет:
- Принимать запросы от ботов с базовой HTTP-аутентификацией (логин/пароль).
- Подменять заголовок
Authorizationна реальный токен бота MAX. - Проксировать запросы к API MAX.
Преимущества:
- Разработчики работают только со своим личным логином/паролем, не зная токен бота.
- При увольнении сотрудника или при завершении им работы над проектом достаточно удалить его учётную запись на прокси-сервере.
- Токен бота хранится только на сервере с nginx.
Пример настройки nginx
Предположим, вы хотите использовать домен https://max.my-russian-company.ru как прокси.
- Добавьте пользователей в файл
.htpasswd:
- Создайте конфигурацию nginx (например,
/etc/nginx/sites-available/max-proxy):
# Соответствие имён пользователей из .htpasswd токенам бота
map $remote_user $backend_token {
default "";
"ivanov.i" "реальный_токен_бота_1";
"petrov.p" "реальный_токен_бота_2";
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name max.my-russian-company.ru;
ssl_certificate /etc/letsencrypt/live/my-russian-company.ru-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-russian-company.ru-0001/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
auth_basic "Restricted access";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass https://platform-api.max.ru;
proxy_ssl_verify off;
proxy_set_header Host platform-api.max.ru;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Authorization "$backend_token";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
- Активируйте конфигурацию и перезапустите nginx:
Использование в коде
В вашем приложении нужно указать библиотеке использовать собственный базовый URL (адрес вашего прокси-сервера) и передавать логин/пароль через стандартный заголовок Authorization: Basic .... Библиотека maxbot позволяет это сделать:
use ;
// 1. Устанавливаем глобальный базовый URL (все клиенты будут использовать прокси)
set_global_base_url;
// 2. Создаём клиент с токеном базовой авторизации HTML
let client = new;
// 3. Все дальнейшие вызовы автоматически используют прокси.
let me = client.get_me.await?;
Важно: В этом режиме токен бота нигде в коде не фигурирует — он остаётся только на сервере nginx. Разработчики используют свои личные учётные данные.
Если вам нужно переопределить базовый URL только для конкретного клиента, используйте метод set_base_url:
let mut client = new;
client.set_base_url;
📚 Полная документация API
Все методы сгруппированы в impl MaxClient:
| Модуль | Методы |
|---|---|
| bot | get_me() – информация о боте |
| chats | get_chat, get_chats, update_chat, delete_chat, leave_chat, get_chat_members, get_chat_admins, add_chat_admin, remove_chat_admin, add_chat_members, remove_chat_member, get_bot_member, send_chat_action, get_pinned_message, pin_message, unpin_message |
| messages | send_message (и send_message_builder), forward_message, delete_message, delete_messages, get_messages, edit_message |
| videos | get_video_info, download_video |
| uploads | upload_file – загрузка файла и получение токена |
| updates | get_updates, answer_callback_query |
| subscriptions | get_subscriptions, create_subscription, delete_subscription |
Все методы асинхронны, используют reqwest и автоматически соблюдают лимит 30 запросов в секунду (rate limiting). Длинные тексты разбиваются на фрагменты до 4000 символов с сохранением целостности слов и предложений.
🧪 Примеры
Полные примеры в папке examples/:
check_bot.rs– проверка работоспособности бота (выводитtrueилиfalse)me_demo.rs– информация о ботеget_chats_demo.rs– получение списка чатов и их идентификаторовget_chat_demo.rs– получение информации о групповом чатеupdate_chat_demo.rs– изменение информации о групповом чате (название, иконка, закрепление сообщения)delete_chat_demo.rs– удаление группового чата (с обработкой ошибок)leave_chat_demo.rs– выход бота из чата (с фиктивным ID и обработкой ошибки)get_bot_member_demo.rs– информация о членстве бота в групповом чате (права, дата вступления и т.д.)get_messages_demo.rs– получение истории сообщений чата (если доступно)send_text_demo.rs– отправка простого текстаsend_long_text_demo.rs– разбиение длинного текстаsend_picture_demo.rs– отправка изображенияsend_picture_only_demo.rs– отправка изображения без текстаsend_video_demo.rs– отправка видеоsend_audio_demo.rs– отправка аудиоsend_file_any_demo.rs– отправка произвольного файлаupload_file_demo.rs– предварительная загрузка файла и использование токенаget_video_info_demo.rs– получение метаданных видеоsend_inline_keyboard_demo.rs– сообщение с клавиатуройcombined_attachments_demo.rs– все типы вложений (стикер, контакт, гео, ссылка, клавиатура)send_chat_actions_demo.rs– демонстрация отправки действий бота (набор текста, отправка медиа и т.д.)get_chat_admins_demo.rs– получение списка администраторов чата с правамиpin_message_demo.rs– закрепление и открепление сообщенияforward_demo.rs– пересылка сообщенияdelete_messages_demo.rs– отправка и удалениеedit_message_demo.rs– редактирование сообщенияfull_demo.rs– комплексная демонстрация большинства возможностейstress_test.rs– стресс-тест ограничения RPS (отправка сообщений до ошибки 429)
Запуск примера:
✅ Что уже реализовано
- Базовая HTTP-обёртка с rate limiting (30 RPS)
- Получение информации о боте (
/me) - Управление чатами: получение, обновление (название, иконка, закрепление, уведомления), удаление, выход
- Управление участниками и администраторами
- Отправка сообщений (текст, markdown, html, reply)
- Разбиение длинного текста на фрагменты (сохранение целостности слов/предложений)
- Отправка файлов (изображения, видео, аудио, документы)
- Предварительная загрузка файлов и повторное использование токенов
- Получение информации о видео (
/videos/{token}) - Пересылка сообщений
- Удаление сообщений (одиночное и массовое)
- Получение истории сообщений чата (
/messages) - Редактирование сообщений
- Закрепление/открепление сообщений
- Отправка действий бота в чате (typing_on, sending_photo, ...)
- Управление участниками и администраторами (получение, добавление, удаление)
- Long polling (
/updates) - Ответ на callback-запросы (inline-кнопки) – замена сообщения и уведомления
- Webhook-подписки (создание, удаление, список)
- Удобные Builder'ы для параметров сообщений и клавиатур
- Поддержка всех типов вложений: стикеры, контакты, геолокация, share
📄 Лицензия
Проект распространяется под лицензией MIT.
🤝 Вклад
Принимаются pull request'ы. Для крупных изменений сначала откройте issue для обсуждения.