
Алексей Баранов
Настройка MAX-бота для работы в Yandex Cloud Functions
В этой статье расскажем о том, как легко и быстро настроить MAX-бота для работы в serverless-окружении Yandex Cloud Functions.
Зачем нужна эта статья?
MAX-боты умееют получать события от платформы несколькими способами:
- В режиме ожидания запросов от сервера (long-polling);
- В режиме получения событий через webhook;
В документации к официальной typescript библиотеке для создания MAX-ботов есть примеры запуска ботов в режиме ожидания запросов. В котором бот подключается к серверам MAX и ждёт события обновления. Как только сервер присылает обновление, бот обрабатывает его.
К сожалению такой режим работы не подходит для serverless окружений, а примеров запуска бота через получение событий по вебхуку, на момент написания этой статьи, в документации не нашлось.
В этой статье я постараемся исправить этот недочёт.
Решение для тех кто торопится
Для тех кто спешит и умеет настраивать бота для работы с webhook, сразу публикуем базовое готовое решение:
import { Update } from '@maxhub/max-bot-api/dist/core/network/api';
import { Bot, Context } from '@maxhub/max-bot-api';
export async function handler(event: YandexCloudFunctionEvent) {
if (event.body) {
if (typeof event.body === 'string' && event.body.length > 0) {
try {
// Парсим тело запроса
const update: Update = JSON.parse(event.body) as Update;
// Создаём бота
const bot = await createBot();
// Ниже то, для чего нужна эта статья
const ctx = new Context(update, bot.api, bot.botInfo);
await bot.middleware()(ctx, () => Promise.resolve(undefined));
return { statusCode: 200, body: 'ok' };
} catch (error) {
return { statusCode: 500, body: 'error' };
}
}
}
return { statusCode: 200, body: 'ok' };
}
export const createBot = async () => {
// В данном примере токен для бота хранится в переменной окружения
const token = process.env.MAX_BOT_TOKEN;
if (!token) {
throw new Error('MAX_BOT_TOKEN не найден');
}
const bot = new Bot(token);
// Тут описываете вашу логика работы бота
return bot;
}
Разбор решения
Не буду долго и подробно расписывать как мы его нашли, но тем не менее отмечу пару важных моментов:
Мы искали что-то похожее на
bot.handleUpdate(update)
из grammY, библиотеки для Telegram-ботов.
И действительно, такой метод у класса Bot есть, но он приватный и не доступен для вызова.
Тут наверное можно было бы кастануть Bot к нужному мне типу с не приватным handleUpdate, но мы решили чуть-чуть покопать и изучить код библиотеки.
В итоге поняли что можно вызвать middleware(), предварительно добавив событие Update в контекст бота.
Подписка функции на получение событий
Для того чтобы подписать облачную функцию на обработку событий нужно:
- Знать публичный url для вызова функции (можно посмотреть в настройках функции в консоли управления Yandex Cloud);
- Отправить API запрос
На этом всё. Спасибо за внимание!

