Конструктор базового адаптера платформы.
OptionalplatformToken: stringТокен платформы (опционально)
OptionaladditionalPlatformOptions: IAdapterOptionsДополнительные опции платформы (опционально)
Protected Optional_platformOptionsProtected Optional_tokenOptionalappContextКонтекст приложения
Viber — чат-платформа (не голосовая).
Лимит запросов/сек для входящего rateLimiter (лимит Viber API).
ProtectedMAX_TIME_REQUESTМаксимальное время обработки запроса в миллисекундах: при его превышении в лог записывается ошибка (ответ платформе при этом не модифицируется)
Идентификатор платформы Viber.
Имя поля в заголовке запроса, по которому можно проверить корректность полученного запроса от платформы.
Универсальные события Viber (для валидации addEvent).
ProtectedWARNING_TIME_REQUESTПорог предупреждения в миллисекундах: при его превышении в лог записывается warning
Protected_initTTSProtectedИнициализирует TTS (Text-to-Speech) в контроллере. Обрабатывает звуки и стандартные звуковые эффекты
Контроллер приложения
Protected_timeLimitLogПри превышении допустимого времени обработки запроса логирует информацию.
Вызывается вручную в конце getContent() голосовых адаптеров (Alisa, Marusia, SmartApp);
адаптеры чат-платформ его не вызывают.
>= WARNING_TIME_REQUEST (по умолчанию 2000 мс) — warning в лог.>= MAX_TIME_REQUEST (по умолчанию 2900 мс) — текст ошибки пишется
в controller.platformOptions.error (не в лог).Пороги вынесены в protected поля — при необходимости переопределите в потомке.
API-фасад Viber для controller.api. Методы медиа возвращают warn/null
(Bot API Viber принимает медиа только по URL с обязательным size — для
медиа используйте controller.card), can() честно возвращает false.
Подключается ядром через контракт IPlatformAdapter.
Контроллер текущего запроса
Метод, который вызывается при уничтожении плагина. В данном методе можно добавить отписку, либо выполнить другие действия.
Основной класс приложения
Формирует и отправляет ответ Viber: текст, клавиатуру, карточки
(rich media) и звуки; звуки и карточки уходят отдельными вызовами API.
На conversation_started приветствие возвращается телом webhook-ответа.
Контроллер приложения
Тело ответа для webhook ('ok' либо JSON приветственного сообщения)
Получает данные из локального хранилища платформы.
контроллер приложения
данные, сохранённые ранее
Получает время выполнения запроса в миллисекундах
Время выполнения запроса
Формирует пример webhook-запроса Viber (событие message) для локального тестирования (BotTest).
Текст команды пользователя
Идентификатор пользователя (sender.id)
Заготовка запроса в формате webhook Viber
Формирует ответ на запрос оценки (по умолчанию — обычный ответ getContent; спец-формат — например, SmartApp).
контроллер приложения
Инициализирует адаптер: вызывает базовую инициализацию и переносит опции конструктора (токен, api_version, sender) в конфигурацию платформы.
Контекст приложения (конфиги, токены, логгер)
Проверяет полученный запрос от платформы на корректность. Из коробки проверка идет по sha256-hmac и включается только если одновременно заданы:
appConfig.tokens[<platformName>].token — секретный ключthis.signatureName — имя http-заголовка с подписьюЕсли хотя бы один из этих параметров не задан, метод вернёт true без проверки — это opt-in механизм.
⚠️ Важно: не все платформы используют HMAC-SHA256 от тела. Переопределите этот метод в адаптере платформы, если её формат подписи отличается:
x-telegram-bot-api-secret-token).x-viber-content-signature как HMAC-SHA256(auth_token, body)).secret из тела запроса с secret_key из конфигурации
(plain-сравнение через timingSafeEqual, без HMAC).x-max-bot-api-secret со значением webhook-secret
(options.secret / tokens.max_app.webhookSecret).signatureName.Объект запроса от платформы
Optionalheaders: Record<string, unknown>HTTP-заголовки запроса
true — запрос валиден / проверка не включена, false — подпись не сошлась или отсутствует.
Указывает, поддерживает ли платформа локальное хранилище.
контроллер приложения
true, если локальное хранилище доступно
Определяет, что запрос пришёл именно от Viber.
Проверяет наличие заголовка x-viber-content-signature или
служебных полей event и timestamp.
Поле message_token присутствует не во всех событиях
(например, conversation_started, subscribed, unsubscribed
его не содержат), поэтому оно не требуется для детекции платформы.
Распарсенное тело webhook-запроса.
Optionalheaders: Record<string, unknown>HTTP-заголовки запроса.
true, если запрос является Viber webhook.
Проверка подписи включена, когда выполнены оба условия базовой HMAC-схемы:
задан секрет платформы и имя заголовка подписи. Платформы, переопределившие
isCorrectQuery (Telegram, VK, MAX), переопределяют и этот метод —
источник секрета у них другой (webhookSecret / secret_key).
Используется ядром при старте для предупреждения о вебхуке без защиты.
Отправка текста пользователю
Этот метод используется для активных рассылок — когда голосовой навык или чат-бот инициирует диалог первым (например, уведомление).
В методе реализована механика преобразования текстового значения controllerOrText в контроллер, а также базовый механизм для отправки ответа.
Переопределять данный метод не рекомендуется. Переопределить стоит только в том случае, если по каким-то технических условиям текущая реализация метода вам не подходит.
Если платформа не поддерживает возможность начать диалог самостоятельно, то можно оставить метод пустым, либо вывести любую заглушку.
Ид пользователя, которому нужно отправить сообщение
Контроллер приложения или текст. Если необходимо отправить просто текст, можно передать строку, в случае, если необходимо передать картинку звук и тд, то необходимо корректно заполнить контроллер.
Результат getContent() — ответ в формате платформы (TContent), либо boolean для платформ без рассылки
Сохраняет данные в локальное хранилище платформы.
данные для сохранения
контроллер приложения
ProtectedsetNluProtectedЗаполняет данные о пользователе в NLU. Разбивает полное имя на компоненты (username, first_name, last_name)
Контроллер приложения
Полное имя пользователя
Разбирает webhook Viber и заполняет BotController полями userId, userCommand, nlu.
Возвращает false при пустом запросе или отсутствующем контексте.
Тело webhook-запроса от Viber.
Контроллер, который нужно заполнить.
true — данные заполнены, false — запрос повреждён.
Дополнительная обработка для звуков. В данном методе стоит реализовать логику, с помощью которой будут наложены дополнительные эффекты для озвучивания текста пользователю
Контроллер бота
Публичная точка входа для сброса времени начала обработки запроса. Вызывайте перед началом бизнес-логики, чтобы метрики (см. getProcessingTime) считались отсюда.
StaticisVoiceМетод-флаг: указывает, что платформа голосовая (например, Алиса, Маруся).
Адаптер, обеспечивающий поддержку платформы Viber. Позволяет разрабатывать чат-ботов для Viber на TypeScript с использованием кросс-платформенного функционала: обработка текстовых запросов, работа с карточками и кнопками.
Подключение адаптера не требует изменения существующей бизнес-логики: после интеграции все команды и обработчики, написанные для umbot, автоматически становятся доступны для Viber. Единый интерфейс позволяет одновременно использовать одну бизнес-логику для нескольких платформ (Viber, VK, Алиса и др.) без дублирования кода.
Этот адаптер автоматически обрабатывает входящие вебхуки от мессенджера Viber, преобразует их в унифицированный формат фреймворка и формирует ответ, совместимый с требованиями платформы. Подключается одной строкой и не мешает работе других адаптеров (например, для Алисы или Маруси).
Поддерживает:
Подключается как любой другой адаптер:
bot.use(new ViberAdapter(token)). Несколько адаптеров могут работать одновременно — система сама выберет подходящий на основе заголовков и структуры входящего запроса.Example
See