umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
265 lines (264 loc) • 10.4 kB
JavaScript
"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;