1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-31 03:10:45 +02:00
This commit is contained in:
Anton Titovets 2024-03-14 15:32:11 +03:00
commit 61bd8a3e66
15 changed files with 9469 additions and 8970 deletions

View File

@ -11,6 +11,9 @@ jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v2
@ -19,4 +22,7 @@ jobs:
version: 1.3.0 # Требуемая версия OneScript
- name: Выполнить скрипт
run: oscript ./.github/workflows/convert.os
run: oscript ./.github/workflows/convert.os
- uses: stefanzweifel/git-auto-commit-action@v5

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,324 @@
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область РаботаСФайлами
// Получить информацию об объекте.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор файла/каталога
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Получить список каталогов.
//
// Параметры:
// Токен - Строка - Токен
// ИмяСодержит - Строка - Отбор по имени
// Подробно - Булево - Добавляет список файлов к полям каталога
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий каталогов
Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
МассивОбъектов = Новый Массив;
Отбор = Новый Массив;
Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'");
Если ЗначениеЗаполнено(ИмяСодержит) Тогда
Отбор.Добавить("name contains '" + ИмяСодержит + "'");
КонецЕсли;
ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор);
Если Подробно Тогда
РазложитьОбъектыПодробно(Токен, МассивОбъектов);
КонецЕсли;
Возврат МассивОбъектов;
КонецФункции
// Получить список файлов.
//
// Параметры:
// Токен - Строка - Токен
// ИмяСодержит - Строка - Отбор по имени
// Каталог - Строка - Отбор по ID каталога-родителя
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий файорв
Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
МассивОбъектов = Новый Массив;
Отбор = Новый Массив;
Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'");
Если ЗначениеЗаполнено(ИмяСодержит) Тогда
Отбор.Добавить("name contains '" + ИмяСодержит + "'");
КонецЕсли;
Если ЗначениеЗаполнено(Каталог) Тогда
Отбор.Добавить("'" + Каталог + "' in parents");
КонецЕсли;
ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор);
Возврат МассивОбъектов;
КонецФункции
// Загрузить файл.
//
// Параметры:
// Токен - Строка - Токен
// Файл - ДвоичныеДанные,Строка - Файл или путь к файлу
// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт
MIME = Описание["MIME"];
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
Если ТипЗнч(Файл) <> Тип("ДвоичныеДанные") Тогда
Файл = Новый ДвоичныеДанные(Файл);
КонецЕсли;
СоответствиеФайла = Новый Соответствие;
СоответствиеФайла.Вставить(Файл, MIME);
СформироватьПараметрыЗагрузкиФайла(Описание);
Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
Возврат Ответ;
КонецФункции
// Скачать файл.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор файла
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция СкачатьФайл(Знач Токен, Знач Идентификатор) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
Параметры = Новый Соответствие;
Параметры.Вставить("alt", "media");
Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки);
Возврат Ответ;
КонецФункции
// Удалить объект.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор объекта для удаления
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Скоприровать объект.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор объекта
// НовоеИмя - Строка - Новое имя объекта
// НовыйРодитель - Строка - Новый каталог размещения
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция СкоприроватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy";
Параметры = Новый Структура;
Если ЗначениеЗаполнено(НовоеИмя) Тогда
Параметры.Вставить("name", НовоеИмя);
КонецЕсли;
Если ЗначениеЗаполнено(НовыйРодитель) Тогда
МассивРодителей = Новый Массив;
МассивРодителей.Добавить(НовыйРодитель);
Параметры.Вставить("parents", МассивРодителей);
КонецЕсли;
Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина);
Возврат Ответ;
КонецФункции
// Получить описание файла.
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Получить описание файла
Функция ПолучитьОписаниеФайла() Экспорт
Описание = Новый Соответствие;
Описание.Вставить("MIME" , "image/jpeg");
Описание.Вставить("Имя" , "Новый файл.jpg");
Описание.Вставить("Описание" , "Это новый файл");
Описание.Вставить("Родитель" , Неопределено);
Возврат Описание;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "")
URL = "https://www.googleapis.com/drive/v3/files";
Files = "files";
NPT = "nextPageToken";
Параметры = Новый Структура;
Параметры.Вставить("fields", "*");
Если ЗначениеЗаполнено(Страница) Тогда
Параметры.Вставить("pageToken", Страница);
КонецЕсли;
Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда
ОтборСтрока = СтрСоединить(Отбор, " and ");
Параметры.Вставить("q", ОтборСтрока);
КонецЕсли;
Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки);
Объекты = Результат[Files];
Страница = Результат[NPT];
Для Каждого ТекущийОбъект Из Объекты Цикл
МассивОбъектов.Добавить(ТекущийОбъект);
КонецЦикла;
Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница);
КонецЕсли;
КонецПроцедуры
Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов)
Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
МассивФайлов = Новый Массив;
ТекущийИД = ТекущийОбъект["id"];
Результат = ПолучитьСписокФайлов(Токен, , ТекущийИД);
Для Каждого Файл Из Результат Цикл
МассивФайлов.Добавить(Файл);
КонецЦикла;
ТекущийОбъект.Вставить("files", МассивФайлов);
КонецЦикла;
КонецПроцедуры
Процедура СформироватьПараметрыЗагрузкиФайла(Описание)
СформированноеОписание = Новый Соответствие;
OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание);
СоотвтетствиеПолей = Новый Соответствие;
СоотвтетствиеПолей.Вставить("MIME" , "mimeType");
СоотвтетствиеПолей.Вставить("Имя" , "name");
СоотвтетствиеПолей.Вставить("Описание" , "description");
СоотвтетствиеПолей.Вставить("Родитель" , "parents");
СоотвтетствиеПолей.Вставить("Расширение", "fileExtension");
Для Каждого Элемент Из Описание Цикл
Если Элемент.Ключ = "Родитель" Тогда
ТекущееЗначение = Новый Массив;
ТекущееЗначение.Добавить(Элемент.Значение);
Иначе
ТекущееЗначение = Элемент.Значение;
КонецЕсли;
ИмяПоля = СоотвтетствиеПолей.Получить(Элемент.Ключ);
СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение);
КонецЦикла;
Описание = OPI_Инструменты.JSONСтрокой(СформированноеОписание);
КонецПроцедуры
#КонецОбласти

