1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-11-24 08:52:18 +02:00

Преобразование OPI -> OInt (workflow)

This commit is contained in:
Vitaly the Alpaca 2024-05-31 21:05:52 +00:00 committed by Vitaly the Alpaca (bot)
parent 4474479c07
commit 658281c282
21 changed files with 18273 additions and 18273 deletions

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 @@
// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os
// Библиотека: Google Sheets
// Команда CLI: gsheets
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область РаботаСКнигами
// Создать книгу
// Создает новую книгу
//
// Параметры:
// Токен - Строка - Токен - token
// Наименование - Строка - Наименование - title
// МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets";
Свойства = Новый Структура("title" , Наименование);
Листы = Новый Массив;
ЗаполнитьМассивЛистов(МассивИменЛистов, Листы);
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры);
OPI_Инструменты.ДобавитьПоле("sheets" , Листы , "Коллекция", Параметры);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить книгу
// Получает информацию о книге по ID
//
// Параметры:
// Токен - Строка - Токен - token
// Идентификатор - Строка - Идентификатор книги - spreadsheet
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить наименование книги
// Изменяет наименование существующей книги
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// Наименование - Строка - Новое наименование - title
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
Изменение = Новый Структура("title", Наименование);
ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title");
Запрос = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения);
МассивЗапросов = Новый Массив;
МассивЗапросов.Добавить(Запрос);
Параметры = Новый Структура("requests", МассивЗапросов);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСЛистами
// Добавить лист
// Добавляет новый лист в книгу
//
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - Идентификатор книги - spreadsheet
// Наименование - Строка - Наименование нового листа - title
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
Лист = СоздатьЛист(Наименование);
Запросы = Новый Массив;
Изменение = Новый Структура("addSheet", Лист);
Запросы.Добавить(Изменение);
Параметры = Новый Структура("requests", Запросы);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Удалить лист
// Удаляет лист из книги
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - Идентификатор книги - spreadsheet
// Лист - Строка - Идентификатор удаляемого листа - sheet
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
Запросы = Новый Массив;
Лист = Новый Структура("sheetId" , Лист);
Изменение = Новый Структура("deleteSheet", Лист);
Запросы.Добавить(Изменение);
Параметры = Новый Структура("requests", Запросы);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Копировать лист
// Копирует лист из одной книги в другую
//
// Параметры:
// Токен - Строка - Токен - token
// Откуда - Строка - ID книги источника - from
// Куда - Строка - ID книги приемника - to
// Лист - Строка - ID копируемого листа - sheet
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/"
+ Откуда
+ "/sheets/"
+ Лист
+ ":copyTo";
Параметры = Новый Структура("destinationSpreadsheetId", Куда);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСДанными
// Установить значения ячеек
// Устанавливает значения ячеек листа
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1 - data
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
// ОсновноеИзмерение - Строка - Основное измерение при заполнении диапазона массивом - dim
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция УстановитьЗначенияЯчеек(Знач Токен
, Знач Книга
, Знач СоответствиеЗначений
, Знач Лист = ""
, Знач ОсновноеИзмерение = "COLUMNS") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений);
Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура")
И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда
Возврат "Не удалось привести структуру значений к коллекции";
КонецЕсли;
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate";
МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист);
Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED");
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Очистить ячейки
// Очищает значение в ячейках
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки - cells
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear";
СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
Параметры = Новый Структура("ranges", МассивЯчеек);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить значения ячеек
// Получает значения ячеек таблицы
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено) - cells
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet";
Если ЗначениеЗаполнено(МассивЯчеек) Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
Первый = Истина;
Для Каждого Ячейка Из МассивЯчеек Цикл
Разделитель = ?(Первый, "?", "&");
URL = URL + Разделитель + "ranges=" + Ячейка;
Первый = Ложь;
КонецЦикла;
Иначе
URL = URL + "?ranges='" + Лист + "'";
КонецЕсли;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов)
Для Каждого ИмяЛиста Из МассивИмен Цикл
Лист = СоздатьЛист(ИмяЛиста);
МассивЛистов.Добавить(Лист);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист)
Если ЗначениеЗаполнено(Лист) Тогда
Ячейка = "'" + Лист + "'!" + Ячейка;
КонецЕсли;
КонецПроцедуры
Функция СоздатьЛист(Знач Наименование)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
СвойстваЛиста = Новый Структура("title" , Наименование);
Лист = Новый Структура("properties", СвойстваЛиста);
Возврат Лист;
КонецФункции
Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
МассивДанных = Новый Массив;
Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл
ТекущееЗначение = ДанныеЯчейки.Значение;
ТекущийКлюч = ДанныеЯчейки.Ключ;
ДобавитьИмяЛиста(ТекущийКлюч, Лист);
OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение);
ТекущиеДанные = Новый Соответствие;
ТекущийМассив = Новый Массив;
ТекущийМассив.Добавить(ТекущееЗначение);
OPI_Инструменты.ДобавитьПоле("range" , ТекущийКлюч , "Строка", ТекущиеДанные);
OPI_Инструменты.ДобавитьПоле("values" , ТекущийМассив , "Массив", ТекущиеДанные);
OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные);
МассивДанных.Добавить(ТекущиеДанные);
КонецЦикла;
Возврат МассивДанных;
КонецФункции
Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
Для Н = 0 По МассивИмен.ВГраница() Цикл
ДобавитьИмяЛиста(МассивИмен[Н], Лист);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os
// Библиотека: Google Sheets
// Команда CLI: gsheets
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область РаботаСКнигами
// Создать книгу
// Создает новую книгу
//
// Параметры:
// Токен - Строка - Токен - token
// Наименование - Строка - Наименование - title
// МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets";
Свойства = Новый Структура("title" , Наименование);
Листы = Новый Массив;
ЗаполнитьМассивЛистов(МассивИменЛистов, Листы);
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры);
OPI_Инструменты.ДобавитьПоле("sheets" , Листы , "Коллекция", Параметры);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить книгу
// Получает информацию о книге по ID
//
// Параметры:
// Токен - Строка - Токен - token
// Идентификатор - Строка - Идентификатор книги - spreadsheet
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Изменить наименование книги
// Изменяет наименование существующей книги
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// Наименование - Строка - Новое наименование - title
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
Изменение = Новый Структура("title", Наименование);
ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title");
Запрос = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения);
МассивЗапросов = Новый Массив;
МассивЗапросов.Добавить(Запрос);
Параметры = Новый Структура("requests", МассивЗапросов);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСЛистами
// Добавить лист
// Добавляет новый лист в книгу
//
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - Идентификатор книги - spreadsheet
// Наименование - Строка - Наименование нового листа - title
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
Лист = СоздатьЛист(Наименование);
Запросы = Новый Массив;
Изменение = Новый Структура("addSheet", Лист);
Запросы.Добавить(Изменение);
Параметры = Новый Структура("requests", Запросы);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Удалить лист
// Удаляет лист из книги
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - Идентификатор книги - spreadsheet
// Лист - Строка - Идентификатор удаляемого листа - sheet
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
Запросы = Новый Массив;
Лист = Новый Структура("sheetId" , Лист);
Изменение = Новый Структура("deleteSheet", Лист);
Запросы.Добавить(Изменение);
Параметры = Новый Структура("requests", Запросы);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Копировать лист
// Копирует лист из одной книги в другую
//
// Параметры:
// Токен - Строка - Токен - token
// Откуда - Строка - ID книги источника - from
// Куда - Строка - ID книги приемника - to
// Лист - Строка - ID копируемого листа - sheet
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/"
+ Откуда
+ "/sheets/"
+ Лист
+ ":copyTo";
Параметры = Новый Структура("destinationSpreadsheetId", Куда);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСДанными
// Установить значения ячеек
// Устанавливает значения ячеек листа
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1 - data
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
// ОсновноеИзмерение - Строка - Основное измерение при заполнении диапазона массивом - dim
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция УстановитьЗначенияЯчеек(Знач Токен
, Знач Книга
, Знач СоответствиеЗначений
, Знач Лист = ""
, Знач ОсновноеИзмерение = "COLUMNS") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений);
Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура")
И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда
Возврат "Не удалось привести структуру значений к коллекции";
КонецЕсли;
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate";
МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист);
Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED");
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Очистить ячейки
// Очищает значение в ячейках
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки - cells
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear";
СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
Параметры = Новый Структура("ranges", МассивЯчеек);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
// Получить значения ячеек
// Получает значения ячеек таблицы
//
// Параметры:
// Токен - Строка - Токен - token
// Книга - Строка - ID книги - spreadsheet
// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено) - cells
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet";
Если ЗначениеЗаполнено(МассивЯчеек) Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
Первый = Истина;
Для Каждого Ячейка Из МассивЯчеек Цикл
Разделитель = ?(Первый, "?", "&");
URL = URL + Разделитель + "ranges=" + Ячейка;
Первый = Ложь;
КонецЦикла;
Иначе
URL = URL + "?ranges='" + Лист + "'";
КонецЕсли;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов)
Для Каждого ИмяЛиста Из МассивИмен Цикл
Лист = СоздатьЛист(ИмяЛиста);
МассивЛистов.Добавить(Лист);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист)
Если ЗначениеЗаполнено(Лист) Тогда
Ячейка = "'" + Лист + "'!" + Ячейка;
КонецЕсли;
КонецПроцедуры
Функция СоздатьЛист(Знач Наименование)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
СвойстваЛиста = Новый Структура("title" , Наименование);
Лист = Новый Структура("properties", СвойстваЛиста);
Возврат Лист;
КонецФункции
Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
МассивДанных = Новый Массив;
Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл
ТекущееЗначение = ДанныеЯчейки.Значение;
ТекущийКлюч = ДанныеЯчейки.Ключ;
ДобавитьИмяЛиста(ТекущийКлюч, Лист);
OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение);
ТекущиеДанные = Новый Соответствие;
ТекущийМассив = Новый Массив;
ТекущийМассив.Добавить(ТекущееЗначение);
OPI_Инструменты.ДобавитьПоле("range" , ТекущийКлюч , "Строка", ТекущиеДанные);
OPI_Инструменты.ДобавитьПоле("values" , ТекущийМассив , "Массив", ТекущиеДанные);
OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные);
МассивДанных.Добавить(ТекущиеДанные);
КонецЦикла;
Возврат МассивДанных;
КонецФункции
Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
Для Н = 0 По МассивИмен.ВГраница() Цикл
ДобавитьИмяЛиста(МассивИмен[Н], Лист);
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -1,173 +1,173 @@
// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
// Библиотека: Google Workspace
// Команда CLI: google
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Сформировать ссылку получения кода
// Возвращает URL для авторизации в браузере
//
// Параметры:
// ClientID - Строка - Client ID - id
// Calendar - Булево - разрешение на методы Calendar - calendar
// Drive - Булево - разрешение на методы Drive - drive
// Sheets - Булево - разрешение на методы Sheets - sheets
//
// Возвращаемое значение:
// Строка - Ссылка получения кода
Функция СформироватьСсылкуПолученияКода(Знач ClientID
, Знач Calendar = Истина
, Знач Drive = Истина
, Знач Sheets = Истина) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar);
OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets);
OPI_ПреобразованиеТипов.ПолучитьБулево(Drive);
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" , ПолучитьСписокРазрешений(Calendar, Drive, Sheets));
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
Возврат URL;
КонецФункции
// Получить токен по коду
// Получает токен по коду из авторизации в бразуере
//
// Параметры:
// ClientID - Строка - Client ID - id
// ClientSecret - Строка - Client secret - secret
// Code - Строка - Code из браузера - code
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(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, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен
// Обновляет токен по Refresh token
//
// Параметры:
// ClientID - Строка - Client ID - id
// ClientSecret - Строка - Client secret - secret
// RefreshToken - Строка - Refresh token - refresh
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(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, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Возврат Заголовки;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИфункции
Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets)
МассивРазрешений = Новый Массив;
Если Calendar Тогда
МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
КонецЕсли;
Если Drive Тогда
МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive");
КонецЕсли;
Если Sheets Тогда
МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets");
КонецЕсли;
Возврат СтрСоединить(МассивРазрешений, " ");
КонецФункции
#КонецОбласти
// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
// Библиотека: Google Workspace
// Команда CLI: google
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Сформировать ссылку получения кода
// Возвращает URL для авторизации в браузере
//
// Параметры:
// ClientID - Строка - Client ID - id
// Calendar - Булево - разрешение на методы Calendar - calendar
// Drive - Булево - разрешение на методы Drive - drive
// Sheets - Булево - разрешение на методы Sheets - sheets
//
// Возвращаемое значение:
// Строка - Ссылка получения кода
Функция СформироватьСсылкуПолученияКода(Знач ClientID
, Знач Calendar = Истина
, Знач Drive = Истина
, Знач Sheets = Истина) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar);
OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets);
OPI_ПреобразованиеТипов.ПолучитьБулево(Drive);
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" , ПолучитьСписокРазрешений(Calendar, Drive, Sheets));
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
Возврат URL;
КонецФункции
// Получить токен по коду
// Получает токен по коду из авторизации в бразуере
//
// Параметры:
// ClientID - Строка - Client ID - id
// ClientSecret - Строка - Client secret - secret
// Code - Строка - Code из браузера - code
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(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, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен
// Обновляет токен по Refresh token
//
// Параметры:
// ClientID - Строка - Client ID - id
// ClientSecret - Строка - Client secret - secret
// RefreshToken - Строка - Refresh token - refresh
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(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, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Возврат Заголовки;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИфункции
Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets)
МассивРазрешений = Новый Массив;
Если Calendar Тогда
МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
КонецЕсли;
Если Drive Тогда
МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive");
КонецЕсли;
Если Sheets Тогда
МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets");
КонецЕсли;
Возврат СтрСоединить(МассивРазрешений, " ");
КонецФункции
#КонецОбласти

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

File diff suppressed because it is too large Load Diff

View File

@ -1,414 +1,414 @@
// Расположение OS: ./OInt/core/Modules/OPI_Viber.os
// Библиотека: Viber
// Команда CLI: viber
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область НастройкиИИнформация
// Установить Webhook
// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
//
// Параметры:
// Токен - Строка - Токен Viber - token
// URL - Строка - URL для установки Webhook - url
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("auth_token" , Токен, "Строка", Параметры);
Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры);
КонецФункции
// Получить информацию о канале
// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
//
// Параметры:
// Токен - Строка - Токен - token
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
URL = "https://chatapi.viber.com/pa/get_account_info";
Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен));
КонецФункции
// Получить данные пользователя
// Получает информацию о пользователе по ID
//
// Параметры:
// Токен - Строка - Токен - token
// IDПользователя - Строка, Число - ID пользователя Viber - user
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
URL = "https://chatapi.viber.com/pa/get_user_details";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры);
Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
Возврат Ответ;
КонецФункции
// Получить онлайн пользователей
// Получает статус пользователя или нескольких пользователей по ID
//
// Параметры:
// Токен - Строка - Токен Viber - token
// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber - users
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
URL = "https://chatapi.viber.com/pa/get_online";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры);
Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область ОтправкаСообщений
// Отправить текстовое сообщение
// Отправляет текстовое сообщение в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// Текст - Строка - Текст сообщения - text
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок - keyboard
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьТекстовоеСообщение(Знач Токен
, Знач Текст
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Клавиатура = "") Экспорт
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
КонецФункции
// Отправить картинку
// Отправляет картинку в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// URL - Строка - URL картинки - picture
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - булево - Отправка в канал или в чат бота - ischannel
// Описание - Строка - Аннотация к картинке - description
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
КонецФункции
// Отправить файл
// Отправляет файл (документ) в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// URL - Строка - URL файла - file
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
// Расширение - Строка - Расширение файла - ext
// Размер - Число - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьФайл(Знач Токен
, Знач URL
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Расширение
, Знач Размер = "") Экспорт
Если Не ЗначениеЗаполнено(Размер) Тогда
Ответ = OPI_Инструменты.Get(URL);
Размер = Ответ.Размер();
КонецЕсли;
Строка_ = "Строка";
Расширение = СтрЗаменить(Расширение, ".", "");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("URL" , URL , Строка_, Параметры);
OPI_Инструменты.ДобавитьПоле("Размер" , Размер , Строка_, Параметры);
OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры);
Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры);
КонецФункции
// Отправить контакт
// Отправляет контакт с номером телефона в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// ИмяКонтакта - Строка - Имя контакта - name
// НомерТелефона - Строка - Номер телефона - phone
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьКонтакт(Знач Токен
, Знач ИмяКонтакта
, Знач НомерТелефона
, Знач IDПользователя
, Знач ОтправкаВКанал) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("name" , ИмяКонтакта , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры);
Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры);
КонецФункции
// Отправить локацию
// Отправляет географические координаты в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// Широта - Строка,Число - Географическая широта - lat
// Долгота - Строка,Число - Географическая долгота - long
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры);
Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры);
КонецФункции
// Отправить ссылку
// Отправляет URL с предпросмотром в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// URL - Строка - Отправляемая ссылка - url
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
КонецФункции
// Сформировать клавиатуру из массива кнопок
// Возвращает структура клавиатуры для сообщений
//
// Параметры:
// МассивКнопок - Массив из Строка - Массив кнопок - buttons
// ЦветКнопок - Строка - HEX цвет кнопок с # в начале - color
//
// Возвращаемое значение:
// Структура - Сформировать клавиатуру из массива кнопок:
// * Buttons - Массив из Структура - Массив сформированных кнопок
// * Type - Строка - Тип клавиатуры
Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
МассивСтруктурКнопок = Новый Массив;
СтруктураКлавиатуры = Новый Структура;
Для Каждого ТекстКнопки Из МассивКнопок Цикл
СтруктураКнопки = Новый Структура;
СтруктураКнопки.Вставить("ActionType", "reply");
СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
СтруктураКнопки.Вставить("Text" , ТекстКнопки);
СтруктураКнопки.Вставить("BgColor" , ЦветКнопок);
СтруктураКнопки.Вставить("Coloumns" , 3);
МассивСтруктурКнопок.Добавить(СтруктураКнопки);
КонецЦикла;
СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
СтруктураКлавиатуры.Вставить("Type" , "keyboard");
Возврат СтруктураКлавиатуры;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Отправить сообщение.
//
// Параметры:
// Токен - Строка - Токен
// Тип - Строка - Тип отправляемого сообщения
// IDПользователя - Строка,Число - ID пользователя Viber
// ЭтоКанал - Булево - Отправка в канал или чат с ботом
// Значение - Строка, Структура - Значение:
// * URL - Строка - При отправке URL
// * Размер - Число, Строка - Размер файла в случае отправке
// * Расширение - Строка - Расширение файла в случае отправки
// Текст - Строка - Текст сообщения
// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Отправить сообщение
Функция ОтправитьСообщение(Знач Токен
, Знач Тип
, Знач IDПользователя
, Знач ЭтоКанал
, Знач Значение = ""
, Знач Текст = ""
, Знач Клавиатура = "")
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура);
СтруктураПараметров = ВернутьСтандартныеПараметры();
СтруктураПараметров.Вставить("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);
Возврат СтруктураПараметров;
КонецФункции
Функция ТокенВЗаголовки(Знач Токен)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
СтруктураЗаголовков = Новый Соответствие;
СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
Возврат СтруктураЗаголовков;
КонецФункции
#КонецОбласти
// Расположение OS: ./OInt/core/Modules/OPI_Viber.os
// Библиотека: Viber
// Команда CLI: viber
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область НастройкиИИнформация
// Установить Webhook
// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
//
// Параметры:
// Токен - Строка - Токен Viber - token
// URL - Строка - URL для установки Webhook - url
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("auth_token" , Токен, "Строка", Параметры);
Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры);
КонецФункции
// Получить информацию о канале
// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
//
// Параметры:
// Токен - Строка - Токен - token
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
URL = "https://chatapi.viber.com/pa/get_account_info";
Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен));
КонецФункции
// Получить данные пользователя
// Получает информацию о пользователе по ID
//
// Параметры:
// Токен - Строка - Токен - token
// IDПользователя - Строка, Число - ID пользователя Viber - user
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
URL = "https://chatapi.viber.com/pa/get_user_details";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры);
Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
Возврат Ответ;
КонецФункции
// Получить онлайн пользователей
// Получает статус пользователя или нескольких пользователей по ID
//
// Параметры:
// Токен - Строка - Токен Viber - token
// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber - users
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
URL = "https://chatapi.viber.com/pa/get_online";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры);
Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область ОтправкаСообщений
// Отправить текстовое сообщение
// Отправляет текстовое сообщение в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// Текст - Строка - Текст сообщения - text
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок - keyboard
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьТекстовоеСообщение(Знач Токен
, Знач Текст
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Клавиатура = "") Экспорт
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
КонецФункции
// Отправить картинку
// Отправляет картинку в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// URL - Строка - URL картинки - picture
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - булево - Отправка в канал или в чат бота - ischannel
// Описание - Строка - Аннотация к картинке - description
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
КонецФункции
// Отправить файл
// Отправляет файл (документ) в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// URL - Строка - URL файла - file
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
// Расширение - Строка - Расширение файла - ext
// Размер - Число - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьФайл(Знач Токен
, Знач URL
, Знач IDПользователя
, Знач ОтправкаВКанал
, Знач Расширение
, Знач Размер = "") Экспорт
Если Не ЗначениеЗаполнено(Размер) Тогда
Ответ = OPI_Инструменты.Get(URL);
Размер = Ответ.Размер();
КонецЕсли;
Строка_ = "Строка";
Расширение = СтрЗаменить(Расширение, ".", "");
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("URL" , URL , Строка_, Параметры);
OPI_Инструменты.ДобавитьПоле("Размер" , Размер , Строка_, Параметры);
OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры);
Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры);
КонецФункции
// Отправить контакт
// Отправляет контакт с номером телефона в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// ИмяКонтакта - Строка - Имя контакта - name
// НомерТелефона - Строка - Номер телефона - phone
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьКонтакт(Знач Токен
, Знач ИмяКонтакта
, Знач НомерТелефона
, Знач IDПользователя
, Знач ОтправкаВКанал) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("name" , ИмяКонтакта , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры);
Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры);
КонецФункции
// Отправить локацию
// Отправляет географические координаты в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// Широта - Строка,Число - Географическая широта - lat
// Долгота - Строка,Число - Географическая долгота - long
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры);
Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры);
КонецФункции
// Отправить ссылку
// Отправляет URL с предпросмотром в чат или канал
//
// Параметры:
// Токен - Строка - Токен - token
// URL - Строка - Отправляемая ссылка - url
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
КонецФункции
// Сформировать клавиатуру из массива кнопок
// Возвращает структура клавиатуры для сообщений
//
// Параметры:
// МассивКнопок - Массив из Строка - Массив кнопок - buttons
// ЦветКнопок - Строка - HEX цвет кнопок с # в начале - color
//
// Возвращаемое значение:
// Структура - Сформировать клавиатуру из массива кнопок:
// * Buttons - Массив из Структура - Массив сформированных кнопок
// * Type - Строка - Тип клавиатуры
Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
МассивСтруктурКнопок = Новый Массив;
СтруктураКлавиатуры = Новый Структура;
Для Каждого ТекстКнопки Из МассивКнопок Цикл
СтруктураКнопки = Новый Структура;
СтруктураКнопки.Вставить("ActionType", "reply");
СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
СтруктураКнопки.Вставить("Text" , ТекстКнопки);
СтруктураКнопки.Вставить("BgColor" , ЦветКнопок);
СтруктураКнопки.Вставить("Coloumns" , 3);
МассивСтруктурКнопок.Добавить(СтруктураКнопки);
КонецЦикла;
СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
СтруктураКлавиатуры.Вставить("Type" , "keyboard");
Возврат СтруктураКлавиатуры;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Отправить сообщение.
//
// Параметры:
// Токен - Строка - Токен
// Тип - Строка - Тип отправляемого сообщения
// IDПользователя - Строка,Число - ID пользователя Viber
// ЭтоКанал - Булево - Отправка в канал или чат с ботом
// Значение - Строка, Структура - Значение:
// * URL - Строка - При отправке URL
// * Размер - Число, Строка - Размер файла в случае отправке
// * Расширение - Строка - Расширение файла в случае отправки
// Текст - Строка - Текст сообщения
// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок
//
// Возвращаемое значение:
// Произвольный, HTTPОтвет - Отправить сообщение
Функция ОтправитьСообщение(Знач Токен
, Знач Тип
, Знач IDПользователя
, Знач ЭтоКанал
, Знач Значение = ""
, Знач Текст = ""
, Знач Клавиатура = "")
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура);
СтруктураПараметров = ВернутьСтандартныеПараметры();
СтруктураПараметров.Вставить("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);
Возврат СтруктураПараметров;
КонецФункции
Функция ТокенВЗаголовки(Знач Токен)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
СтруктураЗаголовков = Новый Соответствие;
СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
Возврат СтруктураЗаголовков;
КонецФункции
#КонецОбласти

File diff suppressed because it is too large Load Diff

View File

@ -1,112 +1,112 @@
// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os
// Библиотека: Yandex ID
// Команда CLI: yandex
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Получить код подтверждения
// Получает код подтверждения и адрес страницы, на которой его необходимо ввести
//
// Параметры:
// ClientId - Строка - Client id - id
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
Параметры = Новый Структура("client_id", ClientId);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Преобразовать код в токен
// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения
//
// Параметры:
// ClientId - Строка - Client id - id
// ClientSecret - Строка - Client secret - secret
// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства);
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "device_code");
Параметры.Вставить("code" , КодУстройства);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен
// Обновляет токен по Refresh token
//
// Параметры:
// ClientId - Строка - Client id - id
// ClientSecret - Строка - Client secret - secret
// RefreshToken - Строка - Refresh token - refresh
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "refresh_token");
Параметры.Вставить("refresh_token" , RefreshToken);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти
// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os
// Библиотека: Yandex ID
// Команда CLI: yandex
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
// Получить код подтверждения
// Получает код подтверждения и адрес страницы, на которой его необходимо ввести
//
// Параметры:
// ClientId - Строка - Client id - id
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
Параметры = Новый Структура("client_id", ClientId);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Преобразовать код в токен
// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения
//
// Параметры:
// ClientId - Строка - Client id - id
// ClientSecret - Строка - Client secret - secret
// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства);
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "device_code");
Параметры.Вставить("code" , КодУстройства);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
// Обновить токен
// Обновляет токен по Refresh token
//
// Параметры:
// ClientId - Строка - Client id - id
// ClientSecret - Строка - Client secret - secret
// RefreshToken - Строка - Refresh token - refresh
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
Параметры = Новый Структура;
Параметры.Вставить("grant_type" , "refresh_token");
Параметры.Вставить("refresh_token" , RefreshToken);
Параметры.Вставить("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
Возврат Ответ;
КонецФункции
#КонецОбласти

View File

@ -1,20 +1,20 @@
<package-def>
<module name="OPI_GoogleCalendar" file="core/Modules/OPI_GoogleCalendar.os"/>
<module name="OPI_Инструменты" file="tools/Modules/internal/Modules/OPI_Инструменты.os"/>
<module name="OPI_Notion" file="core/Modules/OPI_Notion.os"/>
<module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
<module name="OPI_GoogleDrive" file="core/Modules/OPI_GoogleDrive.os"/>
<module name="OPI_ПолучениеДанныхТестов" file="tools/Modules/OPI_ПолучениеДанныхТестов.os"/>
<module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>
<module name="OPI_Viber" file="core/Modules/OPI_Viber.os"/>
<module name="OPI_ПреобразованиеТипов" file="tools/Modules/OPI_ПреобразованиеТипов.os"/>
<module name="OPI_GoogleWorkspace" file="core/Modules/OPI_GoogleWorkspace.os"/>
<module name="OPI_YandexDisk" file="core/Modules/OPI_YandexDisk.os"/>
<module name="OPI_Dropbox" file="core/Modules/OPI_Dropbox.os"/>
<module name="OPI_Airtable" file="core/Modules/OPI_Airtable.os"/>
<module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
<module name="OPI_GoogleSheets" file="core/Modules/OPI_GoogleSheets.os"/>
<module name="OPI_YandexID" file="core/Modules/OPI_YandexID.os"/>
<module name="OPI_VK" file="core/Modules/OPI_VK.os"/>
<module name="OPI_Криптография" file="tools/Modules/internal/Modules/OPI_Криптография.os"/>
</package-def>
<package-def>
<module name="OPI_GoogleCalendar" file="core/Modules/OPI_GoogleCalendar.os"/>
<module name="OPI_Инструменты" file="tools/Modules/internal/Modules/OPI_Инструменты.os"/>
<module name="OPI_Notion" file="core/Modules/OPI_Notion.os"/>
<module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
<module name="OPI_GoogleDrive" file="core/Modules/OPI_GoogleDrive.os"/>
<module name="OPI_ПолучениеДанныхТестов" file="tools/Modules/OPI_ПолучениеДанныхТестов.os"/>
<module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>
<module name="OPI_Viber" file="core/Modules/OPI_Viber.os"/>
<module name="OPI_ПреобразованиеТипов" file="tools/Modules/OPI_ПреобразованиеТипов.os"/>
<module name="OPI_GoogleWorkspace" file="core/Modules/OPI_GoogleWorkspace.os"/>
<module name="OPI_YandexDisk" file="core/Modules/OPI_YandexDisk.os"/>
<module name="OPI_Dropbox" file="core/Modules/OPI_Dropbox.os"/>
<module name="OPI_Airtable" file="core/Modules/OPI_Airtable.os"/>
<module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
<module name="OPI_GoogleSheets" file="core/Modules/OPI_GoogleSheets.os"/>
<module name="OPI_YandexID" file="core/Modules/OPI_YandexID.os"/>
<module name="OPI_VK" file="core/Modules/OPI_VK.os"/>
<module name="OPI_Криптография" file="tools/Modules/internal/Modules/OPI_Криптография.os"/>
</package-def>

View File

@ -1,13 +1,13 @@
Описание.Имя("oint")
.Версия("1.9.0")
.Автор("bayselonarrend")
.АдресАвтора("bayselonarrend@gmail.com")
.Описание("Открытый пакет интеграций с популярными API")
.ВерсияСреды("1.0.7")
.ВключитьФайл("core")
.ВключитьФайл("tools")
.ВключитьФайл("tests")
.ВключитьФайл("lib.config")
.ВключитьФайл("../README.MD")
.ВключитьФайл("../LICENSE")
.ЗависитОт("asserts", "1.3.0")
Описание.Имя("oint")
.Версия("1.9.0")
.Автор("bayselonarrend")
.АдресАвтора("bayselonarrend@gmail.com")
.Описание("Открытый пакет интеграций с популярными API")
.ВерсияСреды("1.0.7")
.ВключитьФайл("core")
.ВключитьФайл("tools")
.ВключитьФайл("tests")
.ВключитьФайл("lib.config")
.ВключитьФайл("../README.MD")
.ВключитьФайл("../LICENSE")
.ЗависитОт("asserts", "1.3.0")

File diff suppressed because it is too large Load Diff

View File

@ -1,470 +1,470 @@
// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UsingHardcodePath-off
// BSLLS:Typo-off
// BSLLS:DeprecatedMessage-off
// BSLLS:UsingServiceTag-off
// BSLLS:ExecuteExternalCodeInCommonModule-off
// BSLLS:DuplicateStringLiteral-off
//@skip-check use-non-recommended-method
// Раскомментировать, если выполняется OneScript
#Использовать "./internal"
#Использовать asserts
#Область СлужебныйПрограммныйИнтерфейс
Функция ПолучитьСоответствиеРазделовТестирования() Экспорт
СтандартныеЗависимости = "[Decode, Build]";
ЗависимостиГугл = "Testing-GoogleWorkspace";
Разделы = Новый Структура;
Разделы.Вставить("Telegram" , СтандартныеЗависимости);
Разделы.Вставить("VK" , СтандартныеЗависимости);
Разделы.Вставить("Viber" , СтандартныеЗависимости);
Разделы.Вставить("Twitter" , СтандартныеЗависимости);
Разделы.Вставить("YandexDisk" , СтандартныеЗависимости);
Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости);
Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл);
Разделы.Вставить("GoogleDrive" , ЗависимостиГугл);
Разделы.Вставить("GoogleSheets" , ЗависимостиГугл);
Разделы.Вставить("Notion" , СтандартныеЗависимости);
Разделы.Вставить("Slack" , СтандартныеЗависимости);
Разделы.Вставить("Airtable" , СтандартныеЗависимости);
Разделы.Вставить("Dropbox" , СтандартныеЗависимости);
Возврат Разделы;
КонецФункции
Функция ПолучитьТаблицуТестов() Экспорт
Телеграм = "Telegram";
ВКонтакте = "VK";
ЯДиск = "YandexDisk";
Календарь = "GoogleCalendar";
Твиттер = "Twitter";
Вайбер = "Viber";
Драйв = "GoogleDrive";
ВСпейс = "GoogleWorkspace";
Ноушн = "Notion";
Слак = "Slack";
Таблицы = "GoogleSheets";
АирТ = "Airtable";
ДропБокс = "Dropbox";
ТаблицаТестов = Новый ТаблицаЗначений;
ТаблицаТестов.Колонки.Добавить("Метод");
ТаблицаТестов.Колонки.Добавить("Синоним");
ТаблицаТестов.Колонки.Добавить("Раздел");
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио" , "Отправить аудио" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент" , "Отправить документ" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку" , "Отправить гифку" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу" , "Отправить медиагруппу" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение" , "Отправить местоположение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт" , "Отправить контакт" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос" , "Отправить опрос" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение" , "Переслать сообщение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан" , "Бан/Разбан" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение" , "Создать ссылку-приглашение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм);
НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена", ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост" , "Создать/Удалить пост" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост" , "Создать/Удалить составной пост" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос" , "Создать опрос" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку" , "Добавить/Удалить картинку" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию" , "Создать историю" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений" , "Действия с обсуждениями" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент" , "Лайк/Репост/Комментарий" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику" , "Получить статистику" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов" , "Получить статистику постов" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию" , "Создать рекламную кампанию" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение" , "Отправить сообщение" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров" , "Получить категории товаров" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку" , "Создать товар и подборку" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами" , "Создать товар со свойствами" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров" , "Получить список товаров" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок" , "Получить список подборок" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств" , "Получить список свойств" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов" , "Получить список заказов" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео" , "Загрузить видео" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске" , "Получить информацию о диске" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку" , "Создать папку" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта" , "Создать копию объекта" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание" , "Получить ссылку на скачивание" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов" , "Получить список файлов" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект" , "Переместить объект" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов" , "Действия с публичными объектами", ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных" , "Получить список опубликованных" , ЯДиск);
НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , ВСпейс);
НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен" , "Получить токен" , ВСпейс);
НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен" , "Обновить токен" , ВСпейс);
НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей" , "Получить список календарей" , Календарь);
НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь" , "Создать/Удалить календарь" , Календарь);
НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие" , "Создать/Удалить событие" , Календарь);
НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий" , "Получить список событий" , Календарь);
НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов" , "Получить список каталогов" , Драйв);
НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить Файл" , Драйв);
НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий" , "Создать/Удалить кооментарий" , Драйв);
НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог" , "Создать/Удалить каталог" , Драйв);
НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу" , "Создать таблицу" , Таблицы);
НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу" , "Получить таблицу" , Таблицы);
НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки" , "Заполнить/Очистить ячейки" , Таблицы);
НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен" , "Обновить токен" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит" , "Текстовый твит" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой" , "Твит с картинкой" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео" , "Твит с видео" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф" , "Твит с гиф" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом" , "Твит с опросом" , Твиттер);
НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале" , "Получить информацию канала" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей" , "Получить онлайн пользователей" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку" , "Отправить картинку" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл" , "Отправить файл" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт" , "Отправить контакт" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию" , "Отправить локацию" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку" , "Отправить ссылку" , Вайбер);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу" , "Создать страницу" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу" , "Создать/Изменить базу" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице" , "Получить информацию о странице" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе" , "Получить информацию о базе" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу" , "Создать страницу в базу" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы" , "Изменить свойства страницы" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок" , "Создать/Удалить блок" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей" , "Получить список пользователей" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное" , "Отправить/Удалить эфемерное" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения" , "Получить отложенные сообщения" , Слак);
НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал" , "Создать/Архивировать канал" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов" , "Получить список каналов" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог" , "Открыть/Закрыть диалог" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов" , "Получить список файлов" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ" , "Получить список внеш. файлов" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ" , "Загрузить/Удалить внеш. файл" , Слак);
НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL" , "Загрузить файл по URL" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог" , "Создать каталог" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег" , "Создать/Удалить тег" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт" , "Получить данные аккаунта" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами" , "Работа с доступами" , ДропБокс);
Возврат ТаблицаТестов;
КонецФункции
Функция ОжидаетЧто(Значение) Экспорт
Попытка
Модуль = ПолучитьОбщийМодуль("ЮТест");
Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль");
Возврат Модуль.ОжидаетЧто(Значение);
Исключение
Возврат Ожидаем.Что(Значение);
КонецПопытки;
КонецФункции
Функция СформироватьТестыЯкс() Экспорт
Модуль = ПолучитьОбщийМодуль("ЮТТесты");
Разделы = ПолучитьСоответствиеРазделовТестирования();
ТаблицаТестов = ПолучитьТаблицуТестов();
Для Каждого Раздел Из Разделы Цикл
ТекущийРаздел = Раздел.Ключ;
Отбор = Новый Структура("Раздел", ТекущийРаздел);
ТестыРаздела = ТаблицаТестов.НайтиСтроки(Отбор);
Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел);
Для Каждого Тест Из ТестыРаздела Цикл
Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним);
КонецЦикла;
КонецЦикла;
Возврат "";
КонецФункции
Функция СформироватьТестыАссертс() Экспорт
ТаблицаТестов = ПолучитьТаблицуТестов();
МассивТестов = Новый Массив;
Для Каждого Тест Из ТаблицаТестов Цикл
МассивТестов.Добавить(Тест.Метод);
КонецЦикла;
Возврат МассивТестов;
КонецФункции
Функция ПолучитьПараметр(Параметр) Экспорт
Путь = ПутьКФайлуДанных();
Возврат ПолучитьЗначениеИзФайла(Параметр, Путь);
КонецФункции
Функция ПолучитьДвоичные(Параметр) Экспорт
Путь = ПутьКФайлуДанных();
ПараметрЛокальный = Параметр + "Local";
ЗначениеОсновной = ПолучитьЗначениеИзФайла(Параметр , Путь);
ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь);
ФайлЛокальный = Новый Файл(ЗначениеЛокальный);
Если ФайлЛокальный.Существует() Тогда
Значение = Новый ДвоичныеДанные(ЗначениеЛокальный);
Иначе
Значение = ЗначениеОсновной;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный);
КонецЕсли;
Возврат Значение;
КонецФункции
Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт
Если СтрНайти(Путь, "http") > 0
Или СтрНайти(Путь, "www") > 0 Тогда
ИВФ = ПолучитьИмяВременногоФайла();
КопироватьФайл(Путь, ИВФ);
Путь = ИВФ;
Двоичные = Новый ДвоичныеДанные(Путь);
Если СохранятьЛокально Тогда
ЗаписатьПараметр(ПараметрЛокальный, ИВФ);
Иначе
УдалитьФайлы(ИВФ);
КонецЕсли;
Иначе
Двоичные = Новый ДвоичныеДанные(Путь);
КонецЕсли;
Возврат Двоичные;
КонецФункции
Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт
Значение = ПолучитьПараметр(Параметр);
Коллекция.Вставить(Параметр, Значение);
КонецПроцедуры
Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт
Значение = ПолучитьДвоичные(Параметр);
Коллекция.Вставить(Параметр, Значение);
КонецПроцедуры
Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт
Путь = ПутьКФайлуДанных();
ЗаписатьПараметрВФайл(Параметр, Значение, Путь);
КонецПроцедуры
Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт
Шапка = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод;
Попытка
Данные = OPI_Инструменты.JSONСтрокой(Результат);
Исключение
Данные = "Не JSON: " + Строка(Результат);
КонецПопытки;
Данные = " " + Данные;
Сообщить(Шапка);
Сообщить(Символы.ПС);
Сообщить(Данные);
Сообщить(Символы.ПС);
Сообщить("---------------------------------");
Сообщить(Символы.ПС);
Если ЗначениеЗаполнено(Библиотека) Тогда
ЗаписатьФайлЛога(Данные, Метод, Библиотека);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьЗначениеИзФайла(Параметр, Путь)
Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], "");
КонецФункции
Функция ПутьКФайлуДанных()
Путь = "";
ВозможныеПути = Новый Массив;
ВозможныеПути.Добавить("./data.json");
ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json");
ВозможныеПути.Добавить("D:\GD\Мой диск\data.json");
Для Каждого ВозможныйПуть Из ВозможныеПути Цикл
ФайлРепозитория = Новый Файл(ВозможныйПуть);
Если ФайлРепозитория.Существует() Тогда
Путь = ВозможныйПуть;
КонецЕсли;
КонецЦикла;
Возврат Путь;
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции
Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел)
НовыйТест = ТаблицаЗначений.Добавить();
НовыйТест.Метод = Метод;
НовыйТест.Синоним = Синоним;
НовыйТест.Раздел = Раздел;
КонецПроцедуры
Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь)
Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
Значения.Вставить(Параметр, Значение);
Запись = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON);
ЗаписатьJSON(Запись, Значения);
Запись.Закрыть();
КонецПроцедуры
Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека)
Попытка
ПутьЛогов = "./docs/results";
ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека;
КаталогЛогов = Новый Файл(ПутьЛогов);
Если Не КаталогЛогов.Существует() Тогда
СоздатьКаталог(ПутьЛогов);
КонецЕсли;
КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки);
Если Не КаталогЛоговБиблиотеки.Существует() Тогда
СоздатьКаталог(ПутьЛоговБиблиотеки);
КонецЕсли;
ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log";
ФайлЛога = Новый Файл(ПутьКФайлу);
Если Не ФайлЛога.Существует() Тогда
ДокументЛога = Новый ТекстовыйДокумент;
ДокументЛога.УстановитьТекст(Данные);
ДокументЛога.Записать(ПутьКФайлу);
КонецЕсли;
Исключение
Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
#КонецОбласти
// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UsingHardcodePath-off
// BSLLS:Typo-off
// BSLLS:DeprecatedMessage-off
// BSLLS:UsingServiceTag-off
// BSLLS:ExecuteExternalCodeInCommonModule-off
// BSLLS:DuplicateStringLiteral-off
//@skip-check use-non-recommended-method
// Раскомментировать, если выполняется OneScript
#Использовать "./internal"
#Использовать asserts
#Область СлужебныйПрограммныйИнтерфейс
Функция ПолучитьСоответствиеРазделовТестирования() Экспорт
СтандартныеЗависимости = "[Decode, Build]";
ЗависимостиГугл = "Testing-GoogleWorkspace";
Разделы = Новый Структура;
Разделы.Вставить("Telegram" , СтандартныеЗависимости);
Разделы.Вставить("VK" , СтандартныеЗависимости);
Разделы.Вставить("Viber" , СтандартныеЗависимости);
Разделы.Вставить("Twitter" , СтандартныеЗависимости);
Разделы.Вставить("YandexDisk" , СтандартныеЗависимости);
Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости);
Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл);
Разделы.Вставить("GoogleDrive" , ЗависимостиГугл);
Разделы.Вставить("GoogleSheets" , ЗависимостиГугл);
Разделы.Вставить("Notion" , СтандартныеЗависимости);
Разделы.Вставить("Slack" , СтандартныеЗависимости);
Разделы.Вставить("Airtable" , СтандартныеЗависимости);
Разделы.Вставить("Dropbox" , СтандартныеЗависимости);
Возврат Разделы;
КонецФункции
Функция ПолучитьТаблицуТестов() Экспорт
Телеграм = "Telegram";
ВКонтакте = "VK";
ЯДиск = "YandexDisk";
Календарь = "GoogleCalendar";
Твиттер = "Twitter";
Вайбер = "Viber";
Драйв = "GoogleDrive";
ВСпейс = "GoogleWorkspace";
Ноушн = "Notion";
Слак = "Slack";
Таблицы = "GoogleSheets";
АирТ = "Airtable";
ДропБокс = "Dropbox";
ТаблицаТестов = Новый ТаблицаЗначений;
ТаблицаТестов.Колонки.Добавить("Метод");
ТаблицаТестов.Колонки.Добавить("Синоним");
ТаблицаТестов.Колонки.Добавить("Раздел");
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио" , "Отправить аудио" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент" , "Отправить документ" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку" , "Отправить гифку" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу" , "Отправить медиагруппу" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение" , "Отправить местоположение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт" , "Отправить контакт" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос" , "Отправить опрос" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение" , "Переслать сообщение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан" , "Бан/Разбан" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение" , "Создать ссылку-приглашение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм);
НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм);
НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена", ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост" , "Создать/Удалить пост" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост" , "Создать/Удалить составной пост" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос" , "Создать опрос" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку" , "Добавить/Удалить картинку" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию" , "Создать историю" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений" , "Действия с обсуждениями" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент" , "Лайк/Репост/Комментарий" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику" , "Получить статистику" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов" , "Получить статистику постов" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию" , "Создать рекламную кампанию" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение" , "Отправить сообщение" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров" , "Получить категории товаров" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку" , "Создать товар и подборку" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами" , "Создать товар со свойствами" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров" , "Получить список товаров" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок" , "Получить список подборок" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств" , "Получить список свойств" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов" , "Получить список заказов" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео" , "Загрузить видео" , ВКонтакте);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске" , "Получить информацию о диске" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку" , "Создать папку" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта" , "Создать копию объекта" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание" , "Получить ссылку на скачивание" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов" , "Получить список файлов" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект" , "Переместить объект" , ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов" , "Действия с публичными объектами", ЯДиск);
НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных" , "Получить список опубликованных" , ЯДиск);
НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , ВСпейс);
НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен" , "Получить токен" , ВСпейс);
НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен" , "Обновить токен" , ВСпейс);
НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей" , "Получить список календарей" , Календарь);
НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь" , "Создать/Удалить календарь" , Календарь);
НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие" , "Создать/Удалить событие" , Календарь);
НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий" , "Получить список событий" , Календарь);
НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов" , "Получить список каталогов" , Драйв);
НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить Файл" , Драйв);
НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий" , "Создать/Удалить кооментарий" , Драйв);
НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог" , "Создать/Удалить каталог" , Драйв);
НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу" , "Создать таблицу" , Таблицы);
НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу" , "Получить таблицу" , Таблицы);
НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки" , "Заполнить/Очистить ячейки" , Таблицы);
НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен" , "Обновить токен" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит" , "Текстовый твит" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой" , "Твит с картинкой" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео" , "Твит с видео" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф" , "Твит с гиф" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом" , "Твит с опросом" , Твиттер);
НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале" , "Получить информацию канала" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей" , "Получить онлайн пользователей" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку" , "Отправить картинку" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл" , "Отправить файл" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт" , "Отправить контакт" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию" , "Отправить локацию" , Вайбер);
НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку" , "Отправить ссылку" , Вайбер);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу" , "Создать страницу" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу" , "Создать/Изменить базу" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице" , "Получить информацию о странице" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе" , "Получить информацию о базе" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу" , "Создать страницу в базу" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы" , "Изменить свойства страницы" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок" , "Создать/Удалить блок" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей" , "Получить список пользователей" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное" , "Отправить/Удалить эфемерное" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения" , "Получить отложенные сообщения" , Слак);
НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал" , "Создать/Архивировать канал" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов" , "Получить список каналов" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог" , "Открыть/Закрыть диалог" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов" , "Получить список файлов" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ" , "Получить список внеш. файлов" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ" , "Загрузить/Удалить внеш. файл" , Слак);
НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ);
НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL" , "Загрузить файл по URL" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог" , "Создать каталог" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег" , "Создать/Удалить тег" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт" , "Получить данные аккаунта" , ДропБокс);
НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами" , "Работа с доступами" , ДропБокс);
Возврат ТаблицаТестов;
КонецФункции
Функция ОжидаетЧто(Значение) Экспорт
Попытка
Модуль = ПолучитьОбщийМодуль("ЮТест");
Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль");
Возврат Модуль.ОжидаетЧто(Значение);
Исключение
Возврат Ожидаем.Что(Значение);
КонецПопытки;
КонецФункции
Функция СформироватьТестыЯкс() Экспорт
Модуль = ПолучитьОбщийМодуль("ЮТТесты");
Разделы = ПолучитьСоответствиеРазделовТестирования();
ТаблицаТестов = ПолучитьТаблицуТестов();
Для Каждого Раздел Из Разделы Цикл
ТекущийРаздел = Раздел.Ключ;
Отбор = Новый Структура("Раздел", ТекущийРаздел);
ТестыРаздела = ТаблицаТестов.НайтиСтроки(Отбор);
Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел);
Для Каждого Тест Из ТестыРаздела Цикл
Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним);
КонецЦикла;
КонецЦикла;
Возврат "";
КонецФункции
Функция СформироватьТестыАссертс() Экспорт
ТаблицаТестов = ПолучитьТаблицуТестов();
МассивТестов = Новый Массив;
Для Каждого Тест Из ТаблицаТестов Цикл
МассивТестов.Добавить(Тест.Метод);
КонецЦикла;
Возврат МассивТестов;
КонецФункции
Функция ПолучитьПараметр(Параметр) Экспорт
Путь = ПутьКФайлуДанных();
Возврат ПолучитьЗначениеИзФайла(Параметр, Путь);
КонецФункции
Функция ПолучитьДвоичные(Параметр) Экспорт
Путь = ПутьКФайлуДанных();
ПараметрЛокальный = Параметр + "Local";
ЗначениеОсновной = ПолучитьЗначениеИзФайла(Параметр , Путь);
ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь);
ФайлЛокальный = Новый Файл(ЗначениеЛокальный);
Если ФайлЛокальный.Существует() Тогда
Значение = Новый ДвоичныеДанные(ЗначениеЛокальный);
Иначе
Значение = ЗначениеОсновной;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный);
КонецЕсли;
Возврат Значение;
КонецФункции
Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт
Если СтрНайти(Путь, "http") > 0
Или СтрНайти(Путь, "www") > 0 Тогда
ИВФ = ПолучитьИмяВременногоФайла();
КопироватьФайл(Путь, ИВФ);
Путь = ИВФ;
Двоичные = Новый ДвоичныеДанные(Путь);
Если СохранятьЛокально Тогда
ЗаписатьПараметр(ПараметрЛокальный, ИВФ);
Иначе
УдалитьФайлы(ИВФ);
КонецЕсли;
Иначе
Двоичные = Новый ДвоичныеДанные(Путь);
КонецЕсли;
Возврат Двоичные;
КонецФункции
Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт
Значение = ПолучитьПараметр(Параметр);
Коллекция.Вставить(Параметр, Значение);
КонецПроцедуры
Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт
Значение = ПолучитьДвоичные(Параметр);
Коллекция.Вставить(Параметр, Значение);
КонецПроцедуры
Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт
Путь = ПутьКФайлуДанных();
ЗаписатьПараметрВФайл(Параметр, Значение, Путь);
КонецПроцедуры
Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт
Шапка = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод;
Попытка
Данные = OPI_Инструменты.JSONСтрокой(Результат);
Исключение
Данные = "Не JSON: " + Строка(Результат);
КонецПопытки;
Данные = " " + Данные;
Сообщить(Шапка);
Сообщить(Символы.ПС);
Сообщить(Данные);
Сообщить(Символы.ПС);
Сообщить("---------------------------------");
Сообщить(Символы.ПС);
Если ЗначениеЗаполнено(Библиотека) Тогда
ЗаписатьФайлЛога(Данные, Метод, Библиотека);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьЗначениеИзФайла(Параметр, Путь)
Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], "");
КонецФункции
Функция ПутьКФайлуДанных()
Путь = "";
ВозможныеПути = Новый Массив;
ВозможныеПути.Добавить("./data.json");
ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json");
ВозможныеПути.Добавить("D:\GD\Мой диск\data.json");
Для Каждого ВозможныйПуть Из ВозможныеПути Цикл
ФайлРепозитория = Новый Файл(ВозможныйПуть);
Если ФайлРепозитория.Существует() Тогда
Путь = ВозможныйПуть;
КонецЕсли;
КонецЦикла;
Возврат Путь;
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции
Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел)
НовыйТест = ТаблицаЗначений.Добавить();
НовыйТест.Метод = Метод;
НовыйТест.Синоним = Синоним;
НовыйТест.Раздел = Раздел;
КонецПроцедуры
Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь)
Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
Значения.Вставить(Параметр, Значение);
Запись = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON);
ЗаписатьJSON(Запись, Значения);
Запись.Закрыть();
КонецПроцедуры
Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека)
Попытка
ПутьЛогов = "./docs/results";
ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека;
КаталогЛогов = Новый Файл(ПутьЛогов);
Если Не КаталогЛогов.Существует() Тогда
СоздатьКаталог(ПутьЛогов);
КонецЕсли;
КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки);
Если Не КаталогЛоговБиблиотеки.Существует() Тогда
СоздатьКаталог(ПутьЛоговБиблиотеки);
КонецЕсли;
ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log";
ФайлЛога = Новый Файл(ПутьКФайлу);
Если Не ФайлЛога.Существует() Тогда
ДокументЛога = Новый ТекстовыйДокумент;
ДокументЛога.УстановитьТекст(Данные);
ДокументЛога.Записать(ПутьКФайлу);
КонецЕсли;
Исключение
Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
#КонецОбласти

