umbot
    Preparing search index...

    Адаптер, обеспечивающий поддержку платформы Viber. Позволяет разрабатывать чат-ботов для Viber на TypeScript с использованием кросс-платформенного функционала: обработка текстовых запросов, работа с карточками и кнопками.

    Подключение адаптера не требует изменения существующей бизнес-логики: после интеграции все команды и обработчики, написанные для umbot, автоматически становятся доступны для Viber. Единый интерфейс позволяет одновременно использовать одну бизнес-логику для нескольких платформ (Viber, VK, Алиса и др.) без дублирования кода.

    Этот адаптер автоматически обрабатывает входящие вебхуки от мессенджера Viber, преобразует их в унифицированный формат фреймворка и формирует ответ, совместимый с требованиями платформы. Подключается одной строкой и не мешает работе других адаптеров (например, для Алисы или Маруси).

    Поддерживает:

    • текстовые запросы;
    • карточки, кнопки;

    Подключается как любой другой адаптер: bot.use(new ViberAdapter(token)). Несколько адаптеров могут работать одновременно — система сама выберет подходящий на основе заголовков и структуры входящего запроса.

    // Простейший бот для Viber, который отвечает на приветствие
    import { Bot } from 'umbot';
    import { ViberAdapter } from 'umbot/plugins';

    const bot = new Bot()
    .use(new ViberAdapter('YOUR_VIBER_TOKEN'))
    .addCommand('start', ['привет'], (_text, ctx) => {
    ctx.text = 'Привет! Я твой первый бот для Viber';
    });

    bot.start('localhost', 3000);
    • Bot
    • BotController
    • BasePlatform

    Hierarchy (View Summary)

    Index

    Constructors

    Properties

    _platformOptions?: IAdapterOptions
    _token?: string
    appContext?: AppContext<unknown, string | IViberContent>

    Контекст приложения

    isVoice: boolean = false

    Viber — чат-платформа (не голосовая).

    limit: number = 30

    Лимит запросов/сек для входящего rateLimiter (лимит Viber API).

    MAX_TIME_REQUEST: number = 2900

    Максимальное время обработки запроса в миллисекундах: при его превышении в лог записывается ошибка (ответ платформе при этом не модифицируется)

    platformName: string = T_VIBER

    Идентификатор платформы Viber.

    signatureName: string = 'x-viber-content-signature'

    Имя поля в заголовке запроса, по которому можно проверить корректность полученного запроса от платформы.

    supportedEvents: readonly TEventType[] = ...

    Универсальные события Viber (для валидации addEvent).

    WARNING_TIME_REQUEST: number = 2000

    Порог предупреждения в миллисекундах: при его превышении в лог записывается warning

    Methods

    • При превышении допустимого времени обработки запроса логирует информацию. Вызывается вручную в конце getContent() голосовых адаптеров (Alisa, Marusia, SmartApp); адаптеры чат-платформ его не вызывают.

      • >= WARNING_TIME_REQUEST (по умолчанию 2000 мс) — warning в лог.
      • >= MAX_TIME_REQUEST (по умолчанию 2900 мс) — текст ошибки пишется в controller.platformOptions.error (не в лог).

      Пороги вынесены в protected поля — при необходимости переопределите в потомке.

      Parameters

      Returns void

    • API-фасад Viber для controller.api. Методы медиа возвращают warn/null (Bot API Viber принимает медиа только по URL с обязательным size — для медиа используйте controller.card), can() честно возвращает false. Подключается ядром через контракт IPlatformAdapter.

      Parameters

      • controller: BotController

        Контроллер текущего запроса

      Returns IControllerApi | null

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

      Parameters

      • _bot: Bot

        Основной класс приложения

      Returns void | Promise<void>

    • Формирует и отправляет ответ Viber: текст, клавиатуру, карточки (rich media) и звуки; звуки и карточки уходят отдельными вызовами API. На conversation_started приветствие возвращается телом webhook-ответа.

      Parameters

      • controller: BotController

        Контроллер приложения

      Returns Promise<string | Record<string, unknown>>

      Тело ответа для webhook ('ok' либо JSON приветственного сообщения)

    • Формирует пример webhook-запроса Viber (событие message) для локального тестирования (BotTest).

      Parameters

      • query: string

        Текст команды пользователя

      • userId: string

        Идентификатор пользователя (sender.id)

      Returns Record<string, unknown>

      Заготовка запроса в формате webhook Viber

    • Инициализирует адаптер: вызывает базовую инициализацию и переносит опции конструктора (токен, api_version, sender) в конфигурацию платформы.

      Parameters

      • appContext: AppContext

        Контекст приложения (конфиги, токены, логгер)

      Returns void

    • Проверяет полученный запрос от платформы на корректность. Из коробки проверка идет по sha256-hmac и включается только если одновременно заданы:

      • appConfig.tokens[<platformName>].token — секретный ключ
      • this.signatureName — имя http-заголовка с подписью

      Если хотя бы один из этих параметров не задан, метод вернёт true без проверки — это opt-in механизм.

      ⚠️ Важно: не все платформы используют HMAC-SHA256 от тела. Переопределите этот метод в адаптере платформы, если её формат подписи отличается:

      • Telegram — переопределён (использует plain x-telegram-bot-api-secret-token).
      • Viber — умолчание корректно (Viber шлёт x-viber-content-signature как HMAC-SHA256(auth_token, body)).
      • VK — переопределён: сверяет поле secret из тела запроса с secret_key из конфигурации (plain-сравнение через timingSafeEqual, без HMAC).
      • Max — переопределён: сверяет заголовок x-max-bot-api-secret со значением webhook-secret (options.secret / tokens.max_app.webhookSecret).
      • Для платформ без подписи (Alisa, Marusia, SmartApp) проверка пропускается из-за отсутствия signatureName.

      Parameters

      • query: string | IViberContent

        Объект запроса от платформы

      • Optionalheaders: Record<string, unknown>

        HTTP-заголовки запроса

      Returns boolean

      true — запрос валиден / проверка не включена, false — подпись не сошлась или отсутствует.

    • Определяет, что запрос пришёл именно от Viber. Проверяет наличие заголовка x-viber-content-signature или служебных полей event и timestamp. Поле message_token присутствует не во всех событиях (например, conversation_started, subscribed, unsubscribed его не содержат), поэтому оно не требуется для детекции платформы.

      Parameters

      • query: IViberContent

        Распарсенное тело webhook-запроса.

      • Optionalheaders: Record<string, unknown>

        HTTP-заголовки запроса.

      Returns boolean

      true, если запрос является Viber webhook.

    • Проверка подписи включена, когда выполнены оба условия базовой HMAC-схемы: задан секрет платформы и имя заголовка подписи. Платформы, переопределившие isCorrectQuery (Telegram, VK, MAX), переопределяют и этот метод — источник секрета у них другой (webhookSecret / secret_key).

      Используется ядром при старте для предупреждения о вебхуке без защиты.

      Returns boolean

    • Отправка текста пользователю Этот метод используется для активных рассылок — когда голосовой навык или чат-бот инициирует диалог первым (например, уведомление). В методе реализована механика преобразования текстового значения controllerOrText в контроллер, а также базовый механизм для отправки ответа.

      Переопределять данный метод не рекомендуется. Переопределить стоит только в том случае, если по каким-то технических условиям текущая реализация метода вам не подходит.

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

      Parameters

      • userId: string | number

        Ид пользователя, которому нужно отправить сообщение

      • controllerOrText: string | BotController<IUserData, IPlatformData>

        Контроллер приложения или текст. Если необходимо отправить просто текст, можно передать строку, в случае, если необходимо передать картинку звук и тд, то необходимо корректно заполнить контроллер.

      Returns boolean | TContent

      Результат getContent() — ответ в формате платформы (TContent), либо boolean для платформ без рассылки

      // Отправка простого текста
      adapter.send('user123', 'Привет!');

      // Отправка через контроллер (текст + кнопки/карточки)
      const controller = new BaseBotController(appContext);
      controller.text = 'Уведомление';
      adapter.send('user123', controller);
    • Protected

      Заполняет данные о пользователе в NLU. Разбивает полное имя на компоненты (username, first_name, last_name)

      Parameters

      • controller: BotController

        Контроллер приложения

      • userName: string = ''

        Полное имя пользователя

      Returns void

    • Разбирает webhook Viber и заполняет BotController полями userId, userCommand, nlu. Возвращает false при пустом запросе или отсутствующем контексте.

      Parameters

      • query: IViberContent

        Тело webhook-запроса от Viber.

      • controller: BotController

        Контроллер, который нужно заполнить.

      Returns Promise<boolean>

      true — данные заполнены, false — запрос повреждён.

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

      Parameters

      Returns void | Promise<void>