From c0320f8d7cbfdf980224a9ed466c1823c7608b70 Mon Sep 17 00:00:00 2001 From: Vitaly the Alpaca Date: Wed, 29 May 2024 06:01:57 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B5=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20OPI=20->=20OInt=20?= =?UTF-8?q?(workflow)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OInt/core/Modules/OPI_Dropbox.os | 25 +- OInt/core/Modules/OPI_Telegram.os | 285 +++++++++++------------ OInt/tests/Modules/internal/OPI_Тесты.os | 12 +- 3 files changed, 173 insertions(+), 149 deletions(-) diff --git a/OInt/core/Modules/OPI_Dropbox.os b/OInt/core/Modules/OPI_Dropbox.os index 75c94682a..5e872ede6 100644 --- a/OInt/core/Modules/OPI_Dropbox.os +++ b/OInt/core/Modules/OPI_Dropbox.os @@ -672,7 +672,7 @@ // ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly // // Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +// Неопределено - пустой ответ Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); @@ -707,6 +707,29 @@ КонецФункции +// Получить статус асинхронного изменения +// Получает статус асинхронной работы по изменению доступов +// +// Параметры: +// Токен - Строка - Токен - token +// IDРаботы - Строка - ID асинхронной работы - job +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСтатусАсинхронногоИзменения(Знач Токен, Знач IDРаботы) Экспорт + + URL = "https://api.dropboxapi.com/2/sharing/check_job_status"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + #КонецОбласти #КонецОбласти diff --git a/OInt/core/Modules/OPI_Telegram.os b/OInt/core/Modules/OPI_Telegram.os index 695b82288..0fd95001d 100644 --- a/OInt/core/Modules/OPI_Telegram.os +++ b/OInt/core/Modules/OPI_Telegram.os @@ -37,7 +37,7 @@ #Область ПрограммныйИнтерфейс -#Область ДанныеИНастройка +#Область ПолучениеДанныхИНастройка // Получить информацию о боте // Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. @@ -125,6 +125,107 @@ КонецФункции +// Скачать файл +// Скачивает файл с серверов Telegram +// +// Параметры: +// Токен - Строка - Токен - token +// IDФайла - Строка - ID файла для скачивания - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт + + Result = "result"; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); + + Параметры = Новый Структура("file_id", IDФайла); + + URL = "api.telegram.org/bot" + Токен + "/getFile"; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Путь = Ответ[Result]["file_path"]; + + Если Не ЗначениеЗаполнено(Путь) Тогда + Возврат Ответ; + КонецЕсли; + + URL = "api.telegram.org/file/bot" + Токен + "/" + Путь; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// ОбработатьДанные Telegram Mini App +// Обрабатывает данные TMA и опредеяет их достоверность +// +// Параметры: +// СтрокаДанных - Строка - querry из Telegram.WebApp.initData +// Токен - Строка - Токен бота +// +// Возвращаемое значение: +// Соответствие из Строка - Соответствие данных с результатом проверки в поле passed +Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных); + + СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); + СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); + Ключ = "WebAppData"; + Хэш = ""; + КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ); + + Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен)); + + ТЗнач = Новый ТаблицаЗначений; + ТЗнач.Колонки.Добавить("Ключ"); + ТЗнач.Колонки.Добавить("Значение"); + + Для Каждого Данные Из СтруктураДанных Цикл + + НоваяСтрока = ТЗнач.Добавить(); + НоваяСтрока.Ключ = Данные.Ключ; + НоваяСтрока.Значение = Данные.Значение; + + КонецЦикла; + + ТЗнач.Сортировать("Ключ"); + + СоответствиеВозврата = Новый Соответствие; + DCS = ""; + + Для Каждого СтрокаТЗ Из ТЗнач Цикл + + Если СтрокаТЗ.Ключ <> "hash" Тогда + DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; + СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); + Иначе + Хэш = СтрокаТЗ.Значение; + КонецЕсли; + + КонецЦикла; + + DCS = Лев(DCS, СтрДлина(DCS) - 1); + Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); + + Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); + + Если Финал = вРег(Хэш) Тогда + Ответ = Истина; + Иначе + Ответ = Ложь; + КонецЕсли; + + СоответствиеВозврата.Вставить("passed", Ответ); + + Возврат СоответствиеВозврата; + +КонецФункции + #КонецОбласти #Область ОтправкаДанных @@ -474,6 +575,42 @@ КонецФункции +// Сформировать клавиатуру по массиву кнопок +// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели +// +// Параметры: +// МассивКнопок - Массив из Строка - Массив кнопок - buttons +// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under +// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column +// +// Возвращаемое значение: +// Строка - JSON клавиатуры +Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок + , Знач ПодСообщением = Ложь + , Знач ОднаПодОдной = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); + OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); + + Если ОднаПодОдной Тогда + Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); + Иначе + Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); + КонецЕсли; + + Если ПодСообщением Тогда + СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); + Иначе + СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); + КонецЕсли; + + Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра); + + Возврат Клавиатура; + +КонецФункции + #КонецОбласти #Область Администрирование @@ -655,77 +792,7 @@ #КонецОбласти -#Область TelegramMiniApp - -// Обработать данные TMA и определить их достоверность !NOCLI -// -// Параметры: -// СтрокаДанных - Строка - querry из Telegram.WebApp.initData -// Токен - Строка - Токен бота -// -// Возвращаемое значение: -// Соответствие из Строка - Обработанные данные с признаком достоверности -Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных); - - СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); - СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); - Ключ = "WebAppData"; - Хэш = ""; - КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ); - - Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен)); - - ТЗнач = Новый ТаблицаЗначений; - ТЗнач.Колонки.Добавить("Ключ"); - ТЗнач.Колонки.Добавить("Значение"); - - Для Каждого Данные Из СтруктураДанных Цикл - - НоваяСтрока = ТЗнач.Добавить(); - НоваяСтрока.Ключ = Данные.Ключ; - НоваяСтрока.Значение = Данные.Значение; - - КонецЦикла; - - ТЗнач.Сортировать("Ключ"); - - СоответствиеВозврата = Новый Соответствие; - DCS = ""; - - Для Каждого СтрокаТЗ Из ТЗнач Цикл - - Если СтрокаТЗ.Ключ <> "hash" Тогда - DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; - СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); - Иначе - Хэш = СтрокаТЗ.Значение; - КонецЕсли; - - КонецЦикла; - - DCS = Лев(DCS, СтрДлина(DCS) - 1); - Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); - - Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); - - Если Финал = вРег(Хэш) Тогда - Ответ = Истина; - Иначе - Ответ = Ложь; - КонецЕсли; - - СоответствиеВозврата.Вставить("passed", Ответ); - - Возврат СоответствиеВозврата; - -КонецФункции - -#КонецОбласти - -#Область РежимФорума +#Область РаботаСТемамиФорума // Получить список иконок-аватаров // Получает соответствие ID Emoji для установки в качестве иконок тем форума @@ -923,80 +990,6 @@ #КонецОбласти -#Область Прочее - -// Сформировать клавиатуру по массиву кнопок -// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели -// -// Параметры: -// МассивКнопок - Массив из Строка - Массив кнопок - buttons -// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under -// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column -// -// Возвращаемое значение: -// Строка - JSON клавиатуры -Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок - , Знач ПодСообщением = Ложь - , Знач ОднаПодОдной = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); - OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); - - Если ОднаПодОдной Тогда - Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); - Иначе - Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); - КонецЕсли; - - Если ПодСообщением Тогда - СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); - Иначе - СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); - КонецЕсли; - - Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра); - - Возврат Клавиатура; - -КонецФункции - -// Скачать файл -// Скачивает файл с серверов Telegram -// -// Параметры: -// Токен - Строка - Токен - token -// IDФайла - Строка - ID файла для скачивания - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт - - Result = "result"; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); - - Параметры = Новый Структура("file_id", IDФайла); - - URL = "api.telegram.org/bot" + Токен + "/getFile"; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Путь = Ответ[Result]["file_path"]; - - Если Не ЗначениеЗаполнено(Путь) Тогда - Возврат Ответ; - КонецЕсли; - - URL = "api.telegram.org/file/bot" + Токен + "/" + Путь; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/OInt/tests/Modules/internal/OPI_Тесты.os b/OInt/tests/Modules/internal/OPI_Тесты.os index b8e58b5b5..89050f7d5 100644 --- a/OInt/tests/Modules/internal/OPI_Тесты.os +++ b/OInt/tests/Modules/internal/OPI_Тесты.os @@ -5210,12 +5210,20 @@ Токен = ПараметрыФункции["Dropbox_Token"]; Папка = ПараметрыФункции["Dropbox_SharedFolder"]; - Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка); + Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка); + ТекущийСтатус = "in_progress"; + IDРаботы = Результат["async_job_id"]; + + Пока ТекущийСтатус = "in_progress" Цикл + Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы); + ТекущийСтатус = Результат[".tag"]; + OPI_Инструменты.Пауза(3); + КонецЦикла; // END OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox"); - + Проверка_ДропБоксСтатус(Результат); OPI_Инструменты.Пауза(5);