1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-13 20:05:19 +02:00
This commit is contained in:
Anton Titovets
2024-03-14 15:32:11 +03:00
15 changed files with 9469 additions and 8970 deletions

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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