1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-03-17 21:08:03 +02:00

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

This commit is contained in:
Vitaly the Alpaca 2024-04-17 11:25:07 +00:00 committed by Vitaly the Alpaca (bot)
parent 122676010e
commit e3e28253e2
9 changed files with 248 additions and 61 deletions

View File

@ -540,7 +540,8 @@
СоответствиеФайла.Вставить(Файл, MIME);
Размер = Файл.Размер();
РазмерЧасти = 268435456 + 1;
РазмерЧасти = 268435456;
РазмерЧасти = РазмерЧасти + 1;
Если Размер < РазмерЧасти Тогда
Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
@ -578,10 +579,8 @@
Прервать;
КонецЦикла;
РазмерЧасти = 268435456;
URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
АдресЗагрузки = Ответ.Заголовки["Location"];
Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
@ -589,15 +588,27 @@
Возврат Ответ;
КонецЕсли;
ПрочитанноБайт = 0;
ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ);
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецФункции
Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки)
Ответ = "";
РазмерЧасти = 268435456;
ПрочитаноБайт = 0;
ТекущаяПозиция = 0;
ОбщийРазмер = Двоичные.Размер();
СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер);
Пока ПрочитанноБайт < ОбщийРазмер Цикл
Пока ПрочитаноБайт < ОбщийРазмер Цикл
ЧтениеДанных = Новый ЧтениеДанных(Двоичные);
ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
РазмерТекущих = ТекущиеДанные.Размер();
@ -621,41 +632,11 @@
Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
Если Ответ.КодСостояния >= 400 И Ответ.КодСостояния < 600 Тогда
ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
Если ОтветПроверки.КодСостояния >= 200 И ОтветПроверки.КодСостояния < 300 Тогда
OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
Возврат ОтветПроверки;
ИначеЕсли ОтветПроверки.КодСостояния = 308 Тогда
ЗагруженныеДанные = Ответ.Заголовки["Range"];
Иначе
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецЕсли;
Иначе
ЗагруженныеДанные = Ответ.Заголовки["Range"];
КонецЕсли;
Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецЕсли;
ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
Если Не МассивИнформации.Количество() = 2 Тогда
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецЕсли;
ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
Если ЗначениеЗаполнено(РезультатПроверки) Тогда
Возврат РезультатПроверки;
КонецЕсли;
СтрТекущаяПозицияМБ = OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция / 1024 / 1024);
СтрОбщийРазмерМБ = OPI_Инструменты.ЧислоВСтроку(Окр(ОбщийРазмер / 1024 / 1024, 2));
@ -668,9 +649,63 @@
КонецЦикла;
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецФункции
Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
НачалоКодовОшибок = 400;
КонецКодовПадений = 600;
НачалоКодовУспеха = 200;
КонецКодовУспеха = 300;
Перенаправление = 308;
Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
Возврат ОтветПроверки;
ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
ЗагруженныеДанные = Ответ.Заголовки["Range"];
Иначе
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецЕсли;
Иначе
ЗагруженныеДанные = Ответ.Заголовки["Range"];
КонецЕсли;
Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецЕсли;
ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
НеобходимоЧастей = 2;
Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
OPI_Инструменты.ОбработатьОтвет(Ответ);
Возврат Ответ;
КонецЕсли;
ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
Возврат "";
КонецФункции
#КонецОбласти

View File

