UNPKG

umbot

Version:

Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф

265 lines (264 loc) 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ViberRequest = void 0; const index_1 = require("../../../index"); const constants_1 = require("../Viber/constants"); const constants_2 = require("./constants"); /** * Базовый URL для всех методов Viber API * */ const API_ENDPOINT = 'https://chatapi.viber.com/pa/'; /** * Класс для взаимодействия с API Viber * Предоставляет методы для отправки сообщений, файлов и других типов контента * @see (https://developers.viber.com/docs/api/rest-bot-api/) Смотри тут */ class ViberRequest { /** * Экземпляр класса для выполнения HTTP-запросов * */ #request; /** * Текст последней возникшей ошибки * */ #error; /** * Токен доступа к Viber API */ token; /** * Контекст приложения. */ #appContext; /** * Создает экземпляр класса для работы с API Viber * Устанавливает токен из конфигурации приложения, если он доступен */ constructor(appContext) { this.#request = new index_1.Request(appContext); this.token = null; this.#error = null; this.#appContext = appContext; if (appContext.appConfig.tokens[constants_1.T_VIBER]?.token) { this.initToken(appContext.appConfig.tokens[constants_1.T_VIBER].token); } this.#request.post = {}; } /** * Инициализирует токен доступа к Viber API * @param token Токен для доступа к API */ initToken(token) { this.token = token; } /** * Отправляет запрос к Viber API * @param method Название метода API * @returns Результат выполнения метода или null при ошибке */ async call(method) { if (this.token) { if (method) { this.#request.header = { ...this.#request.header, 'X-Viber-Auth-Token': this.token, }; this.#request.post ??= {}; this.#request.post.min_api_version = this.#appContext.appConfig.tokens[constants_1.T_VIBER].api_version || 2; const sendData = await this.#request.send(API_ENDPOINT + method); if (sendData.status && sendData.data) { const data = sendData.data; if (data.failed_list?.length) { this.#error = sendData; this.#log(data.status_message); } if (data.status === 0) { return data; } const statusMessage = data.status_message ?? 'ok'; if (statusMessage !== 'ok') { this.#error = sendData; this.#log(data.status_message); } } else { this.#log(sendData.err); } } } else { this.#log((0, constants_2.getErrorToken)(constants_1.T_VIBER, 'call')); } return null; } /** * Получает информацию о пользователе Viber * Запрос можно отправлять не более 2 раз в течение 12 часов для каждого пользователя * @param id Уникальный идентификатор пользователя * @returns Информация о пользователе или null при ошибке * * Возвращаемые данные: * - id: уникальный идентификатор * - name: имя пользователя * - avatar: URL аватара * - country: код страны * - language: язык устройства * - primary_device_os: ОС устройства * - api_version: версия API * - viber_version: версия Viber * - mcc: код страны * - mnc: код сети * - device_type: тип устройства */ getUserDetails(id) { this.#request.post = { id, }; return this.call('get_user_details'); } /** * Отправляет сообщение пользователю * Сообщение можно отправить только после того, как пользователь подпишется на бота * @param receiver ID пользователя Viber * @param sender Информация об отправителе: * - name: имя (до 28 символов) * - avatar: URL аватара (до 100 Кб, 720x720) * @param text Текст сообщения * @param params Дополнительные параметры: * - type: тип сообщения (text, picture, video, file, location, contact, sticker, carousel, url) * - tracking_data: данные для отслеживания * - min_api_version: минимальная версия API * - media: URL контента * - thumbnail: URL превью * - size: размер файла * - duration: длительность видео/аудио * - file_name: имя файла * - contact: контактная информация * - location: координаты * - sticker_id: ID стикера * @returns Результат отправки или null при ошибке */ sendMessage(receiver, sender, text, params = null) { this.#request.post ??= {}; if (!(this.#request.post instanceof FormData)) { this.#request.post.receiver = receiver; if (typeof sender === 'string') { this.#request.post.sender = { name: sender, }; } else { this.#request.post.sender = sender; } this.#request.post.text = text; this.#request.post.type = 'text'; if (params) { this.#request.post = { ...this.#request.post, ...params }; } } return this.call('send_message'); } /** * Устанавливает webhook для получения событий * @param url URL для получения событий * @param params Дополнительные параметры: * - event_types: типы событий * - send_name: отправлять имя * - send_photo: отправлять фото * @returns Результат установки или null при ошибке */ setWebhook(url, params = null) { if (url) { this.#request.post = { url, event_types: [ 'delivered', 'seen', 'failed', 'subscribed', 'unsubscribed', 'conversation_started', ], send_name: true, send_photo: true, }; } else { this.#request.post = { url: '', }; } if (params) { this.#request.post = { ...this.#request.post, ...params }; } return this.call('set_webhook'); } /** * Отправляет карточку с кнопками * @param receiver ID пользователя Viber * @param richMedia Массив кнопок для отображения * @param params Дополнительные параметры: * - tracking_data: данные для отслеживания * - min_api_version: минимальная версия API * - alt_text: альтернативный текст * @returns Результат отправки или null при ошибке */ richMedia(receiver, richMedia, params = null) { this.#request.post = { receiver, type: 'rich_media', rich_media: { Type: 'rich_media', ButtonsGroupColumns: 6, ButtonsGroupRows: richMedia.length, BgColor: '#FFFFFF', Buttons: richMedia, }, }; if (params) { this.#request.post = { ...this.#request.post, ...params }; } return this.call('send_message'); } /** * Отправляет файл * @param receiver ID пользователя Viber * @param file Путь к файлу или его содержимое * @param params Дополнительные параметры: * - tracking_data: данные для отслеживания * - min_api_version: минимальная версия API * - file_name: имя файла * - size: размер файла * @returns Результат отправки или null при ошибке */ sendFile(receiver, file, params = null) { this.#request.post = { receiver, }; if (index_1.Text.isSayText(['http://', 'https://'], file)) { this.#request.post.type = 'file'; this.#request.post.media = file; this.#request.post.size = 10e4; this.#request.post.file_name = index_1.Text.resize(file, 150); if (params) { this.#request.post = { ...this.#request.post, ...params }; } return this.call('send_message'); } return null; } /** * Записывает информацию об ошибках в лог-файл * @param error Текст ошибки для логирования */ #log(error = '') { this.#appContext.logError((0, constants_2.getErrorMsg)(error, 'ViberRequest', this.#request.url), { error: this.#error, }); } } exports.ViberRequest = ViberRequest;