View File

@ -1,118 +1,132 @@
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Сформировать ссылку получения кода.
//
// Параметры:
// ClientID - Строка - Client ID
//
// Возвращаемое значение:
// Строка - Сформировать ссылку получения кода
Функция СформироватьСсылкуПолученияКода(Знач ClientID) Экспорт
URL = "https://accounts.google.com/o/oauth2/auth";
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("response_type", "code");
ПараметрыURL.Вставить("client_id" , ClientID);
ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
ПараметрыURL.Вставить("access_type" , "offline");
ПараметрыURL.Вставить("scope" , ПолучитьСписокРазрешений());
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
Возврат URL;
КонецФункции
// Получить токен по коду.
//
// Параметры:
// ClientID - Строка - Client ID
// ClientSecret - Строка - Client secret
// Code - Строка - Code из браузера
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - Получить токен по коду
Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
URL = "https://accounts.google.com/o/oauth2/token";
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("grant_type" , "authorization_code");
ПараметрыURL.Вставить("client_id" , ClientID);
ПараметрыURL.Вставить("client_secret", ClientSecret);
ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
ПараметрыURL.Вставить("code" , Code);
Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен.
//
// Параметры:
// ClientID - Строка - Client ID
// ClientSecret - Строка - Client secret
// RefreshToken - Строка - Refresh token
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - Обновить токен
Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
URL = "https://accounts.google.com/o/oauth2/token";
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("grant_type" , "refresh_token");
ПараметрыURL.Вставить("client_id" , ClientID);
ПараметрыURL.Вставить("client_secret", ClientSecret);
ПараметрыURL.Вставить("refresh_token", RefreshToken);
Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИфункции
Функция ПолучитьСписокРазрешений()
МассивРазрешений = Новый Массив;
МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
Возврат СтрСоединить(МассивРазрешений, " ");
КонецФункции
#КонецОбласти
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Сформировать ссылку получения кода.
//
// Параметры:
// ClientID - Строка - Client ID
//
// Возвращаемое значение:
// Строка - Сформировать ссылку получения кода
Функция СформироватьСсылкуПолученияКода(Знач ClientID) Экспорт
URL = "https://accounts.google.com/o/oauth2/auth";
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("response_type", "code");
ПараметрыURL.Вставить("client_id" , ClientID);
ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
ПараметрыURL.Вставить("access_type" , "offline");
ПараметрыURL.Вставить("scope" , ПолучитьСписокРазрешений());
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
Возврат URL;
КонецФункции
// Получить токен по коду.
//
// Параметры:
// ClientID - Строка - Client ID
// ClientSecret - Строка - Client secret
// Code - Строка - Code из браузера
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - Получить токен по коду
Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
URL = "https://accounts.google.com/o/oauth2/token";
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("grant_type" , "authorization_code");
ПараметрыURL.Вставить("client_id" , ClientID);
ПараметрыURL.Вставить("client_secret", ClientSecret);
ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
ПараметрыURL.Вставить("code" , Code);
Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен.
//
// Параметры:
// ClientID - Строка - Client ID
// ClientSecret - Строка - Client secret
// RefreshToken - Строка - Refresh token
//
// Возвращаемое значение:
// Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - Обновить токен
Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
URL = "https://accounts.google.com/o/oauth2/token";
ПараметрыURL = Новый Структура;
ПараметрыURL.Вставить("grant_type" , "refresh_token");
ПараметрыURL.Вставить("client_id" , ClientID);
ПараметрыURL.Вставить("client_secret", ClientSecret);
ПараметрыURL.Вставить("refresh_token", RefreshToken);
Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Возврат Заголовки;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИфункции
Функция ПолучитьСписокРазрешений()
МассивРазрешений = Новый Массив;
МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive");
Возврат СтрСоединить(МассивРазрешений, " ");
КонецФункции
#КонецОбласти

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,409 +1,409 @@
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область НастройкиИИнформация
// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
//
// Параметры:
// Токен - Строка - Токен Viber
// URL - Строка - URL для установки Webhook
//
// Возвращаемое значение:
// Произвольный - Ответ сервера Viber
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("url" , URL);
СтруктураПараметров.Вставить("auth_token", Токен);
Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook"
, СтруктураПараметров);
КонецФункции
// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
//
// Параметры:
// Токен - Строка - Токен
//
// Возвращаемое значение:
// ДвоичныеДанные, Неопределено, Произвольный - Получить информацию о канале
Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
Возврат OPI_Инструменты.Get("https://chatapi.viber.com/pa/get_account_info"
,
, ТокенВЗаголовки(Токен));
КонецФункции
// Получить данные пользователя.
//
// Параметры:
// Токен - Строка - Токен
// IDПользователя - Строка, Число - ID пользователя Viber
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("id", IDПользователя);
Ответ = OPI_Инструменты.Post("https://chatapi.viber.com/pa/get_user_details"
, СтруктураПараметров
, ТокенВЗаголовки(Токен));
Попытка
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
Возврат Ответ;
КонецПопытки;
КонецФункции
// Получить онлайн пользователей.
//
// Параметры:
// Токен - Строка - Токен Viber
// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(-я) Viber
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
Если Не ТипЗнч(IDПользователей) = Тип("Массив") Тогда
ОдиночныйID = IDПользователей;
IDПользователей = Новый Массив;
IDПользователей.Добавить(ОдиночныйID);
КонецЕсли;
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ids", IDПользователей);
Ответ = OPI_Инструменты.Post("https://chatapi.viber.com/pa/get_online"
, СтруктураПараметров
, ТокенВЗаголовки(Токен));
Попытка
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
Возврат Ответ;
КонецПопытки;
КонецФункции
#КонецОбласти
#Область ОтправкаСообщений
// Отправить текстовое сообщение.
//
// Параметры:
// Токен - Строка - Токен
// Текст - Строка - Текст сообщения
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьТекстовоеСообщение(Знач Токен
, Знач Текст
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Клавиатура = "") Экспорт
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
КонецФункции
// Отправить картинку.
//
// Параметры:
// Токен - Строка - Токен
// URL - Строка - URL картинки
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - булево - Отправка в канал или в чат бота
// Описание - Строка - Аннотация к картинке
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
КонецФункции
// Отправить файл.
//
// Параметры:
// Токен - Строка - Токен
// URL - Строка - URL
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
// Расширение - Строка - Расширение файла
// Размер - Число - Размер файла. Если не заполнен - определяется автоматически, но при этом происходит скачивание
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьФайл(Знач Токен
, Знач URL
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Расширение
, Знач Размер = "") Экспорт
Если Не ЗначениеЗаполнено(Размер) Тогда
Ответ = OPI_Инструменты.Get(URL);
ИВФ = ПолучитьИмяВременногоФайла(Расширение);
Ответ.Записать(ИВФ);
ВремФайл = Новый Файл(ИВФ);
Размер = ВремФайл.Размер();
УдалитьФайлы(ИВФ);
КонецЕсли;
Расширение = СтрЗаменить(Расширение, ".", "");
СтруктураЗначения = Новый Структура;
СтруктураЗначения.Вставить("URL" , URL);
СтруктураЗначения.Вставить("Размер" , Размер);
СтруктураЗначения.Вставить("Расширение" , Расширение);
Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, СтруктураЗначения);
КонецФункции
// Отправить контакт.
//
// Параметры:
// Токен - Строка - Токен
// ИмяКонтакта - Строка - Имя контакта
// НомерТелефона - Строка - Номер телефона
// IDПользователя - Строка - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьКонтакт(Знач Токен
, Знач ИмяКонтакта
, Знач НомерТелефона
, Знач IDПользователя
, Знач ОтправкаВКанал) Экспорт
СтруктураКонтакта = Новый Структура;
СтруктураКонтакта.Вставить("name", ИмяКонтакта);
СтруктураКонтакта.Вставить("phone_number", Строка(НомерТелефона));
Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, СтруктураКонтакта);
КонецФункции
// Отправить локацию.
//
// Параметры:
// Токен - Строка - Токен
// Широта - Строка,Число - Географическая широта
// Долгота - Строка,Число - Географическая долгота
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или чат-боту
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Отправить локацию
Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
СтруктураЛокации = Новый Структура;
СтруктураЛокации.Вставить("lat", OPI_Инструменты.ЧислоВСтроку(Широта));
СтруктураЛокации.Вставить("lon", OPI_Инструменты.ЧислоВСтроку(Долгота));
Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, СтруктураЛокации);
КонецФункции
// Отправить ссылку.
//
// Параметры:
// Токен - Строка - Токен
// URL - Строка - Отправляемая ссылка
// IDПользователя - Строка,Число - IDПользователя
// ОтправкаВКанал - Булево - Отправка в канал или в чат боту
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
КонецФункции
// Сформировать клавиатуру из массива кнопок.
//
// Параметры:
// МассивКнопок - Массив из Строка - Массив кнопок
// ЦветКнопок - Строка - HEX цвет кнопок с # в начале
//
// Возвращаемое значение:
// Структура - Сформировать клавиатуру из массива кнопок:
// * Buttons - Массив из Структура - Массив сформированных кнопок
// * Type - Строка - Тип клавиатуры
Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "") Экспорт
МассивСтруктурКнопок = Новый Массив;
СтруктураКлавиатуры = Новый Структура;
ЦветКнопок = ?(ЗначениеЗаполнено(ЦветКнопок), ЦветКнопок, "#2db9b9");
Для Каждого ТекстКнопки Из МассивКнопок Цикл
СтруктураКнопки = Новый Структура;
СтруктураКнопки.Вставить("ActionType", "reply");
СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
СтруктураКнопки.Вставить("Text" , ТекстКнопки);
СтруктураКнопки.Вставить("BgColor" , ЦветКнопок);
СтруктураКнопки.Вставить("Coloumns" , 3);
МассивСтруктурКнопок.Добавить(СтруктураКнопки);
КонецЦикла;
СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
СтруктураКлавиатуры.Вставить("Type" , "keyboard");
Возврат СтруктураКлавиатуры;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Отправить сообщение.
//
// Параметры:
// Токен - Строка - Токен
// Тип - Строка - Тип отправляемого сообщения
// IDПользователя - Строка,Число - ID пользователя Viber
// ЭтоКанал - Булево - Отправка в канал или чат с ботом
// Значение - Строка, Структура - Значение:
// * URL - Строка - При отправке URL
// * Размер - Число, Строка - Размер файла в случае отправке
// * Расширение - Строка - Расширение файла в случае отправки
// Текст - Строка - Текст сообщения
// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Отправить сообщение
Функция ОтправитьСообщение(Знач Токен
, Знач Тип
, Знач IDПользователя
, Знач ЭтоКанал
, Знач Значение = ""
, Знач Текст = ""
, Знач Клавиатура = "")
СтруктураПараметров = ВернутьСтандартныеПараметры();
СтруктураПараметров.Вставить("type", Тип);
Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда
СтруктураПараметров.Вставить("text", Текст);
КонецЕсли;
Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда
СтруктураПараметров.Вставить("keyboard", Клавиатура);
КонецЕсли;
Если ЗначениеЗаполнено(Значение) Тогда
Если Тип = "file" Тогда
СтруктураПараметров.Вставить("media" , Значение["URL"]);
СтруктураПараметров.Вставить("size" , Значение["Размер"]);
СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]);
ИначеЕсли Тип = "contact" Тогда
СтруктураПараметров.Вставить("contact" , Значение);
ИначеЕсли Тип = "location" Тогда
СтруктураПараметров.Вставить("location" , Значение);
Иначе
СтруктураПараметров.Вставить("media" , Значение);
КонецЕсли;
КонецЕсли;
Если ЭтоКанал Тогда
СтруктураПараметров.Вставить("from", IDПользователя);
URL = "https://chatapi.viber.com/pa/post";
Иначе
СтруктураПараметров.Вставить("receiver", IDПользователя);
URL = "https://chatapi.viber.com/pa/send_message";
КонецЕсли;
Ответ = OPI_Инструменты.Post(URL
, СтруктураПараметров
, ТокенВЗаголовки(Токен));
Попытка
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
Возврат Ответ;
КонецПопытки;
КонецФункции
Функция ВернутьСтандартныеПараметры()
СтруктураОтправителя = Новый Структура;
СтруктураОтправителя.Вставить("name" , "Bot");
СтруктураОтправителя.Вставить("avatar", "");
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
СтруктураПараметров.Вставить("min_api_version", 1);
Возврат СтруктураПараметров;
КонецФункции
Функция ТокенВЗаголовки(Знач Токен)
СтруктураЗаголовков = Новый Соответствие;
СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
Возврат СтруктураЗаголовков;
КонецФункции
#КонецОбласти
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область НастройкиИИнформация
// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
//
// Параметры:
// Токен - Строка - Токен Viber
// URL - Строка - URL для установки Webhook
//
// Возвращаемое значение:
// Произвольный - Ответ сервера Viber
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("url" , URL);
СтруктураПараметров.Вставить("auth_token", Токен);
Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook"
, СтруктураПараметров);
КонецФункции
// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
//
// Параметры:
// Токен - Строка - Токен
//
// Возвращаемое значение:
// ДвоичныеДанные, Неопределено, Произвольный - Получить информацию о канале
Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
Возврат OPI_Инструменты.Get("https://chatapi.viber.com/pa/get_account_info"
,
, ТокенВЗаголовки(Токен));
КонецФункции
// Получить данные пользователя.
//
// Параметры:
// Токен - Строка - Токен
// IDПользователя - Строка, Число - ID пользователя Viber
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("id", IDПользователя);
Ответ = OPI_Инструменты.Post("https://chatapi.viber.com/pa/get_user_details"
, СтруктураПараметров
, ТокенВЗаголовки(Токен));
Попытка
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
Возврат Ответ;
КонецПопытки;
КонецФункции
// Получить онлайн пользователей.
//
// Параметры:
// Токен - Строка - Токен Viber
// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(-я) Viber
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
Если Не ТипЗнч(IDПользователей) = Тип("Массив") Тогда
ОдиночныйID = IDПользователей;
IDПользователей = Новый Массив;
IDПользователей.Добавить(ОдиночныйID);
КонецЕсли;
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ids", IDПользователей);
Ответ = OPI_Инструменты.Post("https://chatapi.viber.com/pa/get_online"
, СтруктураПараметров
, ТокенВЗаголовки(Токен));
Попытка
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
Возврат Ответ;
КонецПопытки;
КонецФункции
#КонецОбласти
#Область ОтправкаСообщений
// Отправить текстовое сообщение.
//
// Параметры:
// Токен - Строка - Токен
// Текст - Строка - Текст сообщения
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьТекстовоеСообщение(Знач Токен
, Знач Текст
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Клавиатура = "") Экспорт
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
КонецФункции
// Отправить картинку.
//
// Параметры:
// Токен - Строка - Токен
// URL - Строка - URL картинки
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - булево - Отправка в канал или в чат бота
// Описание - Строка - Аннотация к картинке
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
КонецФункции
// Отправить файл.
//
// Параметры:
// Токен - Строка - Токен
// URL - Строка - URL
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
// Расширение - Строка - Расширение файла
// Размер - Число - Размер файла. Если не заполнен - определяется автоматически, но при этом происходит скачивание
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьФайл(Знач Токен
, Знач URL
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Расширение
, Знач Размер = "") Экспорт
Если Не ЗначениеЗаполнено(Размер) Тогда
Ответ = OPI_Инструменты.Get(URL);
ИВФ = ПолучитьИмяВременногоФайла(Расширение);
Ответ.Записать(ИВФ);
ВремФайл = Новый Файл(ИВФ);
Размер = ВремФайл.Размер();
УдалитьФайлы(ИВФ);
КонецЕсли;
Расширение = СтрЗаменить(Расширение, ".", "");
СтруктураЗначения = Новый Структура;
СтруктураЗначения.Вставить("URL" , URL);
СтруктураЗначения.Вставить("Размер" , Размер);
СтруктураЗначения.Вставить("Расширение" , Расширение);
Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, СтруктураЗначения);
КонецФункции
// Отправить контакт.
//
// Параметры:
// Токен - Строка - Токен
// ИмяКонтакта - Строка - Имя контакта
// НомерТелефона - Строка - Номер телефона
// IDПользователя - Строка - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьКонтакт(Знач Токен
, Знач ИмяКонтакта
, Знач НомерТелефона
, Знач IDПользователя
, Знач ОтправкаВКанал) Экспорт
СтруктураКонтакта = Новый Структура;
СтруктураКонтакта.Вставить("name", ИмяКонтакта);
СтруктураКонтакта.Вставить("phone_number", Строка(НомерТелефона));
Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, СтруктураКонтакта);
КонецФункции
// Отправить локацию.
//
// Параметры:
// Токен - Строка - Токен
// Широта - Строка,Число - Географическая широта
// Долгота - Строка,Число - Географическая долгота
// IDПользователя - Строка,Число - ID пользователя Viber
// ОтправкаВКанал - Булево - Отправка в канал или чат-боту
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Отправить локацию
Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
СтруктураЛокации = Новый Структура;
СтруктураЛокации.Вставить("lat", OPI_Инструменты.ЧислоВСтроку(Широта));
СтруктураЛокации.Вставить("lon", OPI_Инструменты.ЧислоВСтроку(Долгота));
Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, СтруктураЛокации);
КонецФункции
// Отправить ссылку.
//
// Параметры:
// Токен - Строка - Токен
// URL - Строка - Отправляемая ссылка
// IDПользователя - Строка,Число - IDПользователя
// ОтправкаВКанал - Булево - Отправка в канал или в чат боту
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Ответ сервера Viber
Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
КонецФункции
// Сформировать клавиатуру из массива кнопок.
//
// Параметры:
// МассивКнопок - Массив из Строка - Массив кнопок
// ЦветКнопок - Строка - HEX цвет кнопок с # в начале
//
// Возвращаемое значение:
// Структура - Сформировать клавиатуру из массива кнопок:
// * Buttons - Массив из Структура - Массив сформированных кнопок
// * Type - Строка - Тип клавиатуры
Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "") Экспорт
МассивСтруктурКнопок = Новый Массив;
СтруктураКлавиатуры = Новый Структура;
ЦветКнопок = ?(ЗначениеЗаполнено(ЦветКнопок), ЦветКнопок, "#2db9b9");
Для Каждого ТекстКнопки Из МассивКнопок Цикл
СтруктураКнопки = Новый Структура;
СтруктураКнопки.Вставить("ActionType", "reply");
СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
СтруктураКнопки.Вставить("Text" , ТекстКнопки);
СтруктураКнопки.Вставить("BgColor" , ЦветКнопок);
СтруктураКнопки.Вставить("Coloumns" , 3);
МассивСтруктурКнопок.Добавить(СтруктураКнопки);
КонецЦикла;
СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
СтруктураКлавиатуры.Вставить("Type" , "keyboard");
Возврат СтруктураКлавиатуры;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Отправить сообщение.
//
// Параметры:
// Токен - Строка - Токен
// Тип - Строка - Тип отправляемого сообщения
// IDПользователя - Строка,Число - ID пользователя Viber
// ЭтоКанал - Булево - Отправка в канал или чат с ботом
// Значение - Строка, Структура - Значение:
// * URL - Строка - При отправке URL
// * Размер - Число, Строка - Размер файла в случае отправке
// * Расширение - Строка - Расширение файла в случае отправки
// Текст - Строка - Текст сообщения
// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Отправить сообщение
Функция ОтправитьСообщение(Знач Токен
, Знач Тип
, Знач IDПользователя
, Знач ЭтоКанал
, Знач Значение = ""
, Знач Текст = ""
, Знач Клавиатура = "")
СтруктураПараметров = ВернутьСтандартныеПараметры();
СтруктураПараметров.Вставить("type", Тип);
Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда
СтруктураПараметров.Вставить("text", Текст);
КонецЕсли;
Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда
СтруктураПараметров.Вставить("keyboard", Клавиатура);
КонецЕсли;
Если ЗначениеЗаполнено(Значение) Тогда
Если Тип = "file" Тогда
СтруктураПараметров.Вставить("media" , Значение["URL"]);
СтруктураПараметров.Вставить("size" , Значение["Размер"]);
СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]);
ИначеЕсли Тип = "contact" Тогда
СтруктураПараметров.Вставить("contact" , Значение);
ИначеЕсли Тип = "location" Тогда
СтруктураПараметров.Вставить("location" , Значение);
Иначе
СтруктураПараметров.Вставить("media" , Значение);
КонецЕсли;
КонецЕсли;
Если ЭтоКанал Тогда
СтруктураПараметров.Вставить("from", IDПользователя);
URL = "https://chatapi.viber.com/pa/post";
Иначе
СтруктураПараметров.Вставить("receiver", IDПользователя);
URL = "https://chatapi.viber.com/pa/send_message";
КонецЕсли;
Ответ = OPI_Инструменты.Post(URL
, СтруктураПараметров
, ТокенВЗаголовки(Токен));
Попытка
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
Исключение
Возврат Ответ;
КонецПопытки;
КонецФункции
Функция ВернутьСтандартныеПараметры()
СтруктураОтправителя = Новый Структура;
СтруктураОтправителя.Вставить("name" , "Bot");
СтруктураОтправителя.Вставить("avatar", "");
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
СтруктураПараметров.Вставить("min_api_version", 1);
Возврат СтруктураПараметров;
КонецФункции
Функция ТокенВЗаголовки(Знач Токен)
СтруктураЗаголовков = Новый Соответствие;
СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
Возврат СтруктураЗаголовков;
КонецФункции
#КонецОбласти

