Настройка MAX-бота для работы в Yandex Cloud Functions
4 мин.

Настройка 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 запрос

На этом всё. Спасибо за внимание!

Поделиться

Поддержать автора

Комментарии:

Вам может быть интересно:

Хостинг в S3 от Яндекса

Хостинг в S3 от Яндекса

6 мин.

Рассказываю как использовать Yandex Object Storage для хостинга статического сайта...

Запуск сервиса для поиска государственных закупок poiskzakupok.ru

Запуск сервиса для поиска государственных закупок poiskzakupok.ru

6 мин.

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

Идея для стартапа в сфере закупок по 44-ФЗ и 223-ФЗ

Идея для стартапа в сфере закупок по 44-ФЗ и 223-ФЗ

5 мин.

Описание идеи для стартапа в сфере закупок по 44-ФЗ и 223-ФЗ, подробности об MVP и первые результаты...

Добавляем Telegram Widgets в React-приложение

Добавляем Telegram Widgets в React-приложение

4 мин.

Инструкция по добавлению Telegram Widgets в React-приложение с помощью написанного мной npm-пакета react-telegram-widgets...