diff --git a/OInt/core/Modules/OPI_GoogleDrive.os b/OInt/core/Modules/OPI_GoogleDrive.os index 9418ebe2ee..4697fa0f64 100644 --- a/OInt/core/Modules/OPI_GoogleDrive.os +++ b/OInt/core/Modules/OPI_GoogleDrive.os @@ -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; + + Возврат ""; + КонецФункции #КонецОбласти diff --git a/OInt/core/Modules/OPI_Slack.os b/OInt/core/Modules/OPI_Slack.os index bc9529d468..87ecc54d99 100644 --- a/OInt/core/Modules/OPI_Slack.os +++ b/OInt/core/Modules/OPI_Slack.os @@ -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" , АльтернативныйТекст); + + Возврат Блок; + +КонецФункции + #КонецОбласти #КонецОбласти diff --git a/OInt/core/Modules/OPI_Telegram.os b/OInt/core/Modules/OPI_Telegram.os index 7913aa6d32..939acc20ad 100644 --- a/OInt/core/Modules/OPI_Telegram.os +++ b/OInt/core/Modules/OPI_Telegram.os @@ -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 @@ КонецФункции -Функция СоздатьДлиннуюКлваиатуру(Знач МассивКнопок) +Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок) Строки = Новый Массив; Кнопки = Новый Массив; diff --git a/OInt/core/Modules/OPI_Twitter.os b/OInt/core/Modules/OPI_Twitter.os index 969bd078a4..1a3169ab8d 100644 --- a/OInt/core/Modules/OPI_Twitter.os +++ b/OInt/core/Modules/OPI_Twitter.os @@ -641,9 +641,7 @@ ProcessingInfo = "processing_info"; Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL); - Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - - + Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); Информация = Ответ[ProcessingInfo]; Если Не ЗначениеЗаполнено(Информация) Тогда diff --git a/OInt/core/Modules/OPI_VK.os b/OInt/core/Modules/OPI_VK.os index 9554e2b904..9fd35cadaf 100644 --- a/OInt/core/Modules/OPI_VK.os +++ b/OInt/core/Modules/OPI_VK.os @@ -29,6 +29,7 @@ // BSLLS:IncorrectLineBreak-off // BSLLS:NumberOfOptionalParams-off // BSLLS:UsingServiceTag-off +// BSLLS:UnusedLocalVariable-off //@skip-check method-too-many-params diff --git a/OInt/tests/Modules/internal/OPI_Тесты.os b/OInt/tests/Modules/internal/OPI_Тесты.os index 0680732f0c..b30281044c 100644 --- a/OInt/tests/Modules/internal/OPI_Тесты.os +++ b/OInt/tests/Modules/internal/OPI_Тесты.os @@ -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"]).Равно(Истина); + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os index d911fbfcb5..8eb29f67f5 100644 --- a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os +++ b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os @@ -332,7 +332,9 @@ НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн); НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн); - НовыйТест(ТаблицаТестов, "Слак_ОтправитьСообщение" , "Отправить сообщение" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак); + НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак); Возврат ТаблицаТестов; diff --git a/OInt/tools/Modules/OPI_ПреобразованиеТипов.os b/OInt/tools/Modules/OPI_ПреобразованиеТипов.os index 726d858985..5234d92422 100644 --- a/OInt/tools/Modules/OPI_ПреобразованиеТипов.os +++ b/OInt/tools/Modules/OPI_ПреобразованиеТипов.os @@ -134,7 +134,11 @@ КонецПроцедуры Процедура ПолучитьМассив(Значение) Экспорт - + + Если ТипЗнч(Значение) = Тип("Массив") Тогда + Возврат; + КонецЕсли; + Если ТипЗнч(Значение) = Тип("Строка") И СтрНачинаетсяС(Значение, "[") И СтрЗаканчиваетсяНа(Значение, "]") Тогда diff --git a/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os b/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os index 92281f64a5..d16587d3c3 100644 --- a/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os +++ b/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os @@ -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 @@ Прервать; КонецЕсли; - ЗаписьДанных.Записать(ТекущиеДанные); ОсвободитьОбъект(ТекущиеДанные);