File diff suppressed because it is too large Load Diff

View File

@ -1,92 +1,92 @@
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Получить код подтверждения.
//
// Параметры:
// ClientId - Строка - Client id
//
// Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Ответ сервера Yandex
Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
Параметры = Новый Структура("client_id", ClientId);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Преобразовать код в токен.
//
// Параметры:
// ClientId - Строка - Client id
// ClientSecret - Строка - Client secret
// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения()
//
// Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Преобразовать код в токен
Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "device_code");
Параметры.Вставить("code" , КодУстройства);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен.
//
// Параметры:
// ClientId - Строка - Client id
// ClientSecret - Строка - Client secret
// RefreshToken - Строка - Refresh token
//
// Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Обновить токен
Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "refresh_token");
Параметры.Вставить("refresh_token" , RefreshToken);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Получить код подтверждения.
//
// Параметры:
// ClientId - Строка - Client id
//
// Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Ответ сервера Yandex
Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
Параметры = Новый Структура("client_id", ClientId);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Преобразовать код в токен.
//
// Параметры:
// ClientId - Строка - Client id
// ClientSecret - Строка - Client secret
// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения()
//
// Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Преобразовать код в токен
Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "device_code");
Параметры.Вставить("code" , КодУстройства);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен.
//
// Параметры:
// ClientId - Строка - Client id
// ClientSecret - Строка - Client secret
// RefreshToken - Строка - Refresh token
//
// Возвращаемое значение:
// Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Обновить токен
Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "refresh_token");
Параметры.Вставить("refresh_token" , RefreshToken);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти

File diff suppressed because it is too large Load Diff

View File

@ -1,106 +1,106 @@
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
#Область СлужебныйПрограммныйИнтерфейс
#Область БСП
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
КонецФункции
Функция Хеш(ДвоичныеДанные, Тип) Экспорт
Хеширование = Новый ХешированиеДанных(Тип);
Хеширование.Добавить(ДвоичныеДанные);
Возврат Хеширование.ХешСумма;
КонецФункции
Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
Дважды = 2;
Если Ключ.Размер() > РазмерБлока Тогда
Ключ = Хеш(Ключ, Тип);
КонецЕсли;
Если Ключ.Размер() <= РазмерБлока Тогда
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
КонецЕсли;
Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
КонецФункции
Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
МассивДвоичныхДанных = Новый Массив;
МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
КонецФункции
Функция ПовторитьСтроку(Строка, Количество) Экспорт
Части = Новый Массив(Количество);
// BSLLS:UnusedLocalVariable-off
Для к = 1 По Количество Цикл
Части.Добавить(Строка);
КонецЦикла;
// BSLLS:UnusedLocalVariable-on
Возврат СтрСоединить(Части, "");
КонецФункции
#КонецОбласти
#КонецОбласти
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
#Область СлужебныйПрограммныйИнтерфейс
#Область БСП
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
КонецФункции
Функция Хеш(ДвоичныеДанные, Тип) Экспорт
Хеширование = Новый ХешированиеДанных(Тип);
Хеширование.Добавить(ДвоичныеДанные);
Возврат Хеширование.ХешСумма;
КонецФункции
Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
Дважды = 2;
Если Ключ.Размер() > РазмерБлока Тогда
Ключ = Хеш(Ключ, Тип);
КонецЕсли;
Если Ключ.Размер() <= РазмерБлока Тогда
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
КонецЕсли;
Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
КонецФункции
Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
МассивДвоичныхДанных = Новый Массив;
МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
КонецФункции
Функция ПовторитьСтроку(Строка, Количество) Экспорт
Части = Новый Массив(Количество);
// BSLLS:UnusedLocalVariable-off
Для к = 1 По Количество Цикл
Части.Добавить(Строка);
КонецЦикла;
// BSLLS:UnusedLocalVariable-on
Возврат СтрСоединить(Части, "");
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -29,7 +29,6 @@
// Раскомментировать, если выполняется OneScript
// #Использовать "../../../tools"
// #Использовать "../../../core"
// #Использовать oint
// #Использовать asserts
#Область СлужебныйПрограммныйИнтерфейс
@ -2213,4 +2212,4 @@
#КонецОбласти
// BSLLS:Typo-on
// BSLLS:Typo-on