View File

@ -1,320 +1,320 @@
// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
#Использовать "./internal"
#Область СлужебныйПрограммныйИнтерфейс
Процедура ПолучитьДвоичныеДанные(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Возврат;
Иначе
Файл = Новый Файл(Значение);
Если Файл.Существует() Тогда
Значение = Новый ДвоичныеДанные(Значение);
ИначеЕсли СтрНайти(Значение, "//") Тогда
Значение = OPI_Инструменты.Get(Значение);
Иначе
Значение = Base64Значение(Значение);
КонецЕсли;
КонецЕсли;
Исключение
ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
ПолучитьДвоичныеДанные(Значение);
Возврат;
КонецЕсли;
Файл = Новый Файл(Значение);
Если Файл.Существует() Тогда
Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть);
Иначе
ПолучитьДвоичныеДанные(Значение);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьКоллекцию(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
ИсходноеЗначение = Значение;
Если ЭтоКоллекция(Значение) Тогда
Возврат;
Иначе
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
Иначе
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
КонецЕсли;
Файл = Новый Файл(Значение);
ЧтениеJSON = Новый ЧтениеJSON;
Если Файл.Существует() Тогда
ЧтениеJSON.ОткрытьФайл(Значение);
ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
ИВФ = ПолучитьИмяВременногоФайла();
КопироватьФайл(Значение, ИВФ);
ЧтениеJSON.ОткрытьФайл(ИВФ);
ЧтениеJSON.Прочитать();
УдалитьФайлы(ИВФ);
Иначе
ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
КонецЕсли;
Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
ЧтениеJSON.Закрыть();
Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда
Значение = ИсходноеЗначение;
ПолучитьМассив(Значение);
КонецЕсли;
КонецЕсли;
Исключение
Значение = ИсходноеЗначение;
ПолучитьМассив(Значение);
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Строка")
И СтрНачинаетсяС(Значение, "[")
И СтрЗаканчиваетсяНа(Значение, "]") Тогда
ЗапятаяВКавычках = "','";
Значение = СтрЗаменить(Значение, "['" , "");
Значение = СтрЗаменить(Значение, "']" , "");
Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках);
Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках);
Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках);
Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь);
Для Н = 0 По Значение.ВГраница() Цикл
Значение[Н] = СокрЛП(Значение[Н]);
КонецЦикла;
Иначе
Если ТипЗнч(Значение) = Тип("Число") Тогда
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
КонецЕсли;
OPI_Инструменты.ЗначениеВМассив(Значение);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьБулево(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат;
Иначе
Значение = Булево(Значение);
КонецЕсли;
Исключение
ВызватьИсключение "Ошибка получения данных булево из параметра";
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ЭтоСимвольное(Значение) Тогда
Если Не ИзИсточника Тогда
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
Возврат;
КонецЕсли;
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
Файл = Новый Файл(Значение);
Если Файл.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста(Значение);
Значение = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
ИВФ = ПолучитьИмяВременногоФайла();
КопироватьФайл(Значение, ИВФ);
ЧтениеТекста = Новый ЧтениеТекста(ИВФ);
Значение = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИВФ);
Иначе
Возврат;
КонецЕсли;
ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
ИначеЕсли ЭтоКоллекция(Значение) Тогда
Значение = OPI_Инструменты.JSONСтрокой(Значение);
Иначе
Возврат;
КонецЕсли;
Исключение
Значение = Строка(Значение);
Возврат;
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьДату(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Дата = "Дата";
Попытка
Если ТипЗнч(Значение) = Тип(Дата) Тогда
Возврат;
Иначе
Значение = XMLЗначение(Тип(Дата), Значение);
КонецЕсли;
Исключение
ООД = Новый ОписаниеТипов(Дата);
Значение = ООД.ПривестиЗначение(Значение);
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьЧисло(Значение) Экспорт
ОписаниеТипа = Новый ОписаниеТипов("Число");
Значение = ОписаниеТипа.ПривестиЗначение(Значение);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЭтоКоллекция(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Массив")
Или ТипЗнч(Значение) = Тип("Структура")
Или ТипЗнч(Значение) = Тип("Соответствие");
КонецФункции
Функция ЭтоСимвольное(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Строка")
Или ТипЗнч(Значение) = Тип("Число")
Или ТипЗнч(Значение) = Тип("Дата");
КонецФункции
#КонецОбласти
// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
#Использовать "./internal"
#Область СлужебныйПрограммныйИнтерфейс
Процедура ПолучитьДвоичныеДанные(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Возврат;
Иначе
Файл = Новый Файл(Значение);
Если Файл.Существует() Тогда
Значение = Новый ДвоичныеДанные(Значение);
ИначеЕсли СтрНайти(Значение, "//") Тогда
Значение = OPI_Инструменты.Get(Значение);
Иначе
Значение = Base64Значение(Значение);
КонецЕсли;
КонецЕсли;
Исключение
ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
ПолучитьДвоичныеДанные(Значение);
Возврат;
КонецЕсли;
Файл = Новый Файл(Значение);
Если Файл.Существует() Тогда
Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть);
Иначе
ПолучитьДвоичныеДанные(Значение);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьКоллекцию(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
ИсходноеЗначение = Значение;
Если ЭтоКоллекция(Значение) Тогда
Возврат;
Иначе
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
Иначе
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
КонецЕсли;
Файл = Новый Файл(Значение);
ЧтениеJSON = Новый ЧтениеJSON;
Если Файл.Существует() Тогда
ЧтениеJSON.ОткрытьФайл(Значение);
ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
ИВФ = ПолучитьИмяВременногоФайла();
КопироватьФайл(Значение, ИВФ);
ЧтениеJSON.ОткрытьФайл(ИВФ);
ЧтениеJSON.Прочитать();
УдалитьФайлы(ИВФ);
Иначе
ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
КонецЕсли;
Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
ЧтениеJSON.Закрыть();
Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда
Значение = ИсходноеЗначение;
ПолучитьМассив(Значение);
КонецЕсли;
КонецЕсли;
Исключение
Значение = ИсходноеЗначение;
ПолучитьМассив(Значение);
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Строка")
И СтрНачинаетсяС(Значение, "[")
И СтрЗаканчиваетсяНа(Значение, "]") Тогда
ЗапятаяВКавычках = "','";
Значение = СтрЗаменить(Значение, "['" , "");
Значение = СтрЗаменить(Значение, "']" , "");
Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках);
Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках);
Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках);
Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь);
Для Н = 0 По Значение.ВГраница() Цикл
Значение[Н] = СокрЛП(Значение[Н]);
КонецЦикла;
Иначе
Если ТипЗнч(Значение) = Тип("Число") Тогда
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
КонецЕсли;
OPI_Инструменты.ЗначениеВМассив(Значение);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьБулево(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат;
Иначе
Значение = Булево(Значение);
КонецЕсли;
Исключение
ВызватьИсключение "Ошибка получения данных булево из параметра";
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если ЭтоСимвольное(Значение) Тогда
Если Не ИзИсточника Тогда
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
Возврат;
КонецЕсли;
Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
Файл = Новый Файл(Значение);
Если Файл.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста(Значение);
Значение = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
ИВФ = ПолучитьИмяВременногоФайла();
КопироватьФайл(Значение, ИВФ);
ЧтениеТекста = Новый ЧтениеТекста(ИВФ);
Значение = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИВФ);
Иначе
Возврат;
КонецЕсли;
ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
ИначеЕсли ЭтоКоллекция(Значение) Тогда
Значение = OPI_Инструменты.JSONСтрокой(Значение);
Иначе
Возврат;
КонецЕсли;
Исключение
Значение = Строка(Значение);
Возврат;
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьДату(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Дата = "Дата";
Попытка
Если ТипЗнч(Значение) = Тип(Дата) Тогда
Возврат;
Иначе
Значение = XMLЗначение(Тип(Дата), Значение);
КонецЕсли;
Исключение
ООД = Новый ОписаниеТипов(Дата);
Значение = ООД.ПривестиЗначение(Значение);
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьЧисло(Значение) Экспорт
ОписаниеТипа = Новый ОписаниеТипов("Число");
Значение = ОписаниеТипа.ПривестиЗначение(Значение);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЭтоКоллекция(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Массив")
Или ТипЗнч(Значение) = Тип("Структура")
Или ТипЗнч(Значение) = Тип("Соответствие");
КонецФункции
Функция ЭтоСимвольное(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Строка")
Или ТипЗнч(Значение) = Тип("Число")
Или ТипЗнч(Значение) = Тип("Дата");
КонецФункции
#КонецОбласти

View File

@ -1,110 +1,110 @@
// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
#Область СлужебныйПрограммныйИнтерфейс
#Область БСП
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 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);
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
КонецФункции
Функция ПовторитьСтроку(Строка, Количество) Экспорт
Части = Новый Массив(Количество);
Для К = 1 По Количество Цикл
Части.Добавить(Строка);
КонецЦикла;
Возврат СтрСоединить(Части, "");
КонецФункции
#КонецОбласти
#КонецОбласти
// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
// 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
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
#Область СлужебныйПрограммныйИнтерфейс
#Область БСП
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 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);
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
КонецФункции
Функция ПовторитьСтроку(Строка, Количество) Экспорт
Части = Новый Массив(Количество);
Для К = 1 По Количество Цикл
Части.Добавить(Строка);
КонецЦикла;
Возврат СтрСоединить(Части, "");
КонецФункции
#КонецОбласти
#КонецОбласти