@ -30,14 +30,47 @@
#Область ПрограммныйИнтерфейс
#Область УправлениеИНастройки
Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
URL = "https://slack.com/api/auth.test";
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
Функция ПолучитьСписокРабочихОбластей(Знач Токен) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
URL = "https://slack.com/api/auth.teams.list";
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область РаботаСЧатами
Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст) Экспорт
Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст, Знач МассивБлоков = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Канал);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
ЕстьБлоки = ЗначениеЗаполнено(МассивБлоков);
URL = "https://slack.com/api/chat.postMessage";
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
@ -45,12 +78,55 @@
Параметры.Вставить("channel", Канал);
Параметры.Вставить("text" , Текст);
Если ЕстьБлоки Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивБлоков);
Параметры.Вставить("blocks" , МассивБлоков);
КонецЕсли;
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Канал);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Отметка);
URL = "https://slack.com/api/chat.delete";
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Параметры = Новый Структура;
Параметры.Вставить("channel", Канал);
Параметры.Вставить("ts" , Отметка);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти
#Область ФормированиеБлоков
Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
OPI_ПреобразованиеТипов.ПолучитьСтроку(АльтернативныйТекст);
Блок = Новый Соответствие;
Блок.Вставить("type" , "image");
Блок.Вставить("image_url", URL);
Блок.Вставить("alt_text" , АльтернативныйТекст);
Возврат Блок;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -26,6 +26,7 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnreachableCode-off
// BSLLS:CommentedCode-off
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
@ -69,7 +70,7 @@
Ответ = OPI_Инструменты.Get(URL);
Возврат Ответ;
КонецФункции
КонецФункции
// Установить Webhook
// Устанавливает URL обработчика событий бота для работы в режиме Webhook
@ -961,7 +962,7 @@
Если ОднаПодОдной Тогда
Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
Иначе
Строки = СоздатьДлиннуюКлваиатуру(МассивКнопок);
Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
КонецЕсли;
Если ПодСообщением Тогда
@ -1136,7 +1137,7 @@
КонецФункции
Функция СоздатьДлиннуюКлваиатуру(Знач МассивКнопок)
Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)
Строки = Новый Массив;
Кнопки = Новый Массив;

View File

@ -641,9 +641,7 @@
ProcessingInfo = "processing_info";
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
Информация = Ответ[ProcessingInfo];
Если Не ЗначениеЗаполнено(Информация) Тогда

View File

@ -29,6 +29,7 @@
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:UnusedLocalVariable-off
//@skip-check method-too-many-params

View File

@ -2830,14 +2830,77 @@
#Область Slack
Процедура Слак_ОтправитьСообщение() Экспорт
Процедура Слак_ПолучитьИнформациюОБоте() Экспорт
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте");
Проверка_СлакОк(Результат);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено();
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено();
КонецПроцедуры
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
Текст = "Тестовое сообщение";
Процедура Слак_ПолучитьСписокОбластей() Экспорт
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей");
Проверка_СлакОк(Результат);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив");
КонецПроцедуры
Процедура Слак_ОтправитьУдалитьСообщение() Экспорт
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
Текст = "Тестовое сообщение 1";
Отметки = Новый Массив;
Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
Проверка_СлакОк(Результат);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
Отметки.Добавить(Результат["ts"]);
МассивБлоков = Новый Массив;
Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
МассивБлоков.Добавить(Блок);
Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, МассивБлоков);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
Проверка_СлакОк(Результат);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
Отметки.Добавить(Результат["ts"]);
Для Каждого Отметка Из Отметки Цикл
Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
Проверка_СлакОк(Результат);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
КонецЦикла;
КонецПроцедуры
#КонецОбласти
@ -2971,6 +3034,13 @@
КонецПроцедуры
Процедура Проверка_СлакОк(Знач Результат)
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -332,7 +332,9 @@
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн);
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн);
НовыйТест(ТаблицаТестов, "Слак_ОтправитьСообщение" , "Отправить сообщение" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак);
НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак);
Возврат ТаблицаТестов;

View File

@ -134,7 +134,11 @@
КонецПроцедуры
Процедура ПолучитьМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Строка")
И СтрНачинаетсяС(Значение, "[")
И СтрЗаканчиваетсяНа(Значение, "]") Тогда

View File

@ -27,6 +27,7 @@
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnusedLocalVariable-off
// BSLLS:UsingServiceTag-off
// BSLLS:NumberOfOptionalParams-off
//@skip-check module-unused-local-variable
//@skip-check method-too-many-params
@ -388,7 +389,7 @@
Параметры = Новый Структура;
КонецЕсли;
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
@ -782,7 +783,6 @@
Прервать;
КонецЕсли;
ЗаписьДанных.Записать(ТекущиеДанные);
ОсвободитьОбъект(ТекущиеДанные);