diff --git a/.github/workflows/cli_draft.yml b/.github/workflows/cli_draft.yml index f2e5df8191..72da96b454 100644 --- a/.github/workflows/cli_draft.yml +++ b/.github/workflows/cli_draft.yml @@ -34,30 +34,30 @@ jobs: - name: Собрать и установить OInt run: | - cd ./ru/OInt + cd ./src/ru/OInt opm build opm install *.ospx - name: Собрать бинарник run: | - cd ./ru/cli + cd ./src/ru/cli oscript -make core/Classes/Приложение.os oint - name: Собрать exe run: | - cd ./ru/cli + cd ./src/ru/cli oscript -make core/Classes/Приложение.os oint.exe - name: Записать артефакт uses: actions/upload-artifact@v4 with: name: oint - path: ./ru/cli/oint + path: ./src/ru/cli/oint - name: Создать каталог deb-пакета run: | mkdir -p .debpkg/usr/bin - cp ./ru/cli/oint .debpkg/usr/bin/oint + cp ./src/ru/cli/oint .debpkg/usr/bin/oint chmod +x .debpkg/usr/bin/oint - name: Собрать deb-пакет @@ -81,7 +81,7 @@ jobs: run: | mkdir -p .rpmpkg/usr/bin mkdir -p .rpmpkg/usr/share/oint/bin - cp ./ru/cli/oint .rpmpkg/usr/share/oint/bin/oint + cp ./src/ru/cli/oint .rpmpkg/usr/share/oint/bin/oint echo 'mono /usr/share/oint/bin/oint "$@"' > .rpmpkg/usr/bin/oint chmod +x .rpmpkg/usr/bin/oint diff --git a/.github/workflows/cli_test.yml b/.github/workflows/cli_test.yml index 1cd0a8ba3d..4b0450bbec 100644 --- a/.github/workflows/cli_test.yml +++ b/.github/workflows/cli_test.yml @@ -50,30 +50,30 @@ jobs: - name: Собрать и установить OInt run: | - cd ./ru/OInt + cd ./src/ru/OInt opm build opm install *.ospx - name: Собрать бинарник run: | - cd ./ru/cli + cd ./src/ru/cli oscript -make core/Classes/Приложение.os oint - name: Собрать exe run: | - cd ./ru/cli + cd ./src/ru/cli oscript -make core/Classes/Приложение.os oint.exe - name: Записать артефакт uses: actions/upload-artifact@v4 with: name: oint - path: ./ru/cli/oint + path: ./src/ru/cli/oint - name: Создать каталог deb-пакета run: | mkdir -p .debpkg/usr/bin - cp ./ru/cli/oint .debpkg/usr/bin/oint + cp ./src/ru/cli/oint .debpkg/usr/bin/oint chmod +x .debpkg/usr/bin/oint - name: Собрать deb-пакет @@ -97,7 +97,7 @@ jobs: run: | mkdir -p .rpmpkg/usr/bin mkdir -p .rpmpkg/usr/share/oint/bin - cp ./ru/cli/oint .rpmpkg/usr/share/oint/bin/oint + cp ./src/ru/cli/oint .rpmpkg/usr/share/oint/bin/oint echo 'mono /usr/share/oint/bin/oint "$@"' > .rpmpkg/usr/bin/oint chmod +x .rpmpkg/usr/bin/oint diff --git a/.github/workflows/oint_coverage.yml b/.github/workflows/oint_coverage.yml index 13423ebce9..403efc3166 100644 --- a/.github/workflows/oint_coverage.yml +++ b/.github/workflows/oint_coverage.yml @@ -29,12 +29,12 @@ jobs: - name: Установить OInt run: | - cd ./ru/OInt + cd ./src/ru/OInt opm build opm install *.ospx - name: Выполнить скрипт определения покрытия - run: oscript ./ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os + run: oscript ./src/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os diff --git a/.github/workflows/os/cli_parse.os b/.github/workflows/os/cli_parse.os index 4c7afbb44d..230d36ef5c 100644 --- a/.github/workflows/os/cli_parse.os +++ b/.github/workflows/os/cli_parse.os @@ -12,8 +12,8 @@ Процедура ПриСозданииОбъекта() МодульСоставаОПИ = Новый ТекстовыйДокумент(); - ФайлСоставаОПИ = "./ru/cli/data/Classes/СоставБиблиотеки.os"; - КаталогСписковСотава = "./ru/cli/data/Classes/internal/Classes/"; + ФайлСоставаОПИ = "./src/ru/cli/data/Classes/СоставБиблиотеки.os"; + КаталогСписковСотава = "./src/ru/cli/data/Classes/internal/Classes/"; ЗаписатьНачалоФайла(); ЗаписатьФункциюОпределенияВерсии(); @@ -639,7 +639,7 @@ ОбщийМассивМодулей = Новый Массив; - ФайлыМодулей = НайтиФайлы("./ru/", "*.os", Истина); + ФайлыМодулей = НайтиФайлы("./src/ru/", "*.os", Истина); Для Каждого Модуль Из ФайлыМодулей Цикл @@ -686,7 +686,7 @@ Функция ПолучитьВерсиюПакета() Версия = ""; - Packagedef = "./ru/OInt/packagedef"; + Packagedef = "./src/ru/OInt/packagedef"; Признак = ".Версия("""; ТекстФайла = Новый ТекстовыйДокумент(); diff --git a/.github/workflows/os/cli_testmaker.os b/.github/workflows/os/cli_testmaker.os index 88ed7a891a..d22857a9a4 100644 --- a/.github/workflows/os/cli_testmaker.os +++ b/.github/workflows/os/cli_testmaker.os @@ -1,4 +1,4 @@ -#Использовать "../../../ru/cli/data" +#Использовать "../../../src/ru/cli/data" Перем СоответствияПараметровЗначениям; Перем СоответствияПараметровПредобработкам; @@ -124,30 +124,30 @@ | | - name: Собрать и установить OInt | run: | - | cd ./ru/OInt + | cd ./src/ru/OInt | opm build | opm install *.ospx | | - name: Собрать бинарник | run: | - | cd ./ru/cli + | cd ./src/ru/cli | oscript -make core/Classes/Приложение.os oint | | - name: Собрать exe | run: | - | cd ./ru/cli + | cd ./src/ru/cli | oscript -make core/Classes/Приложение.os oint.exe | | - name: Записать артефакт | uses: actions/upload-artifact@v4 | with: | name: oint - | path: ./ru/cli/oint + | path: ./src/ru/cli/oint | | - name: Создать каталог deb-пакета | run: | | mkdir -p .debpkg/usr/bin - | cp ./ru/cli/oint .debpkg/usr/bin/oint + | cp ./src/ru/cli/oint .debpkg/usr/bin/oint | chmod +x .debpkg/usr/bin/oint | | - name: Собрать deb-пакет @@ -171,7 +171,7 @@ | run: | | mkdir -p .rpmpkg/usr/bin | mkdir -p .rpmpkg/usr/share/oint/bin - | cp ./ru/cli/oint .rpmpkg/usr/share/oint/bin/oint + | cp ./src/ru/cli/oint .rpmpkg/usr/share/oint/bin/oint | echo 'mono /usr/share/oint/bin/oint ""$@""' > .rpmpkg/usr/bin/oint | chmod +x .rpmpkg/usr/bin/oint | diff --git a/.github/workflows/os/convert.os b/.github/workflows/os/convert.os index fe16a1e9c5..9daa3be65b 100644 --- a/.github/workflows/os/convert.os +++ b/.github/workflows/os/convert.os @@ -1,7 +1,7 @@ Функция ПолучитьСопоставлениеФайлов() Сопоставление = Новый Соответствие(); - ФайлыМодулей = НайтиФайлы("./ru/", "*.bsl", Истина); + ФайлыМодулей = НайтиФайлы("./src/ru/", "*.bsl", Истина); Признак = "// Расположение OS: "; Для Каждого Файл Из ФайлыМодулей Цикл @@ -22,7 +22,7 @@ ПутьOS = СтрЗаменить(ТекущаяСтрока, Признак, ""); ПутьOS = СокрЛП(ПутьOS); - ПутьOS = СтрЗаменить(ПутьOS, "./", "./ru/"); + ПутьOS = СтрЗаменить(ПутьOS, "./", "./src/ru/"); Сопоставление.Вставить(ТекущийФайл, ПутьOS); КонецЕсли; @@ -155,8 +155,8 @@ Процедура ОбновитьНомерВерсии() - ПутьПД = "./ru/OInt/packagedef"; - ПутьКФ = "./ru/OPI/src/Configuration/Configuration.mdo"; + ПутьПД = "./src/ru/OInt/packagedef"; + ПутьКФ = "./src/ru/OPI/src/Configuration/Configuration.mdo"; Версия = ""; ЧтениеДанныхКонфигурации = Новый ЧтениеXML(); @@ -197,7 +197,7 @@ ТекущийМодуль = Модуль.Значение; ФайлМодуля = Новый Файл(ТекущийМодуль); - ПутьМодуля = СтрЗаменить(ТекущийМодуль, "./ru/OInt/", ""); + ПутьМодуля = СтрЗаменить(ТекущийМодуль, "./src/ru/OInt/", ""); Бибилотека = ФайлМодуля.ИмяБезРасширения; Если Бибилотека = "OPI_Тесты" Тогда @@ -210,7 +210,7 @@ КонецЦикла; Документ.ДобавитьСтроку("</package-def>"); - Документ.Записать("./ru/OInt/lib.config"); + Документ.Записать("./src/ru/OInt/lib.config"); КонецПроцедуры diff --git a/.github/workflows/os/docs_examples.os b/.github/workflows/os/docs_examples.os index 1c7ae310d6..25e7d956f7 100644 --- a/.github/workflows/os/docs_examples.os +++ b/.github/workflows/os/docs_examples.os @@ -1,5 +1,5 @@ #Использовать osparser -#использовать "../../../ru/OInt/tools/" +#использовать "../../../src/ru/OInt/tools/" Перем МодульТестов; Перем Парсер; @@ -10,7 +10,7 @@ Процедура ПриСозданииОбъекта() - ПутьКТестам = "./ru/OInt/tests/Modules/internal/OPI_Тесты.os"; + ПутьКТестам = "./src/ru/OInt/tests/Modules/internal/OPI_Тесты.os"; ОбластьТестов = "АтомарныеТесты"; КаталогСохранения = "./docs/examples/"; КаталогЗаписиЗначений = "./docs/data/"; diff --git a/.github/workflows/os/oint_dictionary.os b/.github/workflows/os/oint_dictionary.os index f3cfd378d0..579b36abb1 100644 --- a/.github/workflows/os/oint_dictionary.os +++ b/.github/workflows/os/oint_dictionary.os @@ -24,7 +24,7 @@ Процедура СоздатьСловарь(Знач Язык) - ФайлыМодулей = НайтиФайлы("./ru/", "*.os", Истина); + ФайлыМодулей = НайтиФайлы("./src/ru/", "*.os", Истина); СписокСлов = Новый СписокЗначений(); Для Каждого Модуль Из ФайлыМодулей Цикл @@ -64,6 +64,8 @@ КонецЦикла; + ДобавитьКлючевыеСловаЯзыка(СоответствиеСловаря); + ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря); КонецПроцедуры @@ -307,5 +309,19 @@ КонецФункции +Процедура ДобавитьКлючевыеСловаЯзыка(СоответствиеСловаря) + + ПутьКСловарюКлючевыхСлов = "./service/dictionaries/keywords.json"; + ЧтениеJSON = Новый ЧтениеJSON(); + ЧтениеJSON.ОткрытьФайл(ПутьКСловарюКлючевыхСлов); + СоответствиеКС = ПрочитатьJSON(ЧтениеJSON, Истина); + ЧтениеJSON.Закрыть(); + + Для Каждого КлючевоеСлово Из СоответствиеКС Цикл + СоответствиеСловаря.Вставить(КлючевоеСлово.Ключ, СокрЛП(КлючевоеСлово.Значение)); + КонецЦикла; + +КонецПроцедуры + СоздатьСловари(); diff --git a/.github/workflows/os/oint_testmaker.os b/.github/workflows/os/oint_testmaker.os index 8e9447ab72..4b7b029367 100644 --- a/.github/workflows/os/oint_testmaker.os +++ b/.github/workflows/os/oint_testmaker.os @@ -1,4 +1,4 @@ -#Использовать "../../../ru/OInt/tools/" +#Использовать "../../../src/ru/OInt/tools/" Перем СоответствияПараметровЗначениям; Перем СоответствияПараметровПредобработкам; diff --git a/.github/workflows/os/opi_translate.os b/.github/workflows/os/opi_translate.os index 6138c2da4f..815ba47e6b 100644 --- a/.github/workflows/os/opi_translate.os +++ b/.github/workflows/os/opi_translate.os @@ -12,6 +12,11 @@ ТаблицаСловаря.Колонки.Добавить("ИмяМодуля"); Для Каждого Словарь Из ФайлыСловарей Цикл + + Если Словарь.ИмяБезРасширения = "keywords" Тогда + Продолжить; + КонецЕсли; + СоздатьЛокализацию(Словарь); КонецЦикла; @@ -25,16 +30,21 @@ ПолучитьТаблицуСловаря(ПутьКСловарю); КаталогИсточник = Новый Файл(".\ru\OPI"); - КаталогПриемник = Новый Файл(".\" + Язык + "\OPI"); + КаталогПриемник = Новый Файл(".\service\interim\" + Язык + "\OPI"); Если КаталогПриемник.Существует() Тогда УдалитьФайлы(КаталогПриемник.ПолноеИмя); КонецЕсли; СкопироватьФайлы(КаталогИсточник.ПолноеИмя, КаталогПриемник.ПолноеИмя); - ФайлыМодулей = НайтиФайлы("./" + Язык + "/", "*.bsl", Истина); + ФайлыМодулей = НайтиФайлы(".\service\interim\" + Язык + "\", "*", Истина); Для Каждого ФайлМодуля Из ФайлыМодулей Цикл + + Если ФайлМодуля.ЭтоКаталог() Тогда + Продолжить; + КонецЕсли; + ПеревестиМодуль(ФайлМодуля.ПолноеИмя); КонецЦикла; diff --git a/service/dictionaries/en.json b/service/dictionaries/en.json index 3d38af1348..1d65317a43 100644 --- a/service/dictionaries/en.json +++ b/service/dictionaries/en.json @@ -1,3029 +1,3045 @@ { -"К": "To", -"И": "And", "В": "In", +"к": "to", +"К": "To", "Н": "N", -"д": "d", +"И": "And", "в": "in", "с": "with", -"к": "to", -"из": "from", -"Из": "Of", -"ФС": "FS", -"По": "by", -"на": "to", -"См": "See", -"ДД": "BD", -"Не": "Not", +"д": "d", "ПС": "PS", -"МБ": "MB", +"Не": "Not", +"ДД": "BD", "ВК": "VK", -"Или": "Or", -"Хэш": "Hash", -"Тег": "Tag", -"доп": "add", -"Хеш": "Hash", -"осн": "main", -"ООД": "OOD", -"Таб": "Tab", -"БСП": "BSP", -"Нет": "No", -"Бан": "Ban", -"Вид": "View", -"Что": "What", -"ИВФ": "AndVF", -"НПП": "NPP", -"Час": "Hour", -"Лев": "Left", -"Вес": "Weight", -"Код": "Code", -"ОТД": "OTD", -"это": "this", -"Тип": "Type", -"Чат": "Chat", -"ОПИ": "OPI", -"Окр": "Round", -"для": "for", -"Цел": "Goal", -"тип": "type", -"без": "without", +"По": "For", +"из": "from", +"ФС": "FS", +"См": "See", +"МБ": "MB", +"Из": "In", +"на": "to", "Для": "For", -"Имя": "Name", +"Или": "Or", +"ООД": "OOD", +"Вид": "View", +"для": "for", +"доп": "add", +"Нет": "No", +"Вес": "Weight", +"БСП": "BSP", +"Чат": "Chat", +"НПП": "NPP", +"Лев": "Left", +"Тег": "Tag", +"Хэш": "Hash", +"это": "this", +"Хеш": "Hash", +"Код": "Code", +"ИВФ": "AndVF", +"осн": "main", "или": "or", -"Пост": "Post", -"поля": "fields", -"Ключ": "Key", -"Файл": "File", -"Сайт": "Website", -"Слак": "Slack", +"Имя": "Name", +"без": "without", +"Что": "What", +"ОПИ": "OPI", +"Бан": "Ban", +"ОТД": "OTD", +"Цел": "Goal", +"Час": "Hour", +"Тип": "Type", +"Таб": "Tab", +"Окр": "Round", +"тип": "type", +"Авто": "Auto", +"Линк": "Link", "Пара": "Pair", -"Фото": "Photo", +"Цикл": "Do", +"Знач": "Val", +"Цель": "Purpose", +"Ключ": "Key", +"Тема": "Topic", +"Тело": "Body", +"Вход": "Entry", +"Дата": "Date", +"Файл": "File", +"АирТ": "AirT", +"Пока": "WHile", +"вРег": "inReg", +"нРег": "nReg", +"тему": "topic", +"Слак": "Slack", +"Поля": "Fields", +"Ложь": "False", +"Путь": "Path", "быть": "be", +"всех": "all", +"Лист": "Sheet", "Цвет": "Color", -"Лого": "Logo", -"Цикл": "Loop", +"Поле": "Field", +"Куда": "To", +"Фото": "Photo", "Цена": "Price", "цены": "price", -"путь": "path", -"Прав": "Right", -"фото": "photo", "Тест": "Test", -"Пути": "Paths", -"АирТ": "AirT", -"Флаг": "Flag", -"Пока": "While", -"тему": "topic", -"Куда": "To", -"Вход": "Entry", -"вРег": "inReg", -"Знач": "Val", -"Поля": "Fields", +"путь": "path", +"фото": "photo", "Блок": "Block", -"всех": "all", -"Поле": "Field", -"Тема": "Topic", -"Цель": "Purpose", -"Ложь": "False", +"Пост": "Post", "файл": "file", -"База": "Base", -"Тело": "Body", -"Путь": "Path", -"Авто": "Auto", -"Если": "If", -"Лист": "Sheet", +"Сайт": "Website", "Сред": "Average", -"Дата": "Date", -"Линк": "Link", -"нРег": "nReg", -"Отбор": "Filter", +"Прав": "Right", +"Лого": "Logo", +"Если": "If", +"Пути": "Paths", +"Флаг": "Flag", +"База": "Base", +"поля": "fields", +"Финал": "Final", +"Набор": "Set", +"Аудио": "Audio", +"Товар": "Product", "Вызов": "Call", "Серый": "Gray", +"Гифка": "GIF", "Белый": "White", "Добро": "Welcome", -"Тесты": "Tests", -"файлу": "file", -"Пауза": "Pause", -"Текст": "Text", -"Равно": "Equal", -"Лимит": "Limit", -"Дата0": "Date0", -"Листы": "Sheets", -"файла": "file", -"Лист2": "Sheet2", -"Лист1": "Sheet1", -"Книга": "Book", -"МБайт": "MByte", +"Шапка": "Header", "Адрес": "Address", -"Синий": "Blue", -"Дата1": "Date1", -"КБайт": "KBytes", -"Схема": "Scheme", -"Режим": "Mode", -"Твиты": "Tweets", -"нечто": "something", -"вроде": "like", -"Форум": "Forum", -"Части": "Parts", -"Опрос": "Poll", -"Токен": "Token", -"Медиа": "Media", -"Товар": "Product", -"Гифка": "GIF", -"Аудио": "Audio", -"Файла": "File", -"Число": "Number", -"путей": "paths", -"Финал": "Final", "ТЗнач": "TValue", -"своей": "of its", -"Файлы": "Files", -"Блоки": "Blocks", -"Канал": "Channel", -"Почта": "Email", -"Часть": "Part", -"Сдвиг": "Shift", -"Заказ": "Order", +"Файла": "File", +"Текст": "Text", "Видео": "Video", -"места": "of the venue", -"Метка": "Label", "Опции": "Options", +"Медиа": "Media", +"Заказ": "Order", +"Сдвиг": "Shift", +"путей": "paths", +"нечто": "something", +"Листы": "Sheets", +"Книга": "Book", +"вроде": "like", +"Часть": "Part", +"Сутки": "Day", +"Токен": "Token", +"Твиты": "Tweets", "текст": "text", -"Набор": "Set", -"Драйв": "Drive", -"Целое": "Whole", -"Вывод": "Output", -"ЕдИзм": "Unit", +"будет": "will", +"Номер": "Number", +"Лист2": "Sheet2", +"Копия": "Copy", +"Форум": "Forum", +"Почты": "Mails", +"Число": "Number", +"Тесты": "Tests", +"Папка": "Folder", +"Опрос": "Poll", "ЯДиск": "YDisk", +"Драйв": "Drive", +"своей": "of its", +"Синий": "Blue", +"КБайт": "KBytes", +"Лимит": "Limit", +"МБайт": "MByte", +"Равно": "Equal", +"Отбор": "Filter", +"Режим": "Mode", +"ЮТест": "UTest", +"Метка": "Label", +"Лист1": "Sheet1", +"Пауза": "Pause", +"Ноушн": "Notion", +"ЕдИзм": "Unit", +"Ответ": "Response", +"Тогда": "Then", +"Файлы": "Files", +"Схема": "Scheme", +"Почта": "Email", +"файлу": "file", +"места": "of the venue", +"Дата0": "Date0", +"Иначе": "Else", +"Буфер": "Buffer", "Всего": "Total", +"файла": "file", +"Вывод": "Output", +"после": "after", +"Целое": "Whole", +"Части": "Parts", "Новый": "New", "Метод": "Method", -"Шапка": "Header", -"ЮТест": "UTest", -"Тогда": "Then", -"Иначе": "Otherwise", -"Ноушн": "Notion", -"будет": "will", -"Сутки": "Day", -"Буфер": "Buffer", -"Папка": "Folder", -"Копия": "Copy", -"Номер": "Number", -"после": "after", -"Почты": "Mails", -"Ответ": "Response", -"Перем": "Variable", -"группе": "group", -"Раздел": "Section", -"Ширина": "Width", -"Товары": "Products", -"Кнопка": "Button", -"СокрЛП": "ShortLP", -"Скрыть": "Hide", -"IDТемы": "ThreadID", -"Кнопки": "Buttons", -"Работа": "Work", -"Модуль": "Module", -"Данные": "Data", -"товара": "product", -"Ссылка": "Link", -"булево": "boolean", -"ВСпейс": "VSpace", -"важное": "important", -"ФотоID": "PhotoID", -"Важное": "Important", -"IDФото": "PhotoID", -"Ответы": "Answers", -"Альбом": "Album", -"Рефреш": "Refresh", -"Вайбер": "Viber", -"КудаID": "ToID", -"Иконки": "Icons", -"Объект": "Object", -"Парсер": "Parser", -"Коммит": "Commit", -"Запись": "Record", -"данных": "data", -"Сессия": "Session", -"начала": "of start", -"Записи": "Records", -"Откуда": "From", -"Дважды": "Twice", -"Курсор": "Cursor", -"Булево": "Boolean", -"Версия": "Version", -"Запрос": "Request", -"вывода": "output", -"Формат": "Format", -"работы": "work", -"Ошибка": "Error", -"Разбан": "Unban", -"Строки": "Strings", -"данные": "Data", -"Вопрос": "Question", -"Отступ": "Indent", -"Широта": "Latitude", -"Прочее": "Miscellaneous", -"IDЧата": "ChatID", -"Пароль": "Password", +"Блоки": "Blocks", +"Перем": "Var", +"Дата1": "Date1", +"Канал": "Channel", "Диалог": "Dialog", -"команд": "commands", -"Список": "List", -"Иконка": "Icon", +"Формат": "Format", "Ячейка": "Cell", -"корень": "root", -"СКонца": "FromEnd", -"Высота": "Height", -"Должно": "Should", -"Желтый": "Yellow", -"Статус": "Status", -"ИДФото": "PhotoID", -"Сервер": "Server", -"Это A1": "ThisIsA1", -"Книга2": "Book2", -"Первый": "First", -"Бирюза": "Turquoise", -"Привет": "Hello", -"Строка": "String", -"Размер": "Size", -"Массив": "Array", -"метода": "method", -"ТипЗнч": "TypeValue", -"Заказы": "Orders", -"Черный": "Black", -"Это A2": "ThisIsA2", -"Способ": "Method", -"Это B2": "ThisIsB2", -"Это B4": "ThisIsB4", +"Запись": "Record", "Это B1": "ThisIsB1", -"Истина": "True", -"Флажок": "Checkbox", -"Это A4": "ThisIsA4", -"Прочие": "Others", -"опции:": "options:", -"Текст2": "Text2", -"Это A3": "ThisIsA3", +"Это B4": "ThisIsB4", +"Разбан": "Unban", +"Раздел": "Section", +"Первый": "First", +"Список": "List", +"Рефреш": "Refresh", +"булево": "boolean", +"Дважды": "Twice", +"Иконки": "Icons", +"команд": "commands", +"СокрЛП": "ShortLP", +"Откуда": "From", +"Модуль": "Module", +"Это B2": "ThisIsB2", +"Работа": "Work", +"начала": "of start", +"Скрыть": "Hide", +"Книга2": "Book2", +"Сессия": "Session", +"важное": "important", "Это B3": "ThisIsB3", +"Важное": "Important", +"ФотоID": "PhotoID", +"данные": "Data", +"Данные": "Data", +"Кнопка": "Button", +"Ответы": "Answers", +"Черный": "Black", +"Это A3": "ThisIsA3", +"Кнопки": "Buttons", +"Вайбер": "Viber", +"корень": "root", +"ВСпейс": "VSpace", +"Альбом": "Album", +"Это A4": "ThisIsA4", +"Ошибка": "Error", +"IDТемы": "ThreadID", +"IDФото": "PhotoID", +"Клиент": "Client", +"опции:": "options:", +"Широта": "Latitude", +"Способ": "Method", +"Размер": "Size", +"ТипЗнч": "TypeValue", +"ИДФото": "PhotoID", +"Массив": "Array", +"Прочие": "Others", +"вывода": "output", +"Сервер": "Server", +"Строка": "String", +"IDЧата": "ChatID", +"Запрос": "Request", +"СКонца": "FromEnd", +"Флажок": "Checkbox", +"Должно": "Should", +"Статус": "Status", +"Пароль": "Password", +"Высота": "Height", +"Прочее": "Miscellaneous", +"Версия": "Version", +"Привет": "Hello", +"Ширина": "Width", +"Истина": "True", +"группе": "group", +"Коммит": "Commit", +"Ссылка": "Link", +"Это A2": "ThisIsA2", +"данных": "data", +"Товары": "Products", +"Строки": "Strings", +"Это A1": "ThisIsA1", +"Записи": "Records", "тестов": "tests", -"Команды": "Commands", -"ИДБлока": "BlockID", -"Вариант": "Option", -"ЭтоБаза": "ThisIsBase", -"ТипПоля": "FieldType", -"Телефон": "Phone", -"Отметки": "Tags", -"Область": "Region", -"Долгота": "Longitude", -"Отметка": "Timestamp", -"Каждого": "Each", -"Консоль": "Console", -"ИДПоста": "PostID", -"Фамилия": "Last name", -"Обычный": "Regular", -"Таймаут": "Timeout", -"СНачала": "FromStart", -"Колонки": "Columns", -"Подпись": "Signature", -"ЧатТема": "ChatTopic", -"Экспорт": "Export", -"Удаляет": "Deletes", -"Текущее": "Current", -"Объекты": "Objects", -"Обложка": "Cover", -"Активен": "Active", -"Строка_": "String_", -"Аккаунт": "Account", -"каждого": "each", -"Граница": "Boundary", -"Отладка": "Debugging", -"IDПапки": "FolderID", -"IDФайла": "FileID", -"Извлечь": "Extract", -"Счетчик": "Counter", -"Булево_": "Boolean_", -"Скрытый": "Hidden", +"КудаID": "ToID", +"метода": "method", +"работы": "work", +"товара": "product", +"Бирюза": "Turquoise", +"Иконка": "Icon", +"Курсор": "Cursor", +"Желтый": "Yellow", +"Объект": "Object", +"Отступ": "Indent", +"Текст2": "Text2", +"Вопрос": "Question", +"Булево": "Boolean", +"Заказы": "Orders", +"Парсер": "Parser", "изменен": "changed", -"Событие": "Event", -"события": "events", -"В офисе": "InOffice", -"парсера": "parser", -"Запросы": "Requests", -"команды": "commands", -"удалено": "deleted", -"Процент": "Percent", -"текущей": "current", -"ИмяПоля": "FieldName", -"Удалить": "Delete", -"Элемент": "Element", -"Красный": "Red", -"Таблица": "Table", -"Секунды": "Seconds", -"Каталог": "Directory", -"События": "Events", -"Признак": "Indication", -"Зеленый": "Green", -"граммах": "grams", -"Символы": "Symbols", -"Вывести": "Output", -"Функция": "Function", -"Закрыть": "Close", -"Префикс": "Prefix", -"IDМедиа": "MediaID", -"Единица": "Unit", -"Синоним": "Synonym", -"ВидеоДД": "VideoDD", -"Твиттер": "Twitter", -"Попытка": "Attempt", -"Таблицы": "Tables", -"Коммент": "Comment", -"запуска": "start", -"Ревизия": "Revision", -"ЕстьТег": "HasTag", -"справку": "help", -"ГифкаДД": "GifDD", -"Разделы": "Sections", -"ДопФото": "AdditionalPhoto", -"Реклама": "Advertisement", -"АудиоДД": "AudioDD", -"IDПоста": "PostID", -"Альбомы": "Albums", -"ОпросID": "PollID", -"свойств": "properties", -"Сделать": "Make", -"ЮТТесты": "UTTests", -"главную": "main", -"Глубина": "Depth", -"Артикул": "SKU", -"ID темы": "Thread ID", "Справка": "Help", -"Возврат": "Return", -"Причина": "Reason", -"вызова:": "call:", -"Открыть": "Open", -"Ожидаем": "Awaiting", -"IDСтены": "WallID", -"IDВидео": "VideoID", +"Отметка": "Timestamp", +"Отметки": "Tags", +"Удалить": "Delete", +"Активен": "Active", +"Обложка": "Cover", +"Обычный": "Regular", +"удалено": "deleted", +"Команды": "Commands", +"ИЛИ,Или": "Or", +"ЭтоБаза": "ThisIsBase", +"парсера": "parser", +"Альбомы": "Albums", +"ДопФото": "AdditionalPhoto", +"Каталог": "Directory", +"Вариант": "Option", "Скрытая": "Hidden", -"главным": "main", -"методы:": "methods:", +"свойств": "properties", +"Аккаунт": "Account", +"Артикул": "SKU", +"Отладка": "Debugging", +"граммах": "grams", +"Строка_": "String_", +"Глубина": "Depth", +"Сделать": "Make", +"запуска": "start", +"ТипПоля": "FieldType", +"Таблица": "Table", +"Запросы": "Requests", +"IDПоста": "PostID", +"Телефон": "Phone", +"В офисе": "InOffice", +"ОпросID": "PollID", "История": "Story", +"Перейти": "Goto", +"Область": "Region", +"Реклама": "Advertisement", +"IDСтены": "WallID", +"Красный": "Red", +"Удаляет": "Deletes", +"Коммент": "Comment", +"команды": "commands", +"Граница": "Boundary", +"текущей": "current", +"ИДПоста": "PostID", +"ИДБлока": "BlockID", +"Символы": "Symbols", +"главным": "main", +"Ревизия": "Revision", +"Функция": "Function", +"Объекты": "Objects", +"справку": "help", +"главную": "main", +"Префикс": "Prefix", +"события": "events", +"Каждого": "Each", +"IDВидео": "VideoID", +"Открыть": "Open", +"Долгота": "Longitude", +"вызова:": "call:", +"Событие": "Event", +"ЕстьТег": "HasTag", +"Попытка": "Try", +"Текущее": "Current", +"Экспорт": "Export", +"Фамилия": "Last name", +"Консоль": "Console", +"Зеленый": "Green", +"События": "Events", +"Разделы": "Sections", +"Синоним": "Synonym", +"ID темы": "Thread ID", +"Секунды": "Seconds", +"Вывести": "Output", +"Твиттер": "Twitter", +"Скрытый": "Hidden", +"Таймаут": "Timeout", +"Причина": "Reason", +"ЧатТема": "ChatTopic", +"Процент": "Percent", +"Возврат": "Return", +"Ожидаем": "Awaiting", +"каждого": "each", +"ИмяПоля": "FieldName", "Команда": "Command", -"Страница": "Page", -"ПутьФайл": "FilePath", -"Кнопка 3": "Button 3", -"Приемник": "Receiver", -"ДатаСтоп": "EndDate", -"РазмерДД": "SizeDD", -"Вложения": "Attachments", -"ПотокZip": "ZipStream", -"Вложение": "Attachment", -"Источник": "Source", -"название": "name", -"Элементы": "Elements", +"Колонки": "Columns", +"Булево_": "Boolean_", +"Подпись": "Signature", +"Счетчик": "Counter", +"ЮТТесты": "UTTests", +"Закрыть": "Close", +"Признак": "Indication", +"Единица": "Unit", +"IDПапки": "FolderID", +"ВидеоДД": "VideoDD", +"Таблицы": "Tables", +"АудиоДД": "AudioDD", +"методы:": "methods:", +"IDМедиа": "MediaID", +"IDФайла": "FileID", +"СНачала": "FromStart", +"Элемент": "Element", +"Извлечь": "Extract", +"ГифкаДД": "GifDD", +"ОткудаID": "FromID", "Подборка": "Selection", -"Подробно": "Detailed", -"Подборки": "Selections", -"Основная": "Main", -"URLФайла": "FileURL", -"IDРаботы": "JobID", -"В работе": "InProgress", -"Действие": "Action", -"Максимум": "Maximum", -"ХешСумма": "HashSum", -"варианты": "variants", -"Значения": "Values", -"ИДРаботы": "WorkID", -"магазина": "store", -"страницу": "page", -"ИДТовара": "ProductID", -"Телеграм": "Telegram", -"описание": "description", -"JSONДата": "JSONDate", -"ОбъектВК": "VKObject", -"Свойства": "Properties", -"НовоеИмя": "NewName", +"ПоляБазы": "BaseFields", +"ID книги": "BookID", +"СтрВсего": "StrTotal", +"ИмяФайла": "FileName", +"ТипЧисло": "TypeNumber", +"Страница": "Page", +"входящих": "incoming", +"Сообщить": "Notify", +"Делитель": "Divider", "ФайлСлак": "SlackFile", -"подборку": "selection", -"Строчный": "StringType", -"Смещение": "Offset", -"НЕ JSON:": "NOT JSON:", -"Числовой": "Numeric", -"СтрокаТЗ": "DataString", -"Кнопка 2": "Button 2", +"методами": "methods", +"Параметр": "Parameter", +"Проверки": "Checks", +"ВКорзину": "ToCart", +"СтрДлина": "StrLength", "ФайлТела": "BodyFile", -"ИмяМедиа": "MediaName", +"Получить": "Get", +"Значение": "Value", +"СтрокаТЗ": "DataString", +"ID блока": "Block ID", +"Смещение": "Offset", "Разметка": "Markup", "Картинка": "Image", -"ЭтотФайл": "ThisFile", -"ФайлЛога": "LogFile", -"Документ": "Document", -"Не JSON:": "Not JSON:", -"КонецДня": "EndOfDay", -"ИмеетТип": "HasType", -"ОткудаID": "FromID", -"Отправка": "Sending", -"ТипЧисло": "TypeNumber", -"ИмяФайла": "FileName", -"Название": "Name", -"ДропБокс": "Dropbox", -"ЕстьДата": "HasDate", -"СтрВсего": "StrTotal", -"каталога": "directory", -"загрузки": "upload", -"Загрузка": "Upload", -"Двоичные": "Binary", -"БлокJSON": "JSONBlock", -"ID книги": "BookID", -"ВКорзину": "ToCart", -"Оригинал": "Original", -"Уадление": "Removal", -"Родитель": "Parent", -"ИмяЛиста": "SheetName", -"ID поста": "Post ID", -"IDКанала": "ChannelID", -"ID блока": "Block ID", -"Свойство": "Property", -"Проверки": "Checks", -"подборки": "selections", -"ЭтоКанал": "IsChannel", -"ПоляБазы": "BaseFields", -"МассивИД": "IDArray", -"Делитель": "Divider", -"Удаление": "Deletion", -"Кнопка 1": "Button 1", -"IDИконки": "IconID", -"Прервать": "Interrupt", -"входящих": "incoming", -"отправки": "of sending", -"СтрДлина": "StrLength", -"Значение": "Value", +"Максимум": "Maximum", +"варианты": "variants", +"Подборки": "Selections", "Записать": "Write", -"СтрНайти": "StrFind", -"Получить": "Get", -"Описание": "Description", -"Вставить": "Insert", -"Внимание": "Attention", -"ВГраница": "WithinBoundary", -"методами": "methods", -"Сообщить": "Notify", -"Добавить": "Add", -"Основные": "Main", +"НЕ JSON:": "NOT JSON:", +"Основная": "Main", +"Значения": "Values", +"Документ": "Document", +"магазина": "store", +"Действие": "Action", +"страницу": "page", +"ФайлЛога": "LogFile", +"Свойство": "Property", +"ИДТовара": "ProductID", +"отправки": "of sending", +"Подробно": "Detailed", +"Не JSON:": "Not JSON:", "Свернуть": "Collapse", +"Оригинал": "Original", +"ИмеетТип": "HasType", +"Описание": "Description", +"JSONДата": "JSONDate", +"Внимание": "Attention", +"МассивИД": "IDArray", +"ID поста": "Post ID", +"загрузки": "upload", +"РазмерДД": "SizeDD", +"ИДРаботы": "WorkID", +"Родитель": "Parent", +"каталога": "directory", +"Добавить": "Add", +"название": "name", +"ЭтотФайл": "ThisFile", +"ИмяМедиа": "MediaName", +"ЭтоКанал": "IsChannel", +"ПотокZip": "ZipStream", +"Основные": "Main", +"В работе": "InProgress", +"Вложения": "Attachments", +"Вставить": "Insert", +"ЕстьДата": "HasDate", +"Прервать": "Break", +"БлокJSON": "JSONBlock", +"ИмяЛиста": "SheetName", +"Отправка": "Sending", +"Вложение": "Attachment", +"Двоичные": "Binary", +"Элементы": "Elements", +"IDКанала": "ChannelID", +"Числовой": "Numeric", +"СтрНайти": "StrFind", +"Строчный": "StringType", +"ХешСумма": "HashSum", +"Телеграм": "Telegram", +"ПутьФайл": "FilePath", +"подборки": "selections", +"КонецДня": "EndOfDay", +"Свойства": "Properties", +"ДатаСтоп": "EndDate", +"URLФайла": "FileURL", +"IDРаботы": "JobID", +"Приемник": "Receiver", +"Кнопка 1": "Button 1", +"Кнопка 2": "Button 2", +"Источник": "Source", +"подборку": "selection", +"IDИконки": "IconID", +"Кнопка 3": "Button 3", +"Удаление": "Deletion", +"Уадление": "Removal", "Точность": "Precision", -"Параметр": "Parameter", -"Значение_": "Value_", -"Процедура": "Procedure", -"Заголовок": "Title", -"Вычислить": "Calculate", -"ВидеоПуть": "VideoPath", -"Последний": "Last", -"РазмерЕСД": "SizeESD", -"АудиоПуть": "AudioPath", -"Параметр_": "Parameter_", -"РазмерЛФХ": "SizeLFH", -"ИмяМетода": "MethodName", -"Свойства_": "Properties_", -"ГифкаПуть": "GifPath", -"ID канала": "Channel ID", -"Календари": "Calendars", -"Вариант 2": "Option 2", -"Выражение": "Expression", -"ПолноеИмя": "FullName", -"Истечение": "Expiration", -"Строковое": "String", -"Выполнить": "Execute", -"Значение:": "Value:", -"РазмерСДХ": "SizeCDH", -"Удаленный": "Remote", -"ПутьКСтат": "PathToStat", -"окончания": "of end", +"Название": "Name", +"описание": "description", +"ВГраница": "WithinBoundary", +"НовоеИмя": "NewName", +"ОбъектВК": "VKObject", +"ДропБокс": "Dropbox", +"Загрузка": "Upload", +"ID товара": "Product ID", "МассивИД_": "ArrayID_", -"Картинка1": "Image1", +"изменения": "change", +"ДатаСтарт": "StartDate", +"Приватный": "Private", "Константы": "Constants", +"Анонимный": "Anonymous", +"отражения": "reflection", +"Категории": "Categories", +"Категория": "Category", "ВерсияАпи": "APIVersion", "Сигнатура": "Signature", -"Сообщение": "Message", -"В корзину": "To cart", -"СтрШаблон": "StrTemplate", -"URL файла": "File URL", -"URLОтвета": "ResponseURL", -"доступных": "available", -"Исполнить": "Execute", -"Вариант 1": "Option 1", -"ОбъектОПИ": "OPIObject", -"Заполнено": "Filled", -"ИДАльбома": "AlbumID", -"Файл_Стат": "File_Stat", -"Доступные": "Available", -"ИмяПакета": "PackageName", -"НачалоДня": "StartOfDay", -"ПутьЛогов": "LogPath", -"HTTPОтвет": "HTTPResponse", -"Приватный": "Private", -"Категория": "Category", -"ПутьКопии": "CopyPath", -"ИначеЕсли": "ElseIf", -"Кодировка": "Encoding", -"ДатаСтарт": "StartDate", -"ТипСтрока": "TypeString", -"ТокенБота": "BotToken", -"отражения": "reflection", -"Заголовки": "Headers", -"ТипДанных": "DataType", -"Имя папки": "Folder name", -"IDАльбома": "AlbumID", -"изменения": "change", -"НовыйТест": "NewTest", -"Календарь": "Calendar", -"ТекущийИД": "CurrentID", -"Изменение": "Change", -"ВКонтакте": "VK", -"Удаляемый": "Deletable", -"программы": "program", -"Параметры": "Parameters", -"Подборки_": "Selections_", -"Коллекция": "Collection", -"Разобрать": "Parse", -"ИДЖелтого": "YellowID", -"Закрывает": "Closes", -"Прочитать": "Read", -"Структура": "Structure", -"ЧтениеZip": "ReadingZip", -"Служебные": "Service", -"обработки": "processing", -"КонецЕсли": "EndIf", -"Картинка2": "Image2", -"Открывает": "Opens", -"ИДОбъекта": "ObjectID", -"Категории": "Categories", -"ID товара": "Product ID", -"Анонимный": "Anonymous", -"Результат": "Result", -"РазмерCDH": "SizeCDH", "Рекламный": "Advertising", +"Календарь": "Calendar", +"Календари": "Calendars", +"ID канала": "Channel ID", +"окончания": "of end", +"URL файла": "File URL", +"НачалоДня": "StartOfDay", +"Заголовок": "Title", +"HTTPОтвет": "HTTPResponse", +"Значение:": "Value:", +"IDАльбома": "AlbumID", +"ИДЖелтого": "YellowID", +"Строковое": "String", +"Результат": "Result", +"Открывает": "Opens", +"Прочитать": "Read", "НовыйЛист": "NewSheet", -"Параметры_": "Parameters_", -"МассивЧата": "ChatArray", -"ФайлОтвета": "ResponseFile", -"Клавиатура": "Keyboard", -"ЧтениеJSON": "ReadingJSON", -"ООО Вектор": "LLC Vector", -"участникам": "to participants", -"КонецЦикла": "EndOfLoop", -"Текст тега": "Tag text", -"ОтветТокен": "TokenResponse", -"УдалитьТег": "DeleteTag", -"библиотеки": "libraries", -"Файл видео": "Video file", -"Количество": "Quantity", -"ИДКампании": "CampaignID", -"Информация": "Information", -"ИДКабинета": "CabinetID", -"Пропустить": "Skip", -"ИДВарианта": "VariantID", -"БезСтатуса": "NoStatus", -"ИмеетДлину": "HasLength", -"ID диалога": "Dialog ID", -"ИДКрасного": "RedID", -"ПутьКФайлу": "FilePath", -"HTTPЗапрос": "HTTPRequest", -"ВидЗапроса": "RequestType", -"ТокенКанал": "ChannelToken", -"Файл гифки": "GIF file", -"Файл аудио": "Audio file", -"ОжидаетЧто": "ExpectsThat", -"проведения": "of the event", -"параметров": "parameters", -"СтрТекущее": "StrCurrent", -"ЦветТекста": "TextColor", -"ИДКаталога": "CatalogID", +"Структура": "Structure", +"Кодировка": "Encoding", +"Имя папки": "Folder name", +"ВКонтакте": "VK", +"Процедура": "Procedure", +"Заполнено": "Filled", +"ИначеЕсли": "ElsIf", +"доступных": "available", +"НовыйТест": "NewTest", +"Сообщение": "Message", +"ВебКлиент": "WebClient", +"Разобрать": "Parse", +"Картинка2": "Image2", +"Выполнить": "Execute", +"Закрывает": "Closes", +"Картинка1": "Image1", +"Параметры": "Parameters", +"ТипСтрока": "TypeString", +"ГифкаПуть": "GifPath", +"РазмерЛФХ": "SizeLFH", +"ИДОбъекта": "ObjectID", +"РазмерЕСД": "SizeESD", +"ТокенБота": "BotToken", +"Истечение": "Expiration", +"Служебные": "Service", +"ЧтениеZip": "ReadingZip", +"КонецЕсли": "EndIf", +"Удаляемый": "Deletable", +"ПутьКопии": "CopyPath", +"РазмерСДХ": "SizeCDH", +"РазмерCDH": "SizeCDH", +"Вариант 1": "Option 1", +"АудиоПуть": "AudioPath", +"Файл_Стат": "File_Stat", +"Заголовки": "Headers", +"Свойства_": "Properties_", +"Изменение": "Change", +"Коллекция": "Collection", +"Значение_": "Value_", +"НаСервере": "AtServer", +"ИДАльбома": "AlbumID", +"Вычислить": "Calculate", +"Выражение": "Expression", +"ПутьЛогов": "LogPath", +"ТекущийИД": "CurrentID", +"ПолноеИмя": "FullName", +"Подборки_": "Selections_", +"программы": "program", +"ТипДанных": "DataType", +"ИмяПакета": "PackageName", +"В корзину": "To cart", +"URLОтвета": "ResponseURL", +"Удаленный": "Remote", +"Исполнить": "Execute", +"ИмяМетода": "MethodName", +"СтрШаблон": "StrTemplate", +"НаКлиенте": "AtClient", +"Последний": "Last", +"ВидеоПуть": "VideoPath", +"Доступные": "Available", +"ОбъектОПИ": "OPIObject", +"Вариант 2": "Option 2", +"обработки": "processing", +"ПутьКСтат": "PathToStat", +"Параметр_": "Parameter_", "СтрПроцент": "StrPercentage", -"ДатаНачала": "StartDate", -"Добавление": "Adding", -"Существует": "Exists", -"HTTPМетоды": "HTTPMethods", -"ФорматДаты": "DateFormat", -"МассивФото": "PhotoArray", -"Продолжить": "Continue", -"СерверФото": "PhotoServer", +"ЗаписьJSON": "WritingJSON", "КартинкаДД": "ImageDD", -"ИДПодборки": "SelectionID", -"отладочной": "debug", -"Объявление": "Ad", +"СтрТекущее": "StrCurrent", "ДокументДД": "DocumentDD", +"ID диалога": "Dialog ID", +"УдалитьТег": "DeleteTag", +"Разрешения": "Permissions", +"ЧтениеJSON": "ReadingJSON", +"ИмяТаблицы": "TableName", +"ИДКартинки": "ImageID", +"КонецЦикла": "EndDo", +"Файл видео": "Video file", +"Файл гифки": "GIF file", +"ПутьКФайлу": "FilePath", +"ЦветТекста": "TextColor", +"HTTPМетоды": "HTTPMethods", +"пожаловать": "welcome", +"возвращает": "returns", +"библиотек:": "libraries:", +"Клавиатура": "Keyboard", +"Расширение": "Extension", +"Библиотека": "Library", +"ВидЗапроса": "RequestType", +"ФайлОтвета": "ResponseFile", +"Бан\/Разбан": "Ban\/Unban", +"Продолжить": "Continue", +"Параметры:": "Parameters:", +"Пропустить": "Skip", +"БезСтатуса": "NoStatus", +"Информация": "Information", +"Приложение": "Application", +"HTTPЗапрос": "HTTPRequest", +"НовяИконка": "NewIcon", +"МассивЧата": "ChatArray", +"ОтветТокен": "TokenResponse", +"Твит с гиф": "Tweet with gif", +"Параметры_": "Parameters_", +"Исключение": "Except", +"Текст тега": "Tag text", +"ИДКрасного": "RedID", +"ИДВарианта": "VariantID", +"Добавление": "Adding", +"ID события": "Event ID", +"Статистика": "Statistics", +"IDКабинета": "AccountID", +"Токен бота": "Bot token", +"ИДКампании": "CampaignID", +"ИДКабинета": "CabinetID", +"ИмеетДлину": "HasLength", +"ОжидаетЧто": "ExpectsThat", +"Объявление": "Ad", +"библиотеки": "libraries", +"параметров": "parameters", +"Имя товара": "Product name", +"ДанныеПоля": "FieldData", +"ФайлВывода": "OutputFile", +"ПолныйПуть": "FullPath", +"Назначение": "Destination", +"СтараяЦена": "OldPrice", +"отключения": "disconnection", +"МассивФото": "PhotoArray", +"СерверФото": "PhotoServer", +"ИДПодборки": "SelectionID", +"информации": "information", +"ФорматДаты": "DateFormat", +"отладочной": "debug", "РазбитьURL": "SplitURL", "Соединение": "Connection", -"Исключение": "Exception", -"ФайлВывода": "OutputFile", -"НовяИконка": "NewIcon", -"ID альбома": "Album ID", -"IDКартинки": "ImageID", -"IDКабинета": "AccountID", -"ИДКартинки": "ImageID", -"отключения": "disconnection", -"Статистика": "Statistics", +"Количество": "Quantity", "Сохранение": "Save", -"Приложение": "Application", -"информации": "information", +"Существует": "Exists", +"ТокенКанал": "ChannelToken", +"ДатаНачала": "StartDate", +"проведения": "of the event", +"ИДКаталога": "CatalogID", "МассивИмен": "ArrayOfNames", +"Файл аудио": "Audio file", "ЦветКнопок": "ButtonColor", -"Библиотека": "Library", -"пожаловать": "welcome", -"Токен бота": "Bot token", -"ЗаписьJSON": "WritingJSON", -"Разрешения": "Permissions", -"Твит с гиф": "Tweet with gif", -"ИмяТаблицы": "TableName", -"возвращает": "returns", -"ID события": "Event ID", -"Новый файл": "NewFile", -"библиотек:": "libraries:", -"ПолныйПуть": "FullPath", -"ДанныеПоля": "FieldData", -"ХешФункция": "HashFunction", -"СтараяЦена": "OldPrice", -"на сервере": "on the server", -"Имя товара": "Product name", -"Параметры:": "Parameters:", "они разные": "they are different", -"Назначение": "Destination", -"Расширение": "Extension", -"Бан\/Разбан": "Ban\/Unban", -"ЦелевойПуть": "TargetPath", -"ИзИсточника": "FromSource", -"XMLЗначение": "XMLValue", -"ЛишниеБайты": "ExtraBytes", -"Комментарии": "Comments", -"УдалитьЛист": "DeleteSheet", -"СоздатьЛист": "CreateSheet", +"ID альбома": "Album ID", +"на сервере": "on the server", +"ХешФункция": "HashFunction", +"участникам": "to participants", +"ООО Вектор": "LLC Vector", +"Новый файл": "NewFile", +"IDКартинки": "ImageID", +"СоздатьБлок": "CreateBlock", "ОтборСтрока": "FilterString", -"МассивПутей": "PathsArray", -"МассивЯчеек": "Cell array", +"НайтиСтроки": "FindLines", "МетодПоиска": "SearchMethod", -"Разделитель": "Delimiter", -"уведомлений": "notifications", -"ПолеОтметки": "TimestampField", -"МассивПолей": "FieldArray", -"JSONСтрокой": "JSONString", -"МассивСвязи": "LinkArray", +"СтрокаФайла": "FileString", +"ТелоЗапроса": "RequestBody", +"Цель канала": "Channel purpose", +"XMLЗначение": "XMLValue", "ДанныеСхемы": "SchemaData", "УдалитьБлок": "DeleteBlock", -"ВернутьБлок": "ReturnBlock", -"Тема канала": "Channel topic", -"Цель канала": "Channel purpose", -"СоздатьБлок": "CreateBlock", -"ТекстОтвета": "ReplyText", -"ID страницы": "Page ID", -"Уведомления": "Notifications", -"НайтиСтроки": "FindLines", -"Медиагруппа": "MediaGroup", -"ТекущаяДата": "CurrentDate", -"ID Родителя": "Parent ID", -"ОткрытьФайл": "OpenFile", -"СоздатьБазу": "CreateDatabase", -"УдалитьФайл": "DeleteFile", -"СтрЗаменить": "StringReplace", -"ОбщийМодуль": "CommonModule", -"ИмяСодержит": "NameContains", -"ТекущийКлюч": "Current key", -"СоздатьПоле": "CreateField", -"Скопировать": "Copy", -"Цена товара": "Product price", -"ОписаниеИзм": "EditedDescription", -"НовыйСпособ": "NewMethod", -"ТекстКнопки": "ButtonText", -"ZipРазмерDD": "ZipSizeDD", -"ИмяКонтакта": "ContactName", -"ОтборПоТипу": "FilterByType", -"ОбщийДоступ": "PublicAccess", -"Токен Viber": "Viber Token", "ЗаменаТочки": "DotReplacement", -"КодВозврата": "ReturnCode", -"СкачатьФайл": "DownloadFile", -"ТипВложений": "AttachmentsType", -"Для YaxUnit": "For YAxUnit", -"ТелоЗапроса": "RequestBody", -"МассивВидео": "Video array", -"Для Asserts": "For Asserts", -"МассивГифок": "Gif array", -"Авторизация": "Authorization", -"МассивМедиа": "MediaArray", -"Текст твита": "Tweet text", -"Текст поста": "Post text", -"ДобавитьТег": "AddTag", -"ОтветМассив": "ResponseArray", -"УдалитьПост": "DeletePost", -"Остаток. -1": "Balance. -1", -"Новый товар": "New product", -"Комментарий": "Comment", -"JSON данные": "JSON data", -"РазмерБлока": "BlockSize", -"миллиметрах": "millimeters", -"ОченьВажное": "VeryImportant", -"Хеширование": "Hashing", -"ID подборок": "Selection IDs", -"РефрешТокен": "RefreshToken", -"ID подборки": "Selection ID", -"ID свойства": "Property ID", -"ВходнойФайл": "InputFile", -"ID варианта": "Variant ID", -"ID картинки": "Image ID", -"ТекстОшибки": "ErrorText", -"Фон истории": "Story background", -"МассивБлока": "ArrayBlock", -"КопироватьВ": "CopyTo", -"СоздатьПост": "CreatePost", -"Удалить тег": "Delete tag", -"Стандартные": "Standard", -"ОбщийРазмер": "TotalSize", -"IDОригинала": "OriginalID", -"НомерГруппы": "GroupNumber", -"ТекущийФайл": "CurrentFile", -"Новое видео": "NewVideo", -"расширением": "extension", -"НовыйЗапрос": "NewRequest", -"ТипКонтента": "ContentType", -"РазмерЧасти": "ChunkSize", -"ЭтоУдаление": "ThisIsDeletion", -"ВЗаголовках": "InHeaders", -"IDСообщения": "MessageID", -"Петр Петров": "Petr Petrov", -"СтрокаФайла": "FileString", +"ZipРазмерDD": "ZipSizeDD", "ПолныйОтвет": "FullResponse", +"ТекстОшибки": "ErrorText", +"JSONСтрокой": "JSONString", +"Уведомления": "Notifications", +"СтрЗаменить": "StringReplace", +"ФайлНаДиске": "FileOnDisk", +"Хеширование": "Hashing", +"ТипКонтента": "ContentType", +"НоваяСтрока": "NewLine", +"ТекущаяДата": "CurrentDate", +"Сортировать": "Sort", +"уведомлений": "notifications", +"КопироватьВ": "CopyTo", +"Скопировать": "Copy", +"УдалитьФайл": "DeleteFile", +"расширением": "extension", +"Тема канала": "Channel topic", +"МассивСвязи": "LinkArray", +"ПолеОтметки": "TimestampField", +"РазмерБлока": "BlockSize", +"НовыйЗапрос": "NewRequest", +"миллиметрах": "millimeters", +"СоздатьПост": "CreatePost", +"НомерГруппы": "GroupNumber", +"МассивЯчеек": "Cell array", +"Новое видео": "NewVideo", +"ИмяСодержит": "NameContains", +"ID картинки": "Image ID", +"СоздатьПоле": "CreateField", +"Фон истории": "Story background", "ИДКатегории": "CategoryID", +"Петр Петров": "Petr Petrov", +"ЛишниеБайты": "ExtraBytes", +"Разделитель": "Delimiter", +"УдалитьПост": "DeletePost", +"СкачатьФайл": "DownloadFile", +"Комментарии": "Comments", +"ИзИсточника": "FromSource", +"МассивПолей": "FieldArray", +"ОписаниеИзм": "EditedDescription", +"УдалитьЛист": "DeleteSheet", "ВнешнийПост": "ExternalPost", "ЗаписатьЛог": "WriteLog", -"Сортировать": "Sort", -"АдресаПочты": "EmailAddresses", +"ID подборок": "Selection IDs", +"ID подборки": "Selection ID", +"ID свойства": "Property ID", +"ID варианта": "Variant ID", +"МассивБлока": "ArrayBlock", +"ОтветМассив": "ResponseArray", +"НовыйСпособ": "NewMethod", +"Комментарий": "Comment", +"ОтборПоТипу": "FilterByType", +"ОбщийДоступ": "PublicAccess", +"Новый товар": "New product", +"Остаток. -1": "Balance. -1", +"Цена товара": "Product price", +"КодВозврата": "ReturnCode", +"Для YaxUnit": "For YAxUnit", +"Для Asserts": "For Asserts", +"СоздатьЛист": "CreateSheet", +"Текст поста": "Post text", +"СоздатьБазу": "CreateDatabase", +"ВернутьБлок": "ReturnBlock", +"МассивМедиа": "MediaArray", +"ЭтоУдаление": "ThisIsDeletion", +"ЦелевойПуть": "TargetPath", +"ВЗаголовках": "InHeaders", +"ТекущийФайл": "CurrentFile", +"РефрешТокен": "RefreshToken", +"Медиагруппа": "MediaGroup", +"Текст твита": "Tweet text", +"ОбщийРазмер": "TotalSize", +"ТекстКнопки": "ButtonText", +"Авторизация": "Authorization", +"МассивПутей": "PathsArray", +"JSON данные": "JSON data", +"ОченьВажное": "VeryImportant", +"МассивГифок": "Gif array", +"МассивВидео": "Video array", +"IDСообщения": "MessageID", +"ОбщийМодуль": "CommonModule", +"ИмяКонтакта": "ContactName", +"Токен Viber": "Viber Token", +"ОткрытьФайл": "OpenFile", +"ДобавитьТег": "AddTag", +"Удалить тег": "Delete tag", +"ТекстОтвета": "ReplyText", +"РазмерЧасти": "ChunkSize", "ЦветКонсоли": "ConsoleColor", -"ФайлНаДиске": "FileOnDisk", -"НоваяСтрока": "NewLine", -"КодировкаURL": "URLencoding", -"Число,Строка": "Number, String", -"IDОбсуждения": "DiscussionID", -"ОсновноеФото": "MainPhoto", -"Имя контакта": "Contact name", +"ТекущийКлюч": "Current key", +"Стандартные": "Standard", +"ID Родителя": "Parent ID", +"АдресаПочты": "EmailAddresses", +"ТипВложений": "AttachmentsType", +"ID страницы": "Page ID", +"IDОригинала": "OriginalID", +"ВходнойФайл": "InputFile", "МассивЛистов": "SheetArray", -"УдалитьТовар": "DeleteProduct", -"ДанныеЯчейки": "CellData", -"КлючКартинка": "ImageKey", -"ЦелеваяСтена": "Target wall", -"ОтборКоманды": "CommandSelection", -"РазмерДанных": "DataSize", -"URL картинки": "Image URL", -"ПубличныйURL": "PublicURL", -"СтрокаДанных": "DataString", -"СтрСоединить": "StrJoin", -"ID, Значение": "ID, Value", -"МассивНабора": "Array of Sets", -"ОписаниеJSON": "JSONDescription", -"ДопЗаголовки": "AdditionalHeaders", -"КодСостояния": "StatusCode", -"СоздатьКнигу": "CreateBook", -"ИзменитьПоле": "ModifyField", -"СтрРазделить": "StrSplit", -"Создать базу": "Create base", -"ДобавитьЛист": "AddSheet", -"IDОбъявления": "AdID", -"Строка,Число": "String, Number", -"ТекущийТовар": "CurrentProduct", -"МассивФайлов": "ArrayOfFiles", -"ДневнойЛимит": "DailyLimit", -"КонечнаяДата": "EndDate", -"ТекстСправки": "HelpText", -"Наименование": "Name", -"ДобавитьПоле": "AddField", -"КонецПопытки": "EndOfAttempt", -"ИДОбсуждения": "DiscussionID", -"МассивДанных": "Data array", +"Создать блок": "Create block", "Удалить лист": "DeleteSheet", -"СоздатьОпрос": "CreatePoll", -"СтрокаВызова": "CallString", -"ЭтоКоллекция": "ThisIsCollection", -"Сформировать": "Formulate", -"МассивЧтения": "ArrayReading", -"ЦветнойВывод": "ColorOutput", -"ДатаОтправки": "Sending date", -"КонецФункции": "EndFunction", -"КонецОбласти": "EndRegion", -"Пользователь": "User", -"Base64Строка": "Base64String", -"ЗаписатьJSON": "WriteJSON", -"ФайлОтправки": "SendingFile", -"МассивПостов": "ArrayOfPosts", -"Тип вложений": "Attachments type", -"ПолучитьФайл": "GetFile", -"ВнешняяСтена": "ExternalWall", -"Длительность": "Duration", -"ИмяПараметра": "ParameterName", -"СоздатьКанал": "CreateChannel", -"СписокКоманд": "CommandList", -"Архивировать": "Archive", -"УдалитьФайлы": "DeleteFiles", -"Telegram_Бан": "Telegram_Ban", -"Соответствие": "Match", -"МассивТаблиц": "TableArray", -"МассивКнопок": "ButtonArray", -"ID чата темы": "Thread chat ID", -"МассивЛишних": "ExtraArray", -"Удалить пост": "Delete post", -"Дублирования": "duplicates", -"ОднаПодОдной": "OneByOne", -"ДокументПуть": "DocumentPath", -"Создать пост": "Create post", -"СтрокаМетода": "MethodLine", -"Файл размера": "File size", -"КартинкаПуть": "ImagePath", +"СоздатьКнигу": "CreateBook", +"МассивДанных": "Data array", "Архивирована": "Archived", "ОбъектИконка": "Icon object", -"МассивТекста": "TextArray", -"ОтветСтрокой": "ResponseString", -"Создать блок": "Create block", -"Создать поле": "Create field", -"МассивБлоков": "BlockArray", -"ТолькоОснова": "OnlyBase", -"Удалить блок": "Delete block", -"ИДОбъявления": "AnnouncementID", -"Пользователи": "Users", -"РодительБаза": "ParentBase", -"КлючДвоичные": "BinaryKey", -"НовыйПрефикс": "NewPrefix", -"Удалить файл": "Delete file", +"КодСостояния": "StatusCode", "загружаемого": "uploading", +"ДанныеЯчейки": "CellData", +"ОписаниеJSON": "JSONDescription", +"ДопЗаголовки": "AdditionalHeaders", +"ДобавитьЛист": "AddSheet", +"МассивФайлов": "ArrayOfFiles", "Использовать": "Use", -"пустой ответ": "empty response", -"ЧислоВСтроку": "NumberToString", -"СкачатьПапку": "DownloadFolder", -"ЗаписьДанных": "DataRecording", -"ЗаписьТекста": "TextRecord", -"ОсновнойЦвет": "PrimaryColor", -"ЧтениеДанных": "ReadingData", -"ЧтениеТекста": "ReadingText", -"Тестирование": "Testing", -"Добавить тег": "Add tag", -"ПотокВПамяти": "MemoryStream", -"СоздатьПапку": "CreateFolder", -"ОписаниеТипа": "TypeDescription", -"ПрочитатьZip": "ReadZip", -"СжатыеДанные": "CompressedData", -"Рефреш токен": "Refresh token", -"ПараметрыURL": "URLParameters", -"Существующее": "Existing", -"ID календаря": "Calendar ID", -"Скачать файл": "Download file", -"Неопределено": "Undefined", -"БезВозвратно": "Irrecoverable", -"Безвозвратно": "Irretrievably", +"ТолькоОснова": "OnlyBase", +"ТекущийТовар": "CurrentProduct", +"УдалитьТовар": "DeleteProduct", +"ОсновноеФото": "MainPhoto", +"ОтветСтрокой": "ResponseString", +"Сформировать": "Formulate", +"Telegram_Бан": "Telegram_Ban", +"ВнешняяСтена": "ExternalWall", +"МассивПостов": "ArrayOfPosts", +"ИДОбъявления": "AnnouncementID", +"ПубличныйURL": "PublicURL", +"Архивировать": "Archive", +"ПолучитьФайл": "GetFile", +"КартинкаПуть": "ImagePath", +"ДокументПуть": "DocumentPath", +"ИДОбсуждения": "DiscussionID", +"Твит с видео": "Tweet with video", "ТестыРаздела": "SectionTests", +"ПрочитатьZip": "ReadZip", +"ПотокВПамяти": "MemoryStream", "ZipРазмерLFH": "ZipSizeLFH", -"ОбновитьФайл": "UpdateFile", -"МассивТестов": "ArrayOfTests", -"ТипКоллекции": "CollectionType", -"СтруктураURL": "URLStructure", -"ПолучитьДату": "GetDate", +"ZipРазмерCDH": "ZipSizeCDH", +"СжатыеДанные": "CompressedData", +"ЗаписьДанных": "DataRecording", +"ID, Значение": "ID, Value", +"ЗаписьТекста": "TextRecord", +"МестноеВремя": "LocalTime", +"ОписаниеТипа": "TypeDescription", +"ЧтениеТекста": "ReadingText", "ДокументЛога": "LogDocument", "КаталогЛогов": "LogDirectory", -"МестноеВремя": "LocalTime", -"ZipРазмерCDH": "ZipSizeCDH", -"Твит с видео": "Tweet with video", -"ТекущийРаздел": "CurrentSection", -"ТекущийМассив": "Current array", -"НомерТелефона": "PhoneNumber", -"Файл с Base64": "Base64 File", -"Идентификатор": "Identifier", -"Блок картинки": "Image block", -"ФайлЛокальный": "LocalFile", -"Новая таблица": "NewTable", -"МассивТоваров": "Array of products", -"СимволМассива": "ArraySymbol", -"МассивКаналов": "ChannelArray", +"МассивТестов": "ArrayOfTests", +"ТипКоллекции": "CollectionType", +"МассивБлоков": "BlockArray", +"IDОбъявления": "AdID", +"КонечнаяДата": "EndDate", +"Удалить блок": "Delete block", +"Пользователи": "Users", +"РодительБаза": "ParentBase", +"МассивЛишних": "ExtraArray", +"МассивТекста": "TextArray", +"ДатаОтправки": "Sending date", +"Пользователь": "User", +"СоздатьКанал": "CreateChannel", +"Удалить файл": "Delete file", +"URL картинки": "Image URL", +"Строка,Число": "String, Number", +"СтрокаДанных": "DataString", +"КодировкаURL": "URLencoding", +"КлючДвоичные": "BinaryKey", +"Имя контакта": "Contact name", +"МассивКнопок": "ButtonArray", +"ОднаПодОдной": "OneByOne", +"МассивНабора": "Array of Sets", +"ЦелеваяСтена": "Target wall", +"IDОбсуждения": "DiscussionID", +"КлючКартинка": "ImageKey", +"РазмерДанных": "DataSize", +"СоздатьОпрос": "CreatePoll", +"ДневнойЛимит": "DailyLimit", +"Удалить пост": "Delete post", +"МассивЧтения": "ArrayReading", +"Base64Строка": "Base64String", +"ФайлОтправки": "SendingFile", +"Тип вложений": "Attachments type", +"Длительность": "Duration", +"ID чата темы": "Thread chat ID", +"Создать пост": "Create post", +"ОбновитьФайл": "UpdateFile", +"ТонкийКлиент": "ThinClient", +"ЭтоКоллекция": "ThisIsCollection", +"ИзменитьПоле": "ModifyField", +"СтрСоединить": "StrJoin", +"Рефреш токен": "Refresh token", +"Неопределено": "Undefined", +"ОсновнойЦвет": "PrimaryColor", +"ЦветнойВывод": "ColorOutput", +"ИмяПараметра": "ParameterName", +"ЧтениеДанных": "ReadingData", +"СтрокаВызова": "CallString", +"СтруктураURL": "URLStructure", +"Создать поле": "Create field", +"Число,Строка": "Number, String", +"Добавить тег": "Add tag", +"СкачатьПапку": "DownloadFolder", +"пустой ответ": "empty response", +"КонецОбласти": "EndRegion", +"КонецФункции": "EndFunction", +"ОтборКоманды": "CommandSelection", +"Скачать файл": "Download file", +"ДобавитьПоле": "AddField", +"КонецПопытки": "EndTry", +"Создать базу": "Create base", +"СоздатьПапку": "CreateFolder", +"МассивТаблиц": "TableArray", +"Соответствие": "Match", +"ЧислоВСтроку": "NumberToString", +"Наименование": "Name", +"Безвозвратно": "Irretrievably", +"НовыйПрефикс": "NewPrefix", +"ЗаписатьJSON": "WriteJSON", +"ID календаря": "Calendar ID", +"Файл размера": "File size", +"ПараметрыURL": "URLParameters", +"ПолучитьДату": "GetDate", +"Дублирования": "duplicates", +"Существующее": "Existing", +"СписокКоманд": "CommandList", +"СтрРазделить": "StrSplit", +"ТекстСправки": "HelpText", +"СтрокаМетода": "MethodLine", +"УдалитьФайлы": "DeleteFiles", +"Тестирование": "Testing", +"БезВозвратно": "Irrecoverable", +"ПолучитьКанал": "GetChannel", "ПараметрыJSON": "JSONParameters", -"Создать папку": "Create folder", -"ПрочитатьGZip": "ReadGZip", -"ПрочитатьJSON": "ReadJSON", -"МассивОтветов": "AnswersArray", -"ФайловыйПоток": "FileStream", -"ВладелецВидео": "VideoOwner", -"Вопрос опроса": "Poll question", -"ЗагрузкаВидео": "VideoUpload", -"ID обсуждения": "Discussion ID", -"СвойстваЛиста": "Sheet properties", -"ПоставитьЛайк": "LikePost", -"ЭтоСимвольное": "ThisIsSymbolic", -"ID объявления": "Ad ID", -"ОбновитьТокен": "RefreshToken", -"КартинкаПоста": "PostImage", -"ПорядокБайтов": "ByteOrder", -"СоздатьЗапрос": "CreateRequest", -"РаботаСПолями": "FieldWork", -"ДобавитьМесяц": "AddMonth", -"ОтправитьФайл": "SendFile", -"НомерКампании": "CampaignNumber", -"Файл картинки": "Image file", -"ВставитьПосле": "InsertAfter", -"СтруктураДаты": "DateStructure", -"СтрокаНомеров": "NumbersString", -"Число, Строка": "Number, String", -"Строка, Число": "String, Number", -"ДФ=yyyy-MM-dd": "DF=yyyy-MM-dd", -"UnixИстечение": "UnixExpiration", -"Администратор": "Administrator", -"ОбъектОбложка": "Cover object", -"Массив файлов": "Files array", -"ZipРазмерEOCD": "ZipSizeEOCD", -"ПутьОригинала": "OriginalPath", -"Скачать папку": "Download folder", -"ЗакрытьСессию": "CloseSession", -"СделатьРепост": "MakeRepost", -"ЭтоОтложенное": "IsDelayed", -"Переадресация": "Redirection", -"ПолучитьТокен": "GetToken", -"ОписаниеТипов": "TypeDescription", +"Файл с Base64": "Base64 File", +"Тестовая цель": "TestGoal", +"Тестовая тема": "TestTopic", "СписокТоваров": "ProductList", -"ВыборЗначения": "ValueSelection", -"СтруктураПоля": "FieldStructure", -"РаботаСТегами": "TagWork", -"ВывестиСтроку": "PrintString", -"ЗапросыСТелом": "RequestsWithBody", -"Создать опрос": "Create poll", -"ПолучитьТекст": "GetText", -"Тестовый лист": "TestSheet", -"РазложитьJSON": "ParseJSON", -"Описание поля": "Field description", -"ВозможныеПути": "PossiblePaths", +"УдалитьОбъект": "DeleteObject", +"не ограничено": "unlimited", +"Создать папку": "Create folder", +"ДобавитьТовар": "AddProduct", +"ФайловыйПоток": "FileStream", +"Тестовая база": "TestDatabase", +"СимволМассива": "ArraySymbol", "ПокинутьКанал": "LeaveChannel", -"ЗагрузитьФайл": "UploadFile", -"СтрокаЗаписей": "RecordString", -"УдалитьЗаписи": "DeletePosts", +"Переадресация": "Redirection", +"ВывестиСтроку": "PrintString", +"ДатаОкончания": "EndDate", +"СоздатьАльбом": "CreateAlbum", +"Дата создания": "CreationDate", +"ТекущиеДанные": "Current data", +"Новое событие": "New event", +"РаботаСБазами": "DatabaseWork", +"МассивСобытий": "ArrayOfEvents", +"СвойстваЛиста": "Sheet properties", +"ИзменитьТовар": "EditProduct", +"ПоставитьЛайк": "LikePost", +"ЗапросыСТелом": "RequestsWithBody", +"UnixИстечение": "UnixExpiration", +"ЭтоОтложенное": "IsDelayed", +"ОбновитьТокен": "RefreshToken", +"Удалить товар": "Delete product", +"ОписаниеТипов": "TypeDescription", +"ЗагрузкаВидео": "VideoUpload", +"ЕдиницаДанных": "DataUnit", +"ПрочитаноБайт": "BytesRead", +"ПрочитатьJSON": "ReadJSON", +"ОбработатьТег": "ProcessTag", +"ОткрытьСессию": "OpenSession", +"Идентификатор": "Identifier", +"ВозможныйПуть": "PossiblePath", +"ВозможныеПути": "PossiblePaths", +"ВозможныйФайл": "PossibleFile", +"Новая таблица": "NewTable", +"Создать канал": "Create channel", +"ЭтоСимвольное": "ThisIsSymbolic", +"ПолучитьТекст": "GetText", +"СоздатьЗапрос": "CreateRequest", +"ОбъектОбложка": "Cover object", +"Экранирование": "Escaping", +"СтрокаТаблицы": "TableRow", +"ТекущийМассив": "Current array", +"ПолучитьТокен": "GetToken", +"УдалитьАльбом": "DeleteAlbum", +"ВладелецВидео": "VideoOwner", +"ЛишниеСимволы": "ExtraCharacters", +"СтрокаТоваров": "ProductsString", +"СделатьРепост": "MakeRepost", +"Описание поля": "Field description", +"МассивОтветов": "AnswersArray", +"КодУстройства": "DeviceCode", +"Адрес объекта": "Object address", +"НомерКампании": "CampaignNumber", "АдресЗагрузки": "UploadURL", "ОтветЗагрузки": "UploadResponse", -"ПолучитьЧисло": "GetNumber", +"ПутьОригинала": "OriginalPath", "ИсходныйПоток": "SourceStream", -"Версия: 2.4.8": "Version: 2.4.8", -"Метод,Область": "Method,Region", -"СоздатьАльбом": "CreateAlbum", -"ДобавитьТовар": "AddProduct", -"ОтветПроверки": "CheckResponse", -"ПрочитаноБайт": "BytesRead", -"ПолучитьКанал": "GetChannel", -"ВозможныйФайл": "PossibleFile", -"ДатаОкончания": "EndDate", -"Создать книгу": "CreateBook", -"ИзменитьТовар": "EditProduct", -"НовыйРодитель": "NewParent", -"НомерСтраницы": "PageNumber", -"Адрес объекта": "Object address", -"ЗакрытьДиалог": "CloseDialog", -"не ограничено": "unlimited", -"ОткрытьДиалог": "OpenDialog", -"Новое событие": "New event", -"КодУстройства": "DeviceCode", -"Обновить файл": "Update file", -"СоздатьЗаписи": "CreatePosts", -"Экранирование": "Escaping", -"ДатаИстечения": "ExpirationDate", -"Дата создания": "CreationDate", -"МассивЗаказов": "ArrayOfOrders", -"ВозможныйПуть": "PossiblePath", -"ТаблицаТестов": "TestTable", -"УдалитьАльбом": "DeleteAlbum", -"Удалить товар": "Delete product", -"ТекущийОбъект": "CurrentObject", -"ИДКомментария": "CommentID", -"СтрокаТаблицы": "TableRow", -"УдалитьОбъект": "DeleteObject", -"Создать канал": "Create channel", -"МассивСобытий": "ArrayOfEvents", -"Тестовая тема": "TestTopic", -"СтрокаТоваров": "ProductsString", -"ЛишниеСимволы": "ExtraCharacters", +"Массив кнопок": "Array of buttons", +"Блок картинки": "Image block", +"Строка, Число": "String, Number", +"ПорядокБайтов": "ByteOrder", "Изменить поле": "Modify field", -"РаботаСБазами": "DatabaseWork", -"ТекущиеДанные": "Current data", -"Тестовая база": "TestDatabase", +"Администратор": "Administrator", +"Вопрос опроса": "Poll question", +"ПолучитьЧисло": "GetNumber", +"ТекущийОбъект": "CurrentObject", +"РаботаСТегами": "TagWork", +"СтрокаНомеров": "NumbersString", +"ТаблицаТестов": "TestTable", +"ОтправитьФайл": "SendFile", +"Обновить файл": "Update file", +"Файл картинки": "Image file", +"ДобавитьМесяц": "AddMonth", +"СоздатьЗаписи": "CreatePosts", +"МассивКаналов": "ChannelArray", +"НовыйРодитель": "NewParent", +"ДФ=yyyy-MM-dd": "DF=yyyy-MM-dd", +"ВставитьПосле": "InsertAfter", +"УдалитьЗаписи": "DeletePosts", +"ИДКомментария": "CommentID", +"СтрокаЗаписей": "RecordString", +"ВыборЗначения": "ValueSelection", +"НомерТелефона": "PhoneNumber", +"СтруктураДаты": "DateStructure", +"ТекущийРаздел": "CurrentSection", +"ПодСообщением": "UnderMessage", +"ОтветПроверки": "CheckResponse", "ПолучитьКнигу": "GetBook", -"ОткрытьСессию": "OpenSession", +"Создать опрос": "Create poll", +"ЗакрытьСессию": "CloseSession", +"РазложитьJSON": "ParseJSON", +"ПрочитатьGZip": "ReadGZip", +"Версия: 2.4.8": "Version: 2.4.8", +"ФайлЛокальный": "LocalFile", +"Число, Строка": "Number, String", +"НомерСтраницы": "PageNumber", +"Добавить лист": "AddSheet", +"МассивТоваров": "Array of products", +"ЗакрытьДиалог": "CloseDialog", +"РазмерТекущих": "CurrentSize", +"ID обсуждения": "Discussion ID", +"ОткрытьДиалог": "OpenDialog", +"Скачать папку": "Download folder", +"Тестовый лист": "TestSheet", +"МассивЗаказов": "ArrayOfOrders", +"ZipРазмерEOCD": "ZipSizeEOCD", +"СтруктураПоля": "FieldStructure", +"РаботаСПолями": "FieldWork", +"КартинкаПоста": "PostImage", +"ДатаИстечения": "ExpirationDate", +"Метод,Область": "Method,Region", +"Массив файлов": "Files array", +"Создать книгу": "CreateBook", +"ID объявления": "Ad ID", +"ЗагрузитьФайл": "UploadFile", "пустая строка": "empty string", "ТекущийСтатус": "CurrentStatus", -"Массив кнопок": "Array of buttons", -"ПодСообщением": "UnderMessage", -"РазмерТекущих": "CurrentSize", -"ЕдиницаДанных": "DataUnit", -"Добавить лист": "AddSheet", -"Тестовая цель": "TestGoal", -"ОбработатьТег": "ProcessTag", -"СоздатьКаталог": "CreateDirectory", -"Обновить токен": "Refresh token", -"Создать альбом": "Create album", -"Base64Значение": "Base64Value", -"ОтправкаДанных": "DataSending", -"АТ_СоздатьПоле": "AT_CreateField", -"АТ_СоздатьБазу": "AT_CreateDatabase", -"Номер телефона": "Phone number", -"СтрокаВложений": "AttachmentsString", -"РаботаСБлоками": "BlockWork", -"Тип клавиатуры": "KeyboardType", -"СоздатьИсторию": "CreateStory", -"РаботаСФайлами": "FileWork", -"СтруктураЯчеек": "CellStructure", -"СтрокаПодборок": "SelectionsString", -"Путь к объекту": "Path to the object", -"ОписаниеМетода": "MethodDescription", -"КопироватьФайл": "CopyFile", -"Закрыть диалог": "Close dialog", -"Новое название": "New name", -"УдалитьСобытие": "DeleteEvent", -"Открыть диалог": "Open dialog", -"ОписаниеОшибки": "ErrorDescription", -"МассивИДПостов": "Array of post IDs", -"ПараметрМетода": "MethodParameter", -"СоздатьСобытие": "CreateEvent", -"ТолькоПросмотр": "ViewOnly", -"МассивОписаний": "ArrayOfDescriptions", -"Удалить альбом": "Delete album", -"УдалитьWebhook": "DeleteWebhook", -"Удалить объект": "Delete object", -"VK_СоздатьПост": "VK_CreatePost", -"СтруктураМедиа": "MediaStructure", -"МассивКартинок": "ImageArray", -"ПолучитьОбъект": "GetObject", -"Удалить записи": "Delete records", -"СтрНачинаетсяС": "StringStartsWith", -"Сделать репост": "Make repost", -"Получить канал": "Get channel", -"VK_УдалитьПост": "VK_DeletePost", -"СтруктураФайла": "FileStructure", -"Описание видео": "Video description", -"ПараметрыТеста": "TestParameters", -"ИДПользователя": "UserID", -"КартинкаЗамены": "ReplacementImage", -"Тестовый твитт": "TestTweet", -"ЗапросыБезТела": "RequestsWithoutBody", -"ЧтениеZipФайла": "ReadingZipFile", -"Новое описание": "New description", -"ДвоичныеДанные": "BinaryData", -"ТекущаяКоманда": "CurrentCommand", -"JsonВСтруктуру": "JsonToStructure", -"ПолучитьМассив": "GetArray", -"ФорматДатыJSON": "JSONDateFormat", -"СоздатьТаблицу": "CreateTable", -"ТекущаяОбласть": "CurrentRegion", -"Поставить лайк": "Like", -"Покинуть канал": "Leave channel", -"ВступитьВКанал": "JoinChannel", -"ПолноеИмяМедиа": "FullMediaName", -"Тестовая папка": "TestFolder", -"КонецПроцедуры": "EndProcedure", -"Номер страницы": "Page number", -"МаксимумПостов": "MaximumPosts", -"МассивПодборок": "SelectionArray", -"Проверка_Пусто": "Check_Empty", -"СтрочныйМассив": "StringArray", -"ПутьСохранения": "SavePath", -"ОписаниеТовара": "ProductDescription", -"РаботаСКнигами": "BookWork", -"ОтправкаВКанал": "SendingToChannel", -"Перезаписывать": "Overwrite", -"Файл, Значение": "File, Value", -"ПрочитанноБайт": "BytesRead", -"HTTPСоединение": "HTTPConnection", -"ЗаписанныйФайл": "RecordedFile", -"ТекущаяПозиция": "CurrentPosition", -"ТекущеВложение": "CurrentAttachment", -"ОтправитьГифку": "SendGif", -"МассивВложений": "AttachmentsArray", -"Создать записи": "Create records", -"Добавить товар": "Add product", -"Получить токен": "Get token", -"Получить книгу": "GetBook", -"КлючПриложения": "AppKey", -"РаботаСДанными": "DataWork", -"КопироватьЛист": "CopySheet", -"Заголовок темы": "Thread title", -"ОтправитьОпрос": "SendPoll", -"Библиотека: VK": "Library: VK", -"ОчиститьЯчейки": "ClearCells", -"РаботаСГруппой": "GroupWork", -"СтруктураОпций": "OptionsStructure", -"ТекущийЭлемент": "CurrentElement", -"РаботаСЛистами": "SheetWork", -"МассивЗапросов": "ArrayOfRequests", -"МассивОбъектов": "ArrayOfObjects", -"ПолучитьЗапись": "GetRecord", -"ГлавныйВГруппе": "MainInGroup", -"ПолучитьСостав": "GetComposition", -"Отбор по имени": "Filter by name", -"СтрОбщийРазмер": "StrTotalSize", -"Загрузить файл": "Upload file", -"МассивОписания": "DescriptionArray", -"IDПользователя": "UserID", -"ОтправитьАудио": "SendAudio", -"МассивАльбомов": "ArrayOfAlbums", -"Изменить товар": "Edit product", -"ОтправитьВидео": "SendVideo", -"МассивСтруктур": "Array of Structures", -"ЗаписатьСтроку": "WriteString", -"МассивТоваров_": "Array_of_Products", -"Это новый файл": "This is a new file", -"ПолучитьПревью": "GetPreview", -"ID базы данных": "Database ID", -"Отправить файл": "SendFile", -"Новый файл.jpg": "New file.jpg", -"Текстовый твит": "Text tweet", "ПолучитьБулево": "GetBoolean", -"Описание файла": "File description", -"Тестовый товар": "TestProduct", -"Твит с опросом": "Tweet with poll", -"ПолучитьВерсию": "GetVersion", "НомерКатегории": "CategoryNumber", -"Файл документа": "Document file", -"МассивОтправки": "SendArray", -"ПолучитьСтроку": "GetLine", +"ИДПользователя": "UserID", +"МассивТоваров_": "Array_of_Products", +"Base64Значение": "Base64Value", +"МассивОписания": "DescriptionArray", +"СоздатьСобытие": "CreateEvent", +"Изменить товар": "Edit product", +"СтруктураФайла": "FileStructure", +"ОписаниеТовара": "ProductDescription", +"Перезаписывать": "Overwrite", +"ТекущийЭлемент": "CurrentElement", +"ПолучитьЗапись": "GetRecord", +"Загрузить файл": "Upload file", +"МассивСтруктур": "Array of Structures", +"МассивКартинок": "ImageArray", +"Добавить товар": "Add product", +"АТ_СоздатьБазу": "AT_CreateDatabase", +"СтрочныйМассив": "StringArray", +"МассивПодборок": "SelectionArray", "ОписаниеЗаписи": "RecordDescription", -"АтомарныеТесты": "AtomicTests", +"МассивОтправки": "SendArray", +"КартинкаЗамены": "ReplacementImage", +"Тестовая папка": "TestFolder", +"Новое описание": "New description", +"IDПользователя": "UserID", +"ПолучитьОбъект": "GetObject", +"Проверка_Пусто": "Check_Empty", +"ОтправитьОпрос": "SendPoll", +"СтруктураОпций": "OptionsStructure", +"УдалитьWebhook": "DeleteWebhook", +"Заголовок темы": "Thread title", +"Тестовый товар": "TestProduct", +"Удалить записи": "Delete records", "ФайлСтатистики": "StatisticsFile", "РабочийКаталог": "WorkingDirectory", -"Создать таблицу": "Create table", -"ФайлРепозитория": "RepositoryFile", -"ЗагруженныйФайл": "UploadedFile", -"ЗаписатьЦелое32": "WriteInt32", -"Команда CLI: vk": "CLI Command: vk", -"ОригиналныйПуть": "OriginalPath", -"СтатусСообщения": "MessageStatus", -"ПолучитьСобытие": "GetEvent", -"ЗаголовокПотока": "StreamHeader", -"перенаправления": "redirection", -"Создать событие": "Create event", -"УдалитьКартинку": "DeleteImage", -"OPI_Инструменты": "OPI_Tools", -"УстановитьТекст": "SetText", -"ЗначенияСвойств": "PropertyValues", -"ТокенВЗаголовки": "TokenInHeaders", -"ОписаниеСобытия": "EventDescription", -"ИскомыйПараметр": "DesiredParameter", +"ОтправкаДанных": "DataSending", +"Файл, Значение": "File, Value", +"Создать записи": "Create records", +"ОтправитьГифку": "SendGif", +"VK_УдалитьПост": "VK_DeletePost", +"Файл документа": "Document file", +"VK_СоздатьПост": "VK_CreatePost", +"ПараметрыТеста": "TestParameters", +"ОтправитьВидео": "SendVideo", +"ПолучитьМассив": "GetArray", +"ПолучитьПревью": "GetPreview", +"КлючПриложения": "AppKey", +"СтруктураЯчеек": "CellStructure", +"ПолучитьСтроку": "GetLine", +"Путь к объекту": "Path to the object", +"СтрНачинаетсяС": "StringStartsWith", +"АтомарныеТесты": "AtomicTests", +"КопироватьФайл": "CopyFile", +"СтруктураМедиа": "MediaStructure", +"ПолноеИмяМедиа": "FullMediaName", +"ГлавныйВГруппе": "MainInGroup", +"Обновить токен": "Refresh token", +"ТекущаяПозиция": "CurrentPosition", +"МассивОписаний": "ArrayOfDescriptions", +"ФорматДатыJSON": "JSONDateFormat", +"СоздатьТаблицу": "CreateTable", +"АТ_СоздатьПоле": "AT_CreateField", +"СтрокаПодборок": "SelectionsString", +"Получить канал": "Get channel", +"МаксимумПостов": "MaximumPosts", +"ВступитьВКанал": "JoinChannel", +"Покинуть канал": "Leave channel", +"Новое название": "New name", +"Получить токен": "Get token", +"Тестовый твитт": "TestTweet", +"Открыть диалог": "Open dialog", +"Закрыть диалог": "Close dialog", +"РаботаСФайлами": "FileWork", +"Номер страницы": "Page number", +"МассивАльбомов": "ArrayOfAlbums", +"Текстовый твит": "Text tweet", +"Тип клавиатуры": "KeyboardType", +"ОтправитьАудио": "SendAudio", +"ПолучитьВерсию": "GetVersion", +"РаботаСДанными": "DataWork", +"КопироватьЛист": "CopySheet", +"ID базы данных": "Database ID", +"Создать альбом": "Create album", +"ПутьСохранения": "SavePath", +"Библиотека: VK": "Library: VK", +"Удалить объект": "Delete object", +"Отправить файл": "SendFile", +"РаботаСГруппой": "GroupWork", +"СтрОбщийРазмер": "StrTotalSize", +"Сделать репост": "Make repost", +"ЧтениеZipФайла": "ReadingZipFile", +"ЗаписатьСтроку": "WriteString", +"ОтправкаВКанал": "SendingToChannel", +"МассивОбъектов": "ArrayOfObjects", +"СоздатьИсторию": "CreateStory", +"ПолучитьСостав": "GetComposition", +"ОписаниеОшибки": "ErrorDescription", +"Поставить лайк": "Like", +"ПрочитанноБайт": "BytesRead", +"РаботаСКнигами": "BookWork", +"РаботаСЛистами": "SheetWork", +"МассивВложений": "AttachmentsArray", +"МассивЗапросов": "ArrayOfRequests", +"ТекущеВложение": "CurrentAttachment", +"СтрокаВложений": "AttachmentsString", +"СоздатьКаталог": "CreateDirectory", +"Получить книгу": "GetBook", +"Описание видео": "Video description", +"Удалить альбом": "Delete album", +"КонецПроцедуры": "EndProcedure", +"Номер телефона": "Phone number", +"HTTPСоединение": "HTTPConnection", +"Описание файла": "File description", +"ПараметрМетода": "MethodParameter", +"Твит с опросом": "Tweet with poll", +"МассивИДПостов": "Array of post IDs", +"Новый файл.jpg": "New file.jpg", +"ДвоичныеДанные": "BinaryData", +"УдалитьСобытие": "DeleteEvent", +"ТолькоПросмотр": "ViewOnly", +"Это новый файл": "This is a new file", +"ТекущаяКоманда": "CurrentCommand", +"ОписаниеМетода": "MethodDescription", +"Отбор по имени": "Filter by name", +"ЗаписанныйФайл": "RecordedFile", +"ОчиститьЯчейки": "ClearCells", +"JsonВСтруктуру": "JsonToStructure", +"РаботаСБлоками": "BlockWork", +"ЗапросыБезТела": "RequestsWithoutBody", +"ТекущаяОбласть": "CurrentRegion", +"ОписаниеСтроки1": "RowDescription1", +"НужнаРаспаковка": "NeedsUnpacking", "ПолучитьТаблицу": "GetTable", -"Копировать лист": "CopySheet", -"Получить запись": "Get record", -"Загрузить видео": "Upload video", "ЗапросИзменения": "ChangeRequest", -"Описание товара": "Product description", -"IDПользователей": "UserIDs", -"РаботаСЗаписями": "RecordManagement", -"ТекущееЗначение": "CurrentValue", -"ДобавитьКоманду": "AddCommand", -"ДвоичныеДанные2": "BinaryData2", -"СтруктураКнопки": "ButtonStructure", "Создать историю": "Create story", -"МестоПроведения": "Venue", -"ТекущаяДатаUNIX": "CurrentUNIXDate", -"ВводныйПараметр": "IntroductoryParameter", -"РаботаСКаналами": "ChannelManagement", -"ОписаниеТаблицы": "TableDescription", -"Telegram_Разбан": "Telegram_Unban", -"Проверка_СлакОк": "Check_SlackOk", -"ВК_СоздатьОпрос": "VK_CreatePoll", -"JSON клавиатуры": "Keyboard JSON", -"ПолучитьАккаунт": "GetAccount", -"МассивРодителей": "ArrayOfParents", -"Перенаправление": "Redirection", -"РаботаСЗаказами": "OrderManagement", -"ДвоичныеДанные1": "BinaryData1", -"ЗависимостиГугл": "GoogleDependencies", -"ПолучениеТокена": "TokenRetrieval", -"VK_СоздатьОпрос": "VK_CreatePoll", +"Очистить ячейки": "Clear cells", "СтрокаСигнатуры": "SignatureString", -"Текст сообщения": "Message text", +"Создать таблицу": "Create table", +"Картинка опроса": "Poll image", +"ТекущаяДатаUNIX": "CurrentUNIXDate", +"Проверка_СлакОк": "Check_SlackOk", +"ЗначениеСтрокой": "ValueAsString", +"OPI_Инструменты": "OPI_Tools", +"МестоПроведения": "Venue", +"УдалитьПодборку": "DeleteSelection", +"КоллекцияТаблиц": "TableCollection", +"Удалить событие": "Delete event", +"ЗагруженныйФайл": "UploadedFile", +"Новый заголовок": "New title", +"ТекстВыполнения": "ExecutionText", +"КодировкаТекста": "TextEncoding", "Вспомогательные": "Auxiliary", +"Копировать лист": "CopySheet", +"РаботаСЗаказами": "OrderManagement", +"СтатусСообщения": "MessageStatus", +"Перенаправление": "Redirection", +"Ключ приложения": "Application key", +"ТаблицаЗначений": "ValueTable", +"РаботаСЗаписями": "RecordManagement", +"Получить запись": "Get record", +"ТипСоответствие": "TypeMatch", "СтруктураФайлов": "FileStructure", +"Каждого,каждого": "Each,each", +"ОтправитьСсылку": "SendLink", +"Отправить гифку": "Send GIF", +"VK_СоздатьОпрос": "VK_CreatePoll", +"ВК_СоздатьОпрос": "VK_CreatePoll", +"МассивРодителей": "ArrayOfParents", +"СтруктураКнопки": "ButtonStructure", +"Отправить видео": "Send video", +"МобильныйКлиент": "MobileClient", +"Telegram_Разбан": "Telegram_Unban", +"перенаправления": "redirection", +"Отправить аудио": "Send audio", +"ДвоичныеДанные2": "BinaryData2", +"ТокенВЗаголовки": "TokenInHeaders", +"ДвоичныеДанные1": "BinaryData1", +"Удалить Webhook": "Delete webhook", +"IDПользователей": "UserIDs", +"установлен свой": "set your", +"ОписаниеТаблицы": "TableDescription", "МассивУдаляемых": "ArrayOfDeletions", -"СоздатьСтраницу": "CreatePage", +"ДобавитьКоманду": "AddCommand", +"ИзменитьТаблицу": "ModifyTable", +"Получить объект": "Get object", +"Массив картинок": "Array of images", +"JSON клавиатуры": "Keyboard JSON", +"ОписаниеКоманды": "CommandDescription", +"ЗаголовокПотока": "StreamHeader", +"ПолучениеТокена": "TokenRetrieval", +"Команда CLI: vk": "CLI Command: vk", +"ТекущееЗначение": "CurrentValue", +"ЗаписатьЦелое32": "WriteInt32", +"ЗаписатьЦелое16": "WriteInt16", +"Отправить опрос": "Send poll", +"ПовторитьСтроку": "RepeatString", +"Номер,Строковое": "Number,String", +"ПараметрыМетода": "MethodParameters", +"РаботаСКаналами": "ChannelManagement", +"СтатусОбработки": "ProcessingStatus", +"ОписаниеСобытия": "EventDescription", +"ОписаниеСтроки2": "RowDescription2", +"Описание товара": "Product description", "ПеременнаяСреды": "EnvironmentVariable", "Получить превью": "Get preview", -"ТекущееОписание": "CurrentDescription", -"ТипСоответствие": "TypeMatch", -"ID пользователя": "User ID", -"ТекстВыполнения": "ExecutionText", -"ПреобразоватьИД": "ConvertID", -"ЗавершитьРаботу": "FinishWork", -"МассивВариантов": "OptionArray", -"НужнаРаспаковка": "NeedsUnpacking", -"СтруктураТекста": "TextStructure", -"СтруктураДанных": "DataStructure", -"ТаблицаЗначений": "ValueTable", -"Отправить гифку": "Send GIF", -"Новый заголовок": "New title", -"Проверка_ВКПост": "Check_VKPost", -"установлен свой": "set your", -"Отправить видео": "Send video", -"ИзменитьТаблицу": "ModifyTable", -"Отправить аудио": "Send audio", -"Массив картинок": "Array of images", -"Удалить событие": "Delete event", -"ИзменитьСобытие": "EditEvent", -"Массив ID медиа": "Media ID array", "IDИнициализации": "InitializationID", -"СократитьСсылку": "ShortenLink", -"СтатусОбработки": "ProcessingStatus", -"Сокращенный URL": "Shortened URL", -"КодировкаТекста": "TextEncoding", -"Удалить Webhook": "Delete webhook", -"ID целевой базы": "Target database ID", -"Отправить опрос": "Send poll", -"Получить объект": "Get object", -"ПовторитьСтроку": "RepeatString", -"СтруктураВыбора": "ChoiceStructure", -"ЗаписатьЦелое16": "WriteInt16", -"ОбработатьОтвет": "ProcessResponse", -"Ключ приложения": "Application key", -"ОписаниеСтроки2": "RowDescription2", -"Номер,Строковое": "Number,String", -"ОдиночнаяЗапись": "SingleRecord", -"Картинка опроса": "Poll image", -"ОписаниеСтроки1": "RowDescription1", -"Очистить ячейки": "Clear cells", -"ОтправитьСсылку": "SendLink", -"ПараметрыМетода": "MethodParameters", -"РаботаСТоварами": "ProductManagement", +"ПреобразоватьИД": "ConvertID", +"Текст сообщения": "Message text", +"ПолучитьСобытие": "GetEvent", "ЗначениеВМассив": "ValueToArray", -"ОписаниеКоманды": "CommandDescription", +"УстановитьТекст": "SetText", +"ID пользователя": "User ID", +"СоздатьСтраницу": "CreatePage", +"Создать событие": "Create event", +"УдалитьКартинку": "DeleteImage", +"СтруктураВыбора": "ChoiceStructure", +"Массив ID медиа": "Media ID array", +"ИзменитьСобытие": "EditEvent", +"Загрузить видео": "Upload video", +"ТекущееОписание": "CurrentDescription", "Создать каталог": "Create folder", -"ЗначениеСтрокой": "ValueAsString", -"КоллекцияТаблиц": "TableCollection", -"УдалитьПодборку": "DeleteSelection", -"ДанныеИНастройка": "DataAndSettings", -"МассивКлавиатуры": "KeyboardArray", +"СтруктураДанных": "DataStructure", +"СтруктураТекста": "TextStructure", +"ОригиналныйПуть": "OriginalPath", +"СократитьСсылку": "ShortenLink", +"Сокращенный URL": "Shortened URL", +"ИскомыйПараметр": "DesiredParameter", +"ЗависимостиГугл": "GoogleDependencies", +"ЗавершитьРаботу": "FinishWork", +"ID целевой базы": "Target database ID", +"РаботаСТоварами": "ProductManagement", +"МассивВариантов": "OptionArray", +"ПолучитьАккаунт": "GetAccount", +"ФайлРепозитория": "RepositoryFile", +"ЗначенияСвойств": "PropertyValues", +"ОдиночнаяЗапись": "SingleRecord", +"ОбработатьОтвет": "ProcessResponse", +"Проверка_ВКПост": "Check_VKPost", +"ВводныйПараметр": "IntroductoryParameter", +"ПолучитьФайлПути": "GetFilePath", "СоздатьКалендарь": "CreateCalendar", -"ЗапросыMultipart": "MultipartRequests", -"ОбработатьОбъект": "ProcessObject", -"ГВ_ОбновитьТокен": "GV_UpdateToken", -"ГВ_ПолучитьТокен": "GV_GetToken", -"ЗаписатьПараметр": "WriteParameter", -"СоставБиблиотеки": "LibraryComposition", -"ID целевого чата": "Target chat ID", -"РаботаССобытиями": "EventManagement", -"ОсвободитьОбъект": "ReleaseObject", -"МаксимумВЗапросе": "MaxInRequest", -"Получить таблицу": "Get table", -"МассивКалендарей": "ArrayOfCalendars", -"Описание альбома": "Album description", -"ЗапятаяВКавычках": "CommaInQuotes", -"СтрокаФотографий": "PhotoString", -"Тестовый товар 2": "TestProduct2", -"Коллекция файлов": "File collection", -"Фамилия контакта": "Contact last name", -"РаспаковатьОтвет": "UnpackResponse", -"УдалитьКалендарь": "DeleteCalendar", -"ПривестиЗначение": "ConvertValue", +"Расширение файла": "File extension", +"ОтправитьКонтакт": "SendContact", +"ЗначениеОсновной": "MainValue", +"ОписаниеКартинки": "ImageDescription", "КоличествоЧастей": "NumberOfParts", "Телефон контакта": "Contact phone number", -"ПрочитатьЦелое32": "ReadInt32", -"МБ был записан в": "MB was recorded in", -"VK_УдалитьАльбом": "VK_DeleteAlbum", -"ОтправитьКонтакт": "SendContact", -"OPI_Криптография": "OPI_Cryptography", -"ПолучитьПараметр": "GetParameter", -"Тестовая таблица": "TestTable", -"превью документа": "document preview", -"СледующаяПозиция": "NextPosition", -"СсылкаПодЗаписью": "LinkUnderPost", -"Отправить ссылку": "SendLink", -"ВызватьHTTPМетод": "CallHTTPMethod", -"СтруктураФормата": "FormatStructure", -"ОбъектПроцессора": "ProcessorObject", -"ДоступныйОстаток": "AvailableBalance", -"KeyИнициализации": "InitializationKey", -"Неактивный : red": "Inactive : red", -"СоответствиеMIME": "MIMETypeMapping", -"СтрокаПараметров": "ParameterString", -"УстановитьСтроку": "SetString", -"МассивСтатистики": "Array of Statistics", -"Канал для отбора": "Channel for selection", -"ОписаниеКартинки": "ImageDescription", -"ПараметрыФункции": "FunctionParameters", -"Массив ID постов": "Array of post IDs", -"ЗначениеОсновной": "MainValue", -"СоздатьТвитОпрос": "CreatePollTweet", -"Расширение файла": "File extension", -"Изменить событие": "Edit event", -"Изменить таблицу": "Modify table", -"СоздатьТвитВидео": "CreateVideoTweet", -"РазделительСтрок": "LineSeparator", -"СоздатьТвитГифки": "CreateGifTweet", -"ЮнитТестирование": "UnitTesting", -"ЗапускаемыеТесты": "RunnableTests", -"СтруктураСтатуса": "StatusStructure", +"Фамилия контакта": "Contact last name", "Сократить ссылку": "Shorten link", -"ПолучитьПолеДаты": "GetDateField", -"ПолучитьСтраницу": "GetPage", +"ДобавитьПараметр": "AddParameter", +"ПолучитьДвоичные": "GetBinary", +"ДобавитьИмяЛиста": "AddSheetName", +"Тестовый товар 2": "TestProduct2", +"HTTPСервисЗапрос": "HTTPServiceRequest", "ПутьКФайлуДанных": "DataFilePath", -"Твит с картинкой": "Tweet with image", -"ЭлементКоллекции": "CollectionItem", +"СоответствиеMIME": "MIMETypeMapping", +"ЗаписатьФайлЛога": "WriteLogFile", +"УправлениеФайлом": "FileManagement", "URLВКодировкеURL": "URLInURLEncoding", -"КонецКодовУспеха": "EndOfSuccessCodes", -"МассивИнформации": "ArrayOfInformation", -"НеобходимоЧастей": "PartsRequired", +"СтруктураСтатуса": "StatusStructure", +"KeyИнициализации": "InitializationKey", +"СекретПриложения": "AppSecret", +"ВладелецКартинки": "ImageOwner", +"ПараметрыЗапроса": "RequestParameters", +"СмещениеОтНачала": "OffsetFromStart", +"СсылкаПодЗаписью": "LinkUnderPost", +"ЗаписатьПараметр": "WriteParameter", +"ГВ_ПолучитьТокен": "GV_GetToken", +"Неактивный : red": "Inactive : red", "КодироватьСтроку": "EncodeString", +"СтруктураФормата": "FormatStructure", +"КонецКодовУспеха": "EndOfSuccessCodes", +"Твит с картинкой": "Tweet with image", +"Получить таблицу": "Get table", +"Code из браузера": "Code from browser", +"СоздатьТвитГифки": "CreateGifTweet", +"МассивСтатистики": "Array of Statistics", +"СтрокаПараметров": "ParameterString", +"СоздатьТвитВидео": "CreateVideoTweet", +"РаспаковатьОтвет": "UnpackResponse", +"УдалитьКалендарь": "DeleteCalendar", +"МетодХэширования": "HashingMethod", +"VK_СоздатьАльбом": "VK_CreateAlbum", +"ЗапускаемыеТесты": "RunnableTests", +"VK_УдалитьАльбом": "VK_DeleteAlbum", +"ЮнитТестирование": "UnitTesting", +"СоздатьТвитОпрос": "CreatePollTweet", +"Коллекция файлов": "File collection", +"Изменить событие": "Edit event", +"Отправить ссылку": "SendLink", +"НеобходимаяДлина": "RequiredLength", +"МассивКалендарей": "ArrayOfCalendars", +"ВызватьHTTPМетод": "CallHTTPMethod", +"ЗапросыMultipart": "MultipartRequests", +"ОтправитьЛокацию": "SendLocation", +"МассивРазрешений": "Permissions array", +"ОбъектПроцессора": "ProcessorObject", +"OPI_Криптография": "OPI_Cryptography", +"ДоступныйОстаток": "AvailableBalance", +"ПолучитьПараметр": "GetParameter", +"СоставБиблиотеки": "LibraryComposition", +"ПолучитьПолеДаты": "GetDateField", +"ГВ_ОбновитьТокен": "GV_UpdateToken", +"Массив ID постов": "Array of post IDs", +"Описание события": "Event description", +"превью документа": "document preview", +"МассивПараметров": "ParameterArray", +"Описание таблицы": "Table description", +"РаботаССобытиями": "EventManagement", +"МБ был записан в": "MB was recorded in", +"ДанныеИНастройка": "DataAndSettings", +"СледующаяПозиция": "NextPosition", +"КопироватьОбъект": "CopyObject", +"Удалить картинку": "Delete image", +"Создать страницу": "Create page", +"ПолучитьСтраницу": "GetPage", +"Канал для отбора": "Channel for selection", +"Массив Из Строка": "Array Of String", +"ЭлементКоллекции": "CollectionItem", +"Удалить подборку": "DeleteSelection", +"РаботаСТаблицами": "TableManagement", +"ИмяФайлаОтправки": "SendingFileName", +"ПереносСтрокJSON": "JSONLineBreak", +"УстановитьСтроку": "SetString", +"ИсходноеЗначение": "InitialValue", +"РаботаСДиалогами": "DialogManagement", +"ЗапятаяВКавычках": "CommaInQuotes", +"Получить событие": "Get event", +"ПараметрыФункции": "FunctionParameters", +"Описание альбома": "Album description", +"ПривестиЗначение": "ConvertValue", +"РазделительСтрок": "LineSeparator", +"ЭтоПереадресация": "ThisIsRedirection", +"Вступить в канал": "Join channel", +"Тестовая таблица": "TestTable", +"УдалитьСообщение": "DeleteMessage", +"МассивКлавиатуры": "KeyboardArray", +"Изменить таблицу": "Modify table", +"ЗагрузкаКартинки": "ImageUpload", +"УдалитьПолностью": "Delete completely", +"ВыгрузитьКолонку": "UnloadColumn", +"НеобходимоЧастей": "PartsRequired", +"МассивИнформации": "ArrayOfInformation", +"ID целевого чата": "Target chat ID", +"ОсвободитьОбъект": "ReleaseObject", +"СтрокаФотографий": "PhotoString", "МассивИменЛистов": "ArrayOfSheetNames", "Массив из Строка": "Array of Strings", -"ИмяФайлаОтправки": "SendingFileName", -"МетодХэширования": "HashingMethod", -"УправлениеФайлом": "FileManagement", +"ОбработатьОбъект": "ProcessObject", +"ПрочитатьЦелое32": "ReadInt32", "Загружаемый файл": "File to be uploaded", -"КопироватьОбъект": "CopyObject", -"ВладелецКартинки": "ImageOwner", -"НеобходимаяДлина": "RequiredLength", -"ДобавитьПараметр": "AddParameter", -"ДобавитьИмяЛиста": "AddSheetName", -"ЗагрузкаКартинки": "ImageUpload", -"Code из браузера": "Code from browser", -"МассивРазрешений": "Permissions array", -"ПереносСтрокJSON": "JSONLineBreak", -"Создать страницу": "Create page", -"СекретПриложения": "AppSecret", -"СмещениеОтНачала": "OffsetFromStart", -"Удалить подборку": "DeleteSelection", -"Описание таблицы": "Table description", -"ПолучитьДвоичные": "GetBinary", -"Вступить в канал": "Join channel", -"ЭтоПереадресация": "ThisIsRedirection", -"ПараметрыЗапроса": "RequestParameters", -"ИсходноеЗначение": "InitialValue", -"РаботаСТаблицами": "TableManagement", -"ОтправитьЛокацию": "SendLocation", -"Описание события": "Event description", -"ВыгрузитьКолонку": "UnloadColumn", -"МассивПараметров": "ParameterArray", -"Массив Из Строка": "Array Of String", -"VK_СоздатьАльбом": "VK_CreateAlbum", -"РаботаСДиалогами": "DialogManagement", -"HTTPСервисЗапрос": "HTTPServiceRequest", -"ПолучитьФайлПути": "GetFilePath", -"ЗаписатьФайлЛога": "WriteLogFile", -"УдалитьСообщение": "DeleteMessage", -"Получить событие": "Get event", -"Удалить картинку": "Delete image", -"УдалитьПолностью": "Delete completely", -"СтруктураЗначений": "ValueStructure", -"ГД_СоздатьКаталог": "GD_CreateCatalog", -"Наш первый клиент": "OurFirstClient", -"УстановитьКоманду": "SetCommand", -"НаправлениеПоиска": "SearchDirection", -"Наименование поля": "Field name", -"АрхивироватьКанал": "ArchiveChannel", -"ОтправкаСообщений": "MessageSending", -"Отправить контакт": "Send contact", -"ПолучитьПолеПочты": "GetEmailField", -"Путь или ID файла": "Path or ID of the file", -"Картинка автотест": "AutoTestImage", -"Данные для API v2": "Data for API v2", -"МассивРезультатов": "ResultArray", -"Значение свойства": "Property value", -"Секрет приложения": "Application secret", -"СохранятьЛокально": "SaveLocally", -"Получить страницу": "Get page", -"Проверка_ВайберОк": "Check_ViberOk", -"VK_СоздатьИсторию": "VK_CreateStory", -"СоздатьТемуФорума": "CreateForumThread", -"ХешированиеДанных": "DataHashing", -"ВК_ЗагрузитьВидео": "VK_UploadVideo", -"ПолучитьКоллекцию": "GetCollection", -"Массив ID товаров": "Array of product IDs", -"ПереместитьОбъект": "MoveObject", -"СтруктураВозврата": "ReturnStructure", -"Файл для загрузки": "File for upload", -"Копировать объект": "Copy object", -"Тестовая подборка": "TestCollection", -"ВызватьИсключение": "RaiseException", -"СтандартныйСпособ": "StandardMethod", -"СкопироватьОбъект": "CopyObject", -"Новое имя объекта": "New object name", -"Проверка_ВКИстина": "Check_VKTrue", -"СоответствиеФайла": "FileMapping", +"МаксимумВЗапросе": "MaxInRequest", +"При отправке URL": "When sending URL", "Библиотека: Viber": "Library: Viber", -"РезультатПроверки": "CheckResult", -"УправлениеТоваром": "ProductManagement", +"ПереместитьОбъект": "MoveObject", +"СортироватьПоДате": "SortByDate", +"ОткрытьТемуФорума": "OpenForumThread", +"ОтправкаСообщений": "MessageSending", +"Значение свойства": "Property value", +"УдалитьТемуФорума": "DeleteForumTopic", +"Название свойства": "Property name", +"Копировать объект": "Copy object", "Администрирование": "Administration", +"ОтправитьДокумент": "SendDocument", +"ЗакрытьТемуФорума": "CloseForumThread", +"Строка, Структура": "String, Structure", +"СоздатьСоединение": "CreateConnection", +"Текст комментария": "Comment text", +"ЭлементСтатистики": "StatisticsItem", +"КаталогИсходников": "SourceDirectory", +"ОпросСоответствие": "PollCorrespondence", +"Название подборки": "Selection name", +"Данные для API v2": "Data for API v2", +"ID целевого поста": "ID of the target post", +"СтандартныйСпособ": "StandardMethod", +"УстановитьКоманду": "SetCommand", +"Массив ID товаров": "Array of product IDs", +"НаписатьСообщение": "WriteMessage", +"Отправить контакт": "Send contact", +"СоздатьТемуФорума": "CreateForumThread", +"СоздатьОбсуждение": "CreateDiscussion", +"Описание картинки": "Image description", +"Путь или ID файла": "Path or ID of the file", +"ОтветСоответствие": "ResponseCorrespondence", +"ЗакрытьОбсуждение": "CloseDiscussion", +"УправлениеТоваром": "ProductManagement", +"Создать календарь": "Create calendar", +"СтруктураВарианта": "OptionStructure", +"ОткрытьОбсуждение": "OpenDiscussion", +"Секрет приложения": "Application secret", +"СтруктураКампании": "CampaignStructure", +"Отправить локацию": "SendLocation", +"ОпубликоватьПапку": "PublishFolder", +"Скрытый календарь": "Hidden calendar", +"ГД_СоздатьКаталог": "GD_CreateCatalog", +"ТекстовыйДокумент": "TextDocument", +"ГТ_СоздатьТаблицу": "GT_CreateTable", +"МассивРезультатов": "ResultArray", +"Наш первый клиент": "OurFirstClient", +"Библиотека: Slack": "Library: Slack", +"МаксимальнаяДлина": "MaximumLength", +"СтруктураРодителя": "ParentStructure", +"СоответствиеПолей": "FieldMapping", +"Новый комментарий": "NewComment", +"ВК_ЗагрузитьВидео": "VK_UploadVideo", +"ОбъектКомментарий": "CommentObject", +"ЗначениеПараметра": "ParameterValue", +"СтруктураВозврата": "ReturnStructure", +"СтруктураЗначений": "ValueStructure", +"АрхивироватьКанал": "ArchiveChannel", +"Получить страницу": "Get page", +"Картинка автотест": "AutoTestImage", +"Проверка_ВайберОк": "Check_ViberOk", +"ПолучитьСписокБаз": "GetListOfBases", +"ЗначениеЛокальный": "LocalValue", +"КалендарьИсточник": "SourceCalendar", +"Проверка_ГКОбъект": "Check_GKObject", +"ЗаполняемыеДанные": "FillableData", +"СохранятьЛокально": "SaveLocally", +"КалендарьПриемник": "TargetCalendar", +"Тестовое описание": "TestDescription", +"ПараметрЛокальный": "LocalParameter", +"МинимальныйРазмер": "MinimumSize", +"Дата : date": "Date : date", +"ПолучитьКоллекцию": "GetCollection", +"ПрочитатьJSONФайл": "ReadJSONFile", +"СоздатьБазуДанных": "CreateDatabase", +"Имя файла в Slack": "File name in Slack", +"ID блока родителя": "Parent block ID", +"ВызватьИсключение": "Raise", +"ПреобразоватьДату": "ConvertDate", +"ВыходнаяКоллекция": "OutputCollection", +"ОсновнаяСтруктура": "MainStructure", +"УстановитьWebhook": "SetWebhook", +"РезультатПроверки": "CheckResult", +"НеВосстанавливать": "DoNotRestore", +"СоответствиеФайла": "FileMapping", +"ХешированиеДанных": "DataHashing", +"ПоследняяФигурная": "LastCurly", +"VK_СоздатьИсторию": "VK_CreateStory", +"НачальнаяФигурная": "InitialCurly", +"ВК_СоздатьИсторию": "VK_CreateStory", +"УдалитьОбработчик": "RemoveHandler", +"Новое имя объекта": "New object name", +"СкопироватьОбъект": "CopyObject", +"ОтправитьКартинку": "SendImage", +"Удалить календарь": "Delete calendar", +"ВнешнееСоединение": "ExternalConnection", +"ТаблицаПараметров": "ParametersTable", "НачалоКодовОшибок": "StartOfErrorCodes", "КонецКодовПадений": "EndOfFailureCodes", -"НачалоКодовУспеха": "StartOfSuccessCodes", -"ПрочитатьJSONФайл": "ReadJSONFile", -"Скрытый календарь": "Hidden calendar", -"ВК_СоздатьИсторию": "VK_CreateStory", -"СообщитьРезультат": "ReportResult", -"Тестовая кампания": "TestCampaign", -"СортироватьПоДате": "SortByDate", -"ОсновноеИзмерение": "MajorDimension", -"ЗначениеЗаполнено": "ValueFilled", -"НеВосстанавливать": "DoNotRestore", -"ЗначениеПараметра": "ParameterValue", -"Описание картинки": "Image description", +"Файл для загрузки": "File for upload", "ЗагруженныеДанные": "UploadedData", -"ТекстовыйДокумент": "TextDocument", -"Имя файла в Slack": "File name in Slack", -"ВыходнаяКоллекция": "OutputCollection", -"Отправить локацию": "SendLocation", -"ПолучитьСписокБаз": "GetListOfBases", -"МаксимальнаяДлина": "MaximumLength", -"ПреобразоватьДату": "ConvertDate", -"Тестовое описание": "TestDescription", -"Название подборки": "Selection name", -"ID блока родителя": "Parent block ID", -"Проверка_ГКОбъект": "Check_GKObject", -"СтруктураВарианта": "OptionStructure", -"ОткрытьТемуФорума": "OpenForumThread", -"УдалитьТемуФорума": "DeleteForumTopic", -"Пост из автотеста": "Post from autotest", -"Строка, Структура": "String, Structure", -"При отправке URL": "When sending URL", -"ЗначениеЛокальный": "LocalValue", -"ОткрытьОбсуждение": "OpenDiscussion", -"СтруктураРодителя": "ParentStructure", -"ID целевого поста": "ID of the target post", -"МинимальныйРазмер": "MinimumSize", -"УстановитьWebhook": "SetWebhook", -"Удалить календарь": "Delete calendar", -"Название свойства": "Property name", -"НаписатьСообщение": "WriteMessage", -"КалендарьПриемник": "TargetCalendar", -"ГТ_СоздатьТаблицу": "GT_CreateTable", -"ТаблицаПараметров": "ParametersTable", -"ЗаполняемыеДанные": "FillableData", -"ОсновнаяСтруктура": "MainStructure", -"СоответствиеПолей": "FieldMapping", -"Проверка_ВКАльбом": "Check_VKAlbum", -"ПараметрЛокальный": "LocalParameter", -"ОтправитьДокумент": "SendDocument", -"КаталогИсходников": "SourceDirectory", +"Проверка_ВКИстина": "Check_VKTrue", +"Наименование поля": "Field name", +"ОсновноеИзмерение": "MajorDimension", +"Тестовая подборка": "TestCollection", "АТ_СоздатьТаблицу": "AT_CreateTable", -"ПоследняяФигурная": "LastCurly", -"СоздатьБазуДанных": "CreateDatabase", -"СтруктураКампании": "CampaignStructure", -"Создать календарь": "Create calendar", -"НачальнаяФигурная": "InitialCurly", -"ОтветСоответствие": "ResponseCorrespondence", -"Удалить сообщение": "Delete message", -"ОпубликоватьПапку": "PublishFolder", +"СообщитьРезультат": "ReportResult", +"ЗначениеЗаполнено": "ValueFilled", +"НачалоКодовУспеха": "StartOfSuccessCodes", +"Тестовая кампания": "TestCampaign", +"НаправлениеПоиска": "SearchDirection", +"Проверка_ВКАльбом": "Check_VKAlbum", "ИзменитьСообщение": "EditMessage", -"Дата : date": "Date : date", -"СоздатьСоединение": "CreateConnection", -"ЗакрытьТемуФорума": "CloseForumThread", -"Новый комментарий": "NewComment", -"КалендарьИсточник": "SourceCalendar", -"СоздатьОбсуждение": "CreateDiscussion", -"ЭлементСтатистики": "StatisticsItem", -"ОпросСоответствие": "PollCorrespondence", -"ЗакрытьОбсуждение": "CloseDiscussion", -"ОтправитьКартинку": "SendImage", -"Библиотека: Slack": "Library: Slack", -"ОбъектКомментарий": "CommentObject", -"Текст комментария": "Comment text", -"ОпубликоватьОбъект": "PublishObject", -"ЗагрузитьМалыйФайл": "UploadSmallFile", -"Создать твит гифки": "Create gif tweet", -"ПараметрВКоллекцию": "ParameterToCollection", -"Команда CLI: viber": "CLI Command: viber", -"ЧЦ=10; ЧДЦ=0; ЧГ=0": "HC=10; HDC=0; HG=0", -"Создать твит опрос": "Create poll tweet", -"ПроцессорГенерации": "GenerationProcessor", -"ЗагрузитьФайлПоURL": "UploadFileByURL", -"ОтветИнициализации": "InitializationResponse", -"РазмерПрефиксаGZip": "GZipPrefixSize", -"МассивКлючЗначение": "KeyValueArray", -"ИзменитьТемуФорума": "EditForumTopic", -"ОсновнойОбработчик": "MainHandler", -"Создать твит видео": "Create video tweet", -"Опубликовать папку": "Publish folder", -"Переместить объект": "Move object", -"Телеграм_БанРазбан": "Telegram_BanUnban", -"ПереданныйПараметр": "PassedParameter", -"ДанныеПользователя": "UserData", -"URL источник файла": "URL source of the file", -"ОткрепитьСообщение": "UnpinMessage", -"ДлительностьОпроса": "PollDuration", -"ЗагрузитьМедиафайл": "UploadMediaFile", -"VK_УдалитьКартинку": "VK_DeleteImage", -"Тестовый заголовок": "TestTitle", -"Открыть обсуждение": "Open discussion", -"Имя : title": "Name : title", -"СоздатьКомментарий": "CreateComment", -"ДвоичныеВКоллекцию": "BinaryToCollection", -"Архивировать канал": "Archive channel", -"УправлениеДиалогом": "DialogManagement", -"Наименование видео": "Video name", -"ПолучитьПолеСсылки": "GetLinkField", -"СоответствиеИконки": "Icon match", -"ПолучитьПолеФлажка": "GetCheckboxField", -"ПереименоватьКанал": "RenameChannel", -"Создать обсуждение": "Create discussion", -"Заголовок страницы": "Page title", -"ИдентификаторФайла": "FileID", -"РаботаСоСтраницами": "PageManagement", -"Библиотека: Notion": "Library: Notion", -"'Желтый','Зеленый'": "'Yellow','Green'", -"Токен пользователя": "User token", -"ПреобразоватьТекст": "ConvertText", -"ГТ_ПолучитьТаблицу": "GT_GetTable", -"ТекущаяВложенность": "CurrentNesting", -"Работа с доступами": "Access management", -"УдалитьВнешнийФайл": "DeleteExternalFile", -"НачальнаяТабуляция": "InitialTab", -"ФормированиеБлоков": "BlockFormation", -"Активный : green": "Active : green", -"Тестовая таблица 2": "TestTable2", -"ПреобразоватьЧисло": "ConvertNumber", -"Dropbox_УдалитьТег": "Dropbox_DeleteTag", -"ПереместитьСобытие": "MoveEvent", -"Написать сообщение": "Write a message", -"Новое наименование": "New name", -"ПреобразоватьСвязь": "ConvertLink", +"Удалить сообщение": "Delete message", +"Пост из автотеста": "Post from autotest", +"ПолучитьПолеПочты": "GetEmailField", +"Команда CLI: tools": "CLI Command: tools", "СтруктураВариантов": "VariantStructure", +"ДлительностьОпроса": "PollDuration", +"ПереместитьСобытие": "MoveEvent", +"ДанныеПользователя": "UserData", +"ЗагрузитьМалыйФайл": "UploadSmallFile", +"СуществующаяГруппа": "ExistingGroup", +"ПреобразоватьЧисло": "ConvertNumber", +"ПолучитьТоварыПоИД": "GetProductsByID", +"ПреобразоватьСвязь": "ConvertLink", "ПреобразоватьФайлы": "ConvertFiles", "ПреобразоватьПочту": "ConvertEmail", -"ПолеИдентификатора": "IdentifierField", -"СоответствиеТаблиц": "TableMapping", -"СоответствиеФайлов": "FileMapping", -"URL для сокращения": "URL for shortening", -"Удаляет блок по ID": "Deletes block by ID", -"РаботаССообщениями": "MessageManagement", -"ПолучитьСтатистику": "GetStatistics", "УправлениеСобытием": "EventManagement", -"ОтправитьСообщение": "SendMessage", -"Закрыть обсуждение": "Close discussion", -"Изменить сообщение": "Edit message", -"Проверка_ВКИстория": "Check_VKStory", -"ПолучитьБазуДанных": "GetDatabase", +"СоответствиеФайлов": "FileMapping", "Команда CLI: slack": "CLI command: slack", -"РежимОткрытияФайла": "FileOpenMode", -"ДополнительныйЦвет": "SecondaryColor", -"Изменить календарь": "Edit calendar", -"Удаляет пост по id": "Deletes a post by ID", -"СуществующаяГруппа": "ExistingGroup", -"Идентификатор поля": "Field identifier", -"Идентификатор базы": "Base identifier", -"Анонимность опроса": "Poll anonymity", -"Тестовый календарь": "TestCalendar", -"ПолучитьТоварыПоИД": "GetProductsByID", -"ЯДиск_СоздатьПапку": "YDisk_CreateFolder", -"Получить календарь": "Get calendar", -"СтандартнаяЕдиница": "StandardUnit", -"УдалитьКомментарий": "DeleteComment", -"ЗначенияПараметров": "ParameterValues", -"ПолучитьИДКартинки": "GetImageID", -"Отправить картинку": "Send image", -"Тестовое сообщение": "TestMessage", -"ID книги источника": "SourceBookID", -"Отправить документ": "Send document", +"'Желтый','Зеленый'": "'Yellow','Green'", +"РаботаССообщениями": "MessageManagement", +"ОтправитьСообщение": "SendMessage", "ДополнительныеФото": "AdditionalPhotos", +"Проверка_ВКИстория": "Check_VKStory", +"Изменить сообщение": "Edit message", +"ПреобразоватьТекст": "ConvertText", +"Телеграм_БанРазбан": "Telegram_BanUnban", +"ДвоичныеВКоллекцию": "BinaryToCollection", +"URL источник файла": "URL source of the file", +"Заголовок страницы": "Page title", +"РаботаСоСтраницами": "PageManagement", +"Опубликовать папку": "Publish folder", +"Библиотека: Notion": "Library: Notion", +"Переместить объект": "Move object", +"ПереданныйПараметр": "PassedParameter", +"МассивКлючЗначение": "KeyValueArray", +"ЧЦ=10; ЧДЦ=0; ЧГ=0": "HC=10; HDC=0; HG=0", +"Наименование видео": "Video name", +"Команда CLI: viber": "CLI Command: viber", "ID книги приемника": "DestinationBookID", -"СкоприроватьОбъект": "CopyObject", -"ЛимитПользователей": "UserLimit", -"СтруктураПараметра": "ParameterStructure", -"ПереслатьСообщение": "ForwardMessage", -"ПолучитьПолеНомера": "GetNumberField", -"Установить Webhook": "Set Webhook", -"ПолучитьОбновления": "GetUpdates", -"Команда CLI: tools": "CLI Command: tools", -"ИнформацияОбОшибке": "ErrorInformation", +"ID книги источника": "SourceBookID", +"РазмерПрефиксаGZip": "GZipPrefixSize", +"Удаляет пост по id": "Deletes a post by ID", +"ЗначенияПараметров": "ParameterValues", "РазмерСжатыхДанных": "CompressedDataSize", +"ДобавитьОбработчик": "AddHandler", +"ОсновнойОбработчик": "MainHandler", +"ИнформацияОбОшибке": "ErrorInformation", +"СтандартнаяЕдиница": "StandardUnit", "СтрЗаканчиваетсяНа": "StrEndsWith", +"Создать обсуждение": "Create discussion", +"ЗагрузитьФайлПоURL": "UploadFileByURL", +"ПолеИдентификатора": "IdentifierField", +"Создать твит гифки": "Create gif tweet", +"Удаляет блок по ID": "Deletes block by ID", +"Создать твит видео": "Create video tweet", +"ПолучитьСтатистику": "GetStatistics", +"Создать твит опрос": "Create poll tweet", +"Работа с доступами": "Access management", +"URL для сокращения": "URL for shortening", +"ПолучитьБазуДанных": "GetDatabase", +"ЗагрузитьМедиафайл": "UploadMediaFile", +"Написать сообщение": "Write a message", +"Активный : green": "Active : green", +"ОтветИнициализации": "InitializationResponse", +"Имя : title": "Name : title", +"Открыть обсуждение": "Open discussion", +"СоответствиеИконки": "Icon match", +"Закрыть обсуждение": "Close discussion", +"РежимОткрытияФайла": "FileOpenMode", +"НачальнаяТабуляция": "InitialTab", +"Dropbox_УдалитьТег": "Dropbox_DeleteTag", +"ТекущаяВложенность": "CurrentNesting", +"ИзменитьТемуФорума": "EditForumTopic", +"Получить календарь": "Get calendar", +"Установить Webhook": "Set Webhook", +"Тестовый заголовок": "TestTitle", +"ПолучитьОбновления": "GetUpdates", +"ПолучитьПолеНомера": "GetNumberField", +"ПереименоватьКанал": "RenameChannel", +"СтруктураПараметра": "ParameterStructure", +"ГТ_ПолучитьТаблицу": "GT_GetTable", +"ИдентификаторФайла": "FileID", +"ПолучитьИДКартинки": "GetImageID", +"Анонимность опроса": "Poll anonymity", +"Идентификатор поля": "Field identifier", +"Токен пользователя": "User token", +"ОткрепитьСообщение": "UnpinMessage", +"ЯДиск_СоздатьПапку": "YDisk_CreateFolder", +"ОпубликоватьОбъект": "PublishObject", +"ПереслатьСообщение": "ForwardMessage", "ЗакрепитьСообщение": "PinMessage", -"Дата начала периода": "Start date of the period", -"ИзменитьКомментарий": "EditComment", -"Путь внутри объекта": "Path inside the object", +"УдалитьКомментарий": "DeleteComment", +"СкоприроватьОбъект": "CopyObject", +"Тестовое сообщение": "TestMessage", +"Новое наименование": "New name", +"ДополнительныйЦвет": "SecondaryColor", +"ФормированиеБлоков": "BlockFormation", +"ЛимитПользователей": "UserLimit", +"УдалитьВнешнийФайл": "DeleteExternalFile", +"СоздатьКомментарий": "CreateComment", +"ПолучитьПолеФлажка": "GetCheckboxField", +"Идентификатор базы": "Base identifier", +"Тестовый календарь": "TestCalendar", +"ПроцессорГенерации": "GenerationProcessor", +"Архивировать канал": "Archive channel", +"Отправить картинку": "Send image", +"СоответствиеТаблиц": "TableMapping", +"ПараметрВКоллекцию": "ParameterToCollection", +"Тестовая таблица 2": "TestTable2", +"ПолучитьПолеСсылки": "GetLinkField", +"Изменить календарь": "Edit calendar", +"VK_УдалитьКартинку": "VK_DeleteImage", +"Отправить документ": "Send document", +"УправлениеДиалогом": "DialogManagement", +"СтруктураПараметров": "ParametersStructure", +"РаботаСОбсуждениями": "DiscussionManagement", +"ПолучитьКомментарии": "GetComments", +"Отправляемая ссылка": "SentLink", +"АльтернативныйТекст": "AlternateText", "Опубликовать объект": "Publish object", -"СписокПользователей": "UserList", -"УправлениеПодборкой": "SelectionManagement", -"Команда CLI: yandex": "CLI Command: yandex", -"СгруппироватьТовары": "GroupProducts", -"НаписатьКомментарий": "WriteComment", -"Новое описание базы": "New database description", -"ИсполняемыеСценарии": "ExecutableScripts", -"Длительность опроса": "Poll duration", -"Удалить комментарий": "Delete comment", -"Получить статистику": "Get statistics", -"Данные для API v1.1": "Data for API v1.1", -"АккаунтИАвторизация": "AccountAndAuthorization", -"Архив : yellow": "Archive : yellow", -"Создать\/Удалить тег": "Create\/Delete tag", -"ПолучитьОбщийМодуль": "GetCommonModule", -"Команда CLI: google": "CLI command: google", -"Команда CLI: gdrive": "CLI Command: gdrive", -"ПолучитьТокенПоКоду": "GetTokenByCode", "Отбор по типу файла": "Filter by file type", -"ПараметрыЗаписиJSON": "JSONWriteParameters", -"Команда CLI: notion": "CLI command: notion", -"ОбработатьВыводJSON": "ProcessJSONOutput", -"СоздатьКопиюОбъекта": "CreateObjectCopy", -"Получает файл по ID": "Gets file by ID", +"ПутьЛоговБиблиотеки": "LibraryLogPath", +"ЗаменитьСпецСимволы": "ReplaceSpecialCharacters", "СоответствиеОбложки": "Cover match", -"Идентификатор книги": "BookIdentifier", -"Идентификатор файла": "File identifier", "РаботаСБазамиДанных": "DatabaseManagement", +"НаписатьВОбсуждение": "WriteInDiscussion", "Создать базу данных": "Create database", +"Ставит лайк на пост": "Likes a post", "Создает базу данных": "Creates a database", "Структура Из Строка": "Structure Of String", -"Создает новую книгу": "Creates a new book", -"Альбом из автотеста": "AlbumFromAutoTest", -"Количество : number": "Quantity : number", -"Библиотека: Dropbox": "Library: Dropbox", -"Скоприровать объект": "Copy object", +"СоздатьКопиюОбъекта": "CreateObjectCopy", +"СтруктураКлавиатуры": "KeyboardStructure", +"Создать комментарий": "Create comment", +"Данные для API v1.1": "Data for API v1.1", "ПолучитьКомментарий": "GetComment", -"ПреобразованиеТипов": "TypeConversion", -"ЗаменитьСпецсимволы": "ReplaceSpecialCharacters", -"ПреобразоватьСтатус": "ConvertStatus", -"Структура из Строка": "Structure Of String", -"ПолучитьКомментарии": "GetComments", -"ПолучитьТекущуюДату": "GetCurrentDate", -"ПолучитьДанныеФайла": "GetFileData", -"Библиотека: Twitter": "Library: Twitter", -"ПутьЛоговБиблиотеки": "LibraryLogPath", -"Массив файлов видео": "Video files array", -"Переслать сообщение": "Forward message", -"ПолучитьВнешнийФайл": "GetExternalFile", -"ДобавитьВнешнийФайл": "AddExternalFile", -"ВК_МетодыОбсуждений": "VK_DiscussionMethods", -"ПолучитьПараметрыВК": "GetVKParameters", -"АльтернативныйТекст": "AlternateText", -"Переименовать канал": "Rename channel", -"Получить список баз": "Get list of bases", -"СтруктураПараметров": "ParametersStructure", -"СтруктураЗаголовков": "HeadersStructure", -"СформироватьКоманду": "FormCommand", -"ОбработатьДанныеTMA": "ProcessTMAData", "РаскодироватьСтроку": "DecodeString", -"СоответствиеСобытия": "EventMatch", -"РабочееПространство": "Workspace", -"МассивПользователей": "ArrayOfUsers", -"Закрыть тему форума": "Close forum thread", -"ПолучитьТаблицыБазы": "GetDatabaseTables", -"Удаляет тему форума": "Deletes a forum thread", -"Удалить тему форума": "Delete forum thread", -"Открыть тему форума": "Open forum thread", -"Получить обновления": "Get updates", -"СоответствиеСвойств": "PropertyMatch", -"НеобходимыйПараметр": "RequiredParameter", -"Отправить сообщение": "Send message", -"Массив файлов гифок": "Gif files array", +"ОбработатьВыводJSON": "ProcessJSONOutput", +"ОбработатьДанныеTMA": "ProcessTMAData", +"РазмерПостфиксаGZip": "GZipPostfixSize", "ПолучитьСписокТегов": "GetTagList", -"Dropbox_ДобавитьТег": "Dropbox_AddTag", -"СоздатьТвитКартинки": "Create image tweet", -"Закрепить сообщение": "Pin message", +"Измененная подборка": "EditedCollection", +"Идентификатор книги": "BookIdentifier", +"Создает новую книгу": "Creates a new book", +"ЗаменитьСпецсимволы": "ReplaceSpecialCharacters", +"СоответствиеСвойств": "PropertyMatch", +"Получить обновления": "Get updates", +"ИсполняемыеСценарии": "ExecutableScripts", +"ПолучитьПараметрыВК": "GetVKParameters", +"ВК_МетодыОбсуждений": "VK_DiscussionMethods", +"БуферДвоичныхДанных": "BinaryDataBuffer", +"Получает файл по ID": "Gets file by ID", +"Команда CLI: google": "CLI command: google", +"НеобходимыйПараметр": "RequiredParameter", +"Идентификатор файла": "File identifier", +"СформироватьКоманду": "FormCommand", +"ПолучитьТокенПоКоду": "GetTokenByCode", +"Переслать сообщение": "Forward message", +"Команда CLI: notion": "CLI command: notion", +"Команда CLI: yandex": "CLI Command: yandex", +"Путь внутри объекта": "Path inside the object", +"СтруктураЗаголовков": "HeadersStructure", +"Скоприровать объект": "Copy object", +"ПереданныеПараметры": "PassedParameters", +"Команда CLI: gdrive": "CLI Command: gdrive", +"Количество : number": "Quantity : number", +"Создать тему форума": "Create forum thread", +"СоответствиеМетодов": "MethodCorrespondence", +"АккаунтИАвторизация": "AccountAndAuthorization", +"МассивПользователей": "ArrayOfUsers", +"Библиотека: Twitter": "Library: Twitter", +"Массив из Структура": "Array of Structure", +"ПолучитьДанныеФайла": "GetFileData", +"Массив Из Структура": "Array of Structures", +"ПолучитьТекущуюДату": "GetCurrentDate", +"Переместить событие": "Move event", +"ПреобразованиеТипов": "TypeConversion", +"Переименовать канал": "Rename channel", +"ПараметрыЗаписиJSON": "JSONWriteParameters", +"Закрыть тему форума": "Close forum thread", +"ПреобразоватьСтатус": "ConvertStatus", +"Архив : yellow": "Archive : yellow", +"РабочееПространство": "Workspace", +"ПолучитьТаблицыБазы": "GetDatabaseTables", +"Отправить сообщение": "Send message", "ПреобразоватьБулево": "ConvertBoolean", "ПреобразоватьСсылку": "ConvertLink", +"Открыть тему форума": "Open forum thread", +"Удалить тему форума": "Delete forum thread", +"Альбом из автотеста": "AlbumFromAutoTest", +"Удаляет тему форума": "Deletes a forum thread", +"УправлениеПодборкой": "SelectionManagement", +"Структура из Строка": "Structure Of String", +"СгруппироватьТовары": "GroupProducts", +"Библиотека: Dropbox": "Library: Dropbox", "РаботаСТемамиФорума": "ForumTopicManagement", -"Массив Из Структура": "Array of Structures", -"Ставит лайк на пост": "Likes a post", -"Dropbox_СкачатьФайл": "Dropbox_DownloadFile", -"НаписатьВОбсуждение": "WriteInDiscussion", -"Открепить сообщение": "Unpin message", -"Переместить событие": "Move event", -"ПереданныеПараметры": "PassedParameters", -"ЗаменитьСпецСимволы": "ReplaceSpecialCharacters", -"РаботаСОбсуждениями": "DiscussionManagement", -"РазмерПостфиксаGZip": "GZipPostfixSize", +"Получить список баз": "Get list of bases", +"СоответствиеСобытия": "EventMatch", +"Dropbox_ДобавитьТег": "Dropbox_AddTag", "Команда CLI: yadisk": "CLI command: yadisk", -"Измененная подборка": "EditedCollection", -"Массив из Структура": "Array of Structure", -"Создать комментарий": "Create comment", -"СоответствиеМетодов": "MethodCorrespondence", -"Создать тему форума": "Create forum thread", -"Отправляемая ссылка": "SentLink", -"БуферДвоичныхДанных": "BinaryDataBuffer", -"ПолучитьСвойАккаунт": "GetOwnAccount", -"СтруктураКлавиатуры": "KeyboardStructure", +"ИзменитьКомментарий": "EditComment", +"ПолучитьВнешнийФайл": "GetExternalFile", +"НаписатьКомментарий": "WriteComment", +"Новое описание базы": "New database description", +"СоздатьТвитКартинки": "Create image tweet", "Создает новый канал": "Creates a new channel", +"ПолучитьОбщийМодуль": "GetCommonModule", +"Закрепить сообщение": "Pin message", +"Длительность опроса": "Poll duration", +"Dropbox_СкачатьФайл": "Dropbox_DownloadFile", +"Получить статистику": "Get statistics", +"Удалить комментарий": "Delete comment", +"Создать\/Удалить тег": "Create\/Delete tag", +"Массив файлов видео": "Video files array", "Наименование канала": "Channel name", -"Сгруппировать товары": "Group products", -"МассивДвоичныхДанных": "BinaryDataArray", -"СтруктураОтправителя": "SenderStructure", -"РазмерНесжатыхДанных": "UncompressedDataSize", -"СоздатьСоставнойПост": "CreateCompositePost", -"КоличествоПараметров": "NumberOfParameters", -"СледующаяВложенность": "NextNesting", -"ЗагрузитьБольшойФайл": "UploadLargeFile", -"Получить комментарии": "Get comments", -"ВозвращаемоеЗначение": "ReturnValue", -"Наименование альбома": "Album name", -"Изменить комментарий": "Modify comment", -"МассивСтруктурКнопок": "ArrayOfButtonStructures", -"Аннотация к картинке": "Image annotation", -"ПолучитьПодборкиПоИД": "GetSelectionsByID", -"Делает репост записи": "Reposts the record", -"Написать комментарий": "Write a comment", -"Команда CLI: dropbox": "CLI Command: dropbox", -"РаботаСКомментариями": "CommentManagement", -"Тестовое сообщение 1": "TestMessage1", -"Получить базу данных": "Get database", -"Изменение публикации": "PublicationChange", -"СоответствиеВарианта": "OptionMap", -"ПодчиненнаяСтруктура": "SubordinateStructure", -"Список пользователей": "User list", -"ИнформацияОПрогрессе": "ProgressInformation", +"Массив файлов гифок": "Gif files array", +"Открепить сообщение": "Unpin message", +"СписокПользователей": "UserList", +"ПолучитьСвойАккаунт": "GetOwnAccount", +"Дата начала периода": "Start date of the period", +"ДобавитьВнешнийФайл": "AddExternalFile", "ПрограммныйИнтерфейс": "ProgrammingInterface", -"ВернутьДочерниеБлоки": "ReturnChildBlocks", -"Библиотека: Airtable": "Library: Airtable", -"Проверка_ТелеграмБан": "Check_TelegramBan", -"ОтправитьМедиагруппу": "SendMediaGroup", -"ДобавитьОписаниеБазы": "AddDatabaseDescription", -"Новый заголовок базы": "New database title", -"ДобавитьСвойстваБазы": "AddDatabaseProperties", -"Изменить тему форума": "Edit forum thread", -"ДобавитьРодителяБазы": "AddDatabaseParent", -"ВК_ЛайкРепостКоммент": "VK_LikeRepostComment", -"Свойства базы данных": "Database properties", -"VK_ОткрытьОбсуждение": "VK_OpenDiscussion", -"VK_ЗакрытьОбсуждение": "VK_CloseDiscussion", -"СоответствиеСимволов": "CharacterMapping", -"ИзменитьСвойстваБазы": "EditDatabaseProperties", +"МассивСтруктурКнопок": "ArrayOfButtonStructures", "VK_СоздатьОбсуждение": "VK_CreateDiscussion", -"ПреобразоватьТелефон": "ConvertPhone", -"Вайбер_ОтправитьФайл": "Viber_SendFile", -"УстановитьЦельКанала": "SetChannelGoal", -"УстановитьТемуКанала": "SetChannelTopic", -"ПолучитьПолеТелефона": "GetPhoneField", -"Пустой макет события": "Empty event template", -"Тестовое сообщение 2": "TestMessage2", -"СделатьФайлПубличным": "MakeFilePublic", -"СделатьФайлПриватным": "MakeFilePrivate", -"URL к внешнему файлу": "URL to external file", -"ОтправитьВнешнийФайл": "SendExternalFile", -"ПолучитьИмяФайлаТела": "GetBodyFileName", -"Удалить внешний файл": "Delete external file", -"Идентификатор канала": "Channel ID", -"Библиотека: Telegram": "Library: Telegram", -"Тестовый комментарий": "TestComment", -"ПолучениеОбщихДанных": "GeneralDataRetrieval", -"Обновленный файл.jpg": "UpdatedFile.jpg", -"СоответствиеВозврата": "ReturnMapping", -"УправлениеИНастройки": "ManagementAndSettings", -"Dropbox_СоздатьПапку": "Dropbox_CreateFolder", -"Dropbox_СкачатьПапку": "Dropbox_DownloadFolder", -"ответ сервера Google": "Google server response", -"Команда CLI: twitter": "CLI Command: twitter", -"Проверка_НоушнОбъект": "Check_NotionObject", -"ID страницы родителя": "Parent page ID", -"Telegram_СкачатьФайл": "Telegram_DownloadFile", -"ID копируемого листа": "CopiedSheetID", -"СоздатьТекстовыйТвит": "CreateTextTweet", +"ВозвращаемоеЗначение": "ReturnValue", +"VK_ЗакрытьОбсуждение": "VK_CloseDiscussion", +"VK_ОткрытьОбсуждение": "VK_OpenDiscussion", +"СледующаяВложенность": "NextNesting", "ПолучитьСписокТестов": "GetTestList", -"ВывестиДопИнформацию": "DisplayAdditionalInformation", -"Команда CLI: gsheets": "CLI Command: gsheets", -"УстановитьФайлВывода": "SetOutputFile", -"УстановитьРежимТеста": "SetTestMode", -"Создать\/Удалить блок": "Create\/Delete block", -"Путь или ID каталога": "Path or ID of the directory", -"ЗагрузитьФайлЧастями": "UploadFileInParts", -"ЗаголовокАвторизации": "AuthorizationHeader", -"Создать\/Удалить пост": "Create\/Delete post", -"НастройкиИИнформация": "SettingsAndInformation", -"Получить комментарий": "Get comment", -"СоответствиеЗначений": "ValueMapping", -"ПолучитьСписокФайлов": "GetFilesList", +"Проверка_ТелеграмБан": "Check_TelegramBan", +"СтруктураОтправителя": "SenderStructure", "СформироватьТестыЯкс": "FormYAXTests", +"ПолучитьПодборкиПоИД": "GetSelectionsByID", +"МассивДвоичныхДанных": "BinaryDataArray", +"ВК_ЛайкРепостКоммент": "VK_LikeRepostComment", +"Библиотека: Airtable": "Library: Airtable", +"Тестовый комментарий": "TestComment", +"Вайбер_ОтправитьФайл": "Viber_SendFile", +"Проверка_НоушнОбъект": "Check_NotionObject", +"Сгруппировать товары": "Group products", +"Делает репост записи": "Reposts the record", "Описание нового поля": "Description of the new field", -"ID родительской базы": "Parent database ID", -"Соответствие свойств": "Properties match", -"СоздатьСтраницуВБазу": "CreatePageInDatabase", +"Dropbox_СоздатьПапку": "Dropbox_CreateFolder", +"Изменить комментарий": "Modify comment", +"Написать комментарий": "Write a comment", +"КоличествоПараметров": "NumberOfParameters", +"Создать\/Удалить блок": "Create\/Delete block", +"Изменение публикации": "PublicationChange", +"Обновленный файл.jpg": "UpdatedFile.jpg", +"Создать\/Удалить пост": "Create\/Delete post", +"Команда CLI: dropbox": "CLI Command: dropbox", +"ПолучитьИмяФайлаТела": "GetBodyFileName", +"РазмерНесжатыхДанных": "UncompressedDataSize", +"Получить комментарии": "Get comments", +"СоответствиеСимволов": "CharacterMapping", "ПолучитьПолеВложения": "GetAttachmentField", -"Удаляет событие по ID": "Deletes an event by ID", -"Проверка_ДропБоксФайл": "Check_DropboxFile", -"В работе : checkbox": "In progress : checkbox", -"Создать\/Изменить базу": "Create\/Edit database", -"СоздатьСвойствоТовара": "CreateProductProperty", -"Новый текст сообщения": "New message text", -"Идентификатор объекта": "Object identifier", -"Создает новое событие": "Creates a new event", -"Слак_ПолучитьСписокВФ": "Slack_GetExternalFileList", -"ПолучитьСписокКаналов": "GetChannelList", -"ПолучитьПолеСтроковое": "GetStringField", -"УдалитьСвойствоТовара": "DeleteProductProperty", -"ПолучитьСписокСобытий": "GetEventList", -"Отправить медиагруппу": "Send media group", -"ЗаписатьПараметрВФайл": "WriteParameterToFile", +"Наименование альбома": "Album name", +"ВывестиДопИнформацию": "DisplayAdditionalInformation", +"Тестовое сообщение 1": "TestMessage1", +"УстановитьФайлВывода": "SetOutputFile", +"ПолучитьПолеТелефона": "GetPhoneField", +"Путь или ID каталога": "Path or ID of the directory", +"УстановитьРежимТеста": "SetTestMode", +"СоздатьСоставнойПост": "CreateCompositePost", +"Тестовое сообщение 2": "TestMessage2", +"Telegram_СкачатьФайл": "Telegram_DownloadFile", +"РаботаСКомментариями": "CommentManagement", +"Dropbox_СкачатьПапку": "Dropbox_DownloadFolder", +"ЗагрузитьБольшойФайл": "UploadLargeFile", +"ИнформацияОПрогрессе": "ProgressInformation", +"ОтправитьВнешнийФайл": "SendExternalFile", +"ПолучениеОбщихДанных": "GeneralDataRetrieval", +"УстановитьЦельКанала": "SetChannelGoal", +"ЗагрузитьФайлЧастями": "UploadFileInParts", +"УстановитьТемуКанала": "SetChannelTopic", +"ДобавитьСвойстваБазы": "AddDatabaseProperties", +"ВернутьДочерниеБлоки": "ReturnChildBlocks", +"Команда CLI: gsheets": "CLI Command: gsheets", +"Список пользователей": "User list", +"ОтправитьМедиагруппу": "SendMediaGroup", +"УправлениеИНастройки": "ManagementAndSettings", +"СоответствиеВарианта": "OptionMap", +"ответ сервера Google": "Google server response", +"URL к внешнему файлу": "URL to external file", +"Пустой макет события": "Empty event template", +"НастройкиИИнформация": "SettingsAndInformation", +"ДобавитьРодителяБазы": "AddDatabaseParent", +"ПреобразоватьТелефон": "ConvertPhone", +"Идентификатор канала": "Channel ID", +"ЗаголовокАвторизации": "AuthorizationHeader", +"Получить базу данных": "Get database", +"СделатьФайлПубличным": "MakeFilePublic", +"СоответствиеЗначений": "ValueMapping", +"ID копируемого листа": "CopiedSheetID", +"ПолучитьСписокФайлов": "GetFilesList", +"Команда CLI: twitter": "CLI Command: twitter", +"СоответствиеВозврата": "ReturnMapping", +"Новый заголовок базы": "New database title", +"ПодчиненнаяСтруктура": "SubordinateStructure", +"Свойства базы данных": "Database properties", +"ДобавитьОписаниеБазы": "AddDatabaseDescription", +"ID страницы родителя": "Parent page ID", +"ИзменитьСвойстваБазы": "EditDatabaseProperties", +"Библиотека: Telegram": "Library: Telegram", +"СделатьФайлПриватным": "MakeFilePrivate", +"Получить комментарий": "Get comment", +"СоздатьСтраницуВБазу": "CreatePageInDatabase", +"Соответствие свойств": "Properties match", +"Удалить внешний файл": "Delete external file", +"Изменить тему форума": "Edit forum thread", +"ID родительской базы": "Parent database ID", +"СоздатьТекстовыйТвит": "CreateTextTweet", +"Аннотация к картинке": "Image annotation", +"ВыполнитьСборкуМусора": "PerformGarbageCollection", "ОтправлятьУведомления": "SendNotifications", -"ПолучитьИсториюКанала": "GetChannelHistory", -"ПреобразоватьВложения": "ConvertAttachments", -"Проверка_ДропБоксТеги": "Check_DropboxTags", +"Dropbox_УдалитьОбъект": "Dropbox_DeleteObject", +"Создать копию объекта": "Create object copy", +"МассивВариантовВыбора": "ChoiceOptionArray", +"ID чата создания темы": "Thread creation chat ID", +"ТекстПервогоСообщения": "Text of the first message", +"Проверка_ВКОбсуждение": "Check_VKDiscussion", +"Слак_ПолучитьСписокВФ": "Slack_GetExternalFileList", +"Dropbox_ЗагрузитьФайл": "Dropbox_UploadFile", "Заголовок базы данных": "Database title", -"ПолучитьСписокЗаказов": "GetOrderList", -"ПолучитьОписаниеФайла": "GetFileDescription", -"ДобавитьСерверныйТест": "AddServerTest", -"Наименование кампании": "Campaign name", -"Dropbox_ПолучитьТокен": "Dropbox_GetToken", -"ПолучитьЗначенияЯчеек": "GetCellValues", -"СклеитьДвоичныеДанные": "ConcatenateBinaryData", +"ПреобразованныеДанные": "ConvertedData", +"Библиотека: Yandex ID": "Library: Yandex ID", +"УстановитьТелоЗапроса": "SetRequestBody", +"УправлениеТемойФорума": "ForumTopicManagement", +"Проверка_ДропБоксФайл": "Check_DropboxFile", "СоответствиеКатегорий": "CategoryCorrespondence", +"ПолучитьСписокСобытий": "GetEventList", +"ЗаписатьПараметрВФайл": "WriteParameterToFile", +"ДобавитьЗаголовокБазы": "AddDatabaseHeader", +"Команда CLI: airtable": "CLI Command: airtable", +"Новый текст сообщения": "New message text", +"Создать\/Изменить поле": "Create\/Edit field", +"ВыполнитьЗапросСТелом": "ExecuteRequestWithBody", +"ПолучитьСписокКаналов": "GetChannelList", "Ссылка получения кода": "Code retrieval link", "ПолучитьСписокТоваров": "GetProductList", -"Проверка_ВКОбсуждение": "Check_VKDiscussion", -"ДвоичныеДанные,Строка": "BinaryData,String", -"Получить товары по ID": "Get products by ID", -"Идентификатор таблицы": "Table identifier", -"Новое название канала": "New channel name", -"ДобавитьТестовыйНабор": "AddTestSet", -"ПреобразованныеДанные": "ConvertedData", -"Создать\/Изменить поле": "Create\/Edit field", -"МассивВариантовВыбора": "ChoiceOptionArray", -"Удаляет лист из книги": "Deletes a sheet from the book", -"ПолучитьТаблицуТестов": "GetTestTable", -"Массив описаний полей": "Array of field descriptions", -"ID рекламной кампании": "Advertising campaign ID", -"ЗаполнитьМассивЛистов": "FillSheetArray", -"Dropbox_УдалитьОбъект": "Dropbox_DeleteObject", -"ИнтерактивныеДействия": "InteractiveActions", -"Dropbox_ЗагрузитьФайл": "Dropbox_UploadFile", -"Путь сохранения файла": "File save path", -"Написать в обсуждение": "Write in discussion", -"ПолучитьСписокСвойств": "GetPropertyList", -"Dropbox_ОбновитьТокен": "Dropbox_UpdateToken", -"ДобавитьЗаголовокБазы": "AddDatabaseHeader", -"Библиотека: Yandex ID": "Library: Yandex ID", -"ТекстПервогоСообщения": "Text of the first message", -"ПолучитьСписокЗаписей": "GetListOfRecords", -"ВыполнитьЗапросСТелом": "ExecuteRequestWithBody", -"Получить таблицы базы": "Get base tables", -"Географическая широта": "Geographic latitude", -"ВыполнитьСборкуМусора": "PerformGarbageCollection", -"Команда CLI: airtable": "CLI Command: airtable", -"Заголовок приглашения": "Invitation title", -"ID целевого сообщения": "Target message ID", -"ВК_ОтправитьСообщение": "VK_SendMessage", -"ID чата создания темы": "Thread creation chat ID", -"УправлениеТемойФорума": "ForumTopicManagement", -"СтруктураПользователя": "UserStructure", -"ВК_ПолучитьСтатистику": "VK_GetStatistics", "Загрузить файл по URL": "Upload file by URL", -"ВК_СоздатьУдалитьПост": "VK_CreateDeletePost", -"УстановитьТелоЗапроса": "SetRequestBody", -"МассивВариантовОпроса": "PollOptionsArray", -"Создать твит картинки": "Create image tweet", -"Получить список тегов": "Get list of tags", +"Создает новое событие": "Creates a new event", +"Заголовок приглашения": "Invitation title", +"Проверка_ДропБоксТеги": "Check_DropboxTags", +"Географическая широта": "Geographic latitude", +"Dropbox_ОбновитьТокен": "Dropbox_UpdateToken", +"Dropbox_ПолучитьТокен": "Dropbox_GetToken", "ЗагрузитьМедиаЧастями": "UploadMediaInParts", -"Создать копию объекта": "Create object copy", -"ЗаписатьФайлыРелэйтед": "WriteRelatedFiles", -"двоичные данные файла": "binary data of the file", -"ДобавитьContentLength": "AddContentLength", -"СоответствиеЗаголовка": "HeaderMapping", -"ID пользователя Viber": "Viber User ID", -"Команда CLI: telegram": "CLI command: telegram", -"ЗагрузитьФотоНаСервер": "UploadPhotoToServer", -"ID асинхронной работы": "AsynchronousJobID", -"Удаляет файл на Slack": "Deletes a file on Slack", -"Твиттер_ОбновитьТокен": "Twitter_UpdateToken", -"Проверка_ТвиттерТекст": "Check_TwitterText", -"Ноушн_СоздатьСтраницу": "Notion_CreatePage", -"Добавить внешний файл": "Add external file", +"ID целевого сообщения": "Target message ID", +"ID рекламной кампании": "Advertising campaign ID", "Получить данные файла": "Get file data", -"Получить внешний файл": "Get external file", +"МассивВариантовОпроса": "PollOptionsArray", +"ID асинхронной работы": "AsynchronousJobID", +"В работе : checkbox": "In progress : checkbox", +"Получить товары по ID": "Get products by ID", +"Создать твит картинки": "Create image tweet", +"ПолучитьЗначенияЯчеек": "GetCellValues", +"ИнтерактивныеДействия": "InteractiveActions", "ЗаписатьЗначениеВФайл": "WriteValueToFile", +"Удаляет файл на Slack": "Deletes a file on Slack", +"Написать в обсуждение": "Write in discussion", +"Создать\/Изменить базу": "Create\/Edit database", +"Наименование кампании": "Campaign name", +"СоздатьСвойствоТовара": "CreateProductProperty", +"Путь сохранения файла": "File save path", +"Получить список тегов": "Get list of tags", +"Удаляет лист из книги": "Deletes a sheet from the book", +"Получить внешний файл": "Get external file", +"Удаляет событие по ID": "Deletes an event by ID", +"ЗаполнитьМассивЛистов": "FillSheetArray", "Строка,ДвоичныеДанные": "String, BinaryData", -"РаботаСФайламиИПапками": "FileAndFolderManagement", -"Получить токен по коду": "Get token by code", -"ВК_СоздатьСсылкуТокена": "VK_CreateTokenLink", -"ЗаполнитьДанныеПоСхеме": "FillDataBySchema", -"ID изменяемой страницы": "ID of the page being modified", -"ЗагрузитьВидеоНаСервер": "UploadVideoToServer", -"Дневной лимит в рублях": "Daily limit in rubles", -"Массив описаний блоков": "Array of block descriptions", -"Соответствие Из Строка": "Compliance From String", -"VK_НаписатьВОбсуждение": "VK_PostToDiscussion", -"ПолучитьСписокПодборок": "GetSelectionList", -"Сообщение из автотеста": "Message from autotest", -"Новое имя главной темы": "New main thread name", -"ДобавитьОписаниеДанных": "AddDataDescription", -"Сделать файл публичным": "Make file public", +"Проверка_ТвиттерТекст": "Check_TwitterText", +"ЗагрузитьФотоНаСервер": "UploadPhotoToServer", +"Отправить медиагруппу": "Send media group", +"УдалитьСвойствоТовара": "DeleteProductProperty", +"ДвоичныеДанные,Строка": "BinaryData,String", +"Получить таблицы базы": "Get base tables", +"Идентификатор объекта": "Object identifier", +"двоичные данные файла": "binary data of the file", +"ПолучитьСписокЗаписей": "GetListOfRecords", +"ВК_ОтправитьСообщение": "VK_SendMessage", +"ДобавитьТестовыйНабор": "AddTestSet", +"ID пользователя Viber": "Viber User ID", +"Идентификатор таблицы": "Table identifier", +"Добавить внешний файл": "Add external file", +"ВК_ПолучитьСтатистику": "VK_GetStatistics", +"ПолучитьТаблицуТестов": "GetTestTable", +"СклеитьДвоичныеДанные": "ConcatenateBinaryData", +"ПолучитьОписаниеФайла": "GetFileDescription", +"Массив описаний полей": "Array of field descriptions", +"ПолучитьСписокЗаказов": "GetOrderList", +"ВК_СоздатьУдалитьПост": "VK_CreateDeletePost", +"ЗаписатьФайлыРелэйтед": "WriteRelatedFiles", +"ДобавитьContentLength": "AddContentLength", +"Команда CLI: telegram": "CLI command: telegram", +"ПолучитьИсториюКанала": "GetChannelHistory", +"ДобавитьСерверныйТест": "AddServerTest", +"Новое название канала": "New channel name", +"Ноушн_СоздатьСтраницу": "Notion_CreatePage", +"ПолучитьПолеСтроковое": "GetStringField", +"ПолучитьСписокСвойств": "GetPropertyList", +"ПреобразоватьВложения": "ConvertAttachments", +"СоответствиеЗаголовка": "HeaderMapping", +"Твиттер_ОбновитьТокен": "Twitter_UpdateToken", +"СтруктураПользователя": "UserStructure", +"СоответствиеПараметров": "ParameterMap", "ID рекламного кабинета": "Advertising account ID", -"Сделать файл приватным": "Make file private", -"УстановитьТелоИзСтроки": "SetBodyFromString", +"ДобавитьТоварВПодборку": "AddProductToSelection", +"Получить пользователей": "Get users", "и почитать комментарии": "and read comments", -"Получить список файлов": "Get list of files", -"Создать\/Удалить записи": "Create\/Delete records", -"Изменить свойства базы": "Edit database properties", +"РаботаСФайламиИПапками": "FileAndFolderManagement", +"Массив файлов картинок": "Image files array", +"УдалитьЛишниеПоляБлока": "RemoveExtraBlockFields", +"ПолучитьОписаниеТовара": "GetProductDescription", +"Проверка_ТелеграмВидео": "Check_TelegramVideo", +"Соответствие из Строка": "Map from String", +"ПреобразоватьЗаголовок": "ConvertHeader", +"Соответствие Из Строка": "Compliance From String", +"Команда CLI: gcalendar": "CLI Command: gcalendar", +"ИзменитьСвойствоТовара": "EditProductProperty", +"Удаляет подборку по ID": "Deletes the selection by ID", +"КаталогЛоговБиблиотеки": "LibraryLogCatalog", +"Проверка_ТелеграмЧисло": "Check_TelegramNumber", +"ПолучитьДвоичныеДанные": "GetBinaryData", +"Проверка_ТелеграмОпрос": "Check_TelegramPoll", +"ID изменяемой страницы": "ID of the page being modified", +"Проверка_ТелеграмГифка": "Check_TelegramGif", +"ЗаполнитьДанныеПоСхеме": "FillDataBySchema", +"Проверка_ТелеграмАудио": "Check_TelegramAudio", +"Дневной лимит в рублях": "Daily limit in rubles", +"Массив из Произвольный": "Array of Arbitrary", +"ПолучитьИнформациюБота": "GetBotInformation", +"УдалитьТоварИзПодборки": "RemoveProductFromSelection", +"Открыть\/Закрыть диалог": "Open\/Close dialog", +"Сделать файл публичным": "Make file public", +"Создать текстовый твит": "Create text tweet", +"Новое имя главной темы": "New main thread name", +"Вайбер_ОтправитьСсылку": "Viber_SendLink", "ПреобразоватьКодВТокен": "ConvertCodeToToken", "Загрузить\/Удалить Файл": "Upload\/Delete file", -"Загрузить\/Удалить файл": "Upload\/Delete file", -"ПолучитьОписаниеТовара": "GetProductDescription", -"Установить цель канала": "Set channel purpose", -"ЗаписатьДвоичныеДанные": "WriteBinaryData", -"Возвращаемое значение:": "Return value:", -"СформированноеОписание": "FormedDescription", -"СформироватьКлавиатуру": "FormKeyboard", +"Создать\/Удалить записи": "Create\/Delete records", "УстановитьРежимОтладки": "SetDebugMode", -"Получает список файлов": "Gets the list of files", -"Установить тему канала": "Set channel topic", -"ЗаписатьJSONМультипарт": "WriteJSONMultipart", -"УстановитьИмяФайлаТела": "SetBodyFileName", -"Создает твит с опросом": "Creates a tweet with a poll", -"СтандартныеЗависимости": "StandardDependencies", -"Получить пользователей": "Get users", -"Массив файлов картинок": "Image files array", -"Открыть\/Закрыть диалог": "Open\/Close dialog", -"Создать текстовый твит": "Create text tweet", -"Путь к папке или файлу": "Path to folder or file", -"Загружает файл на диск": "Uploads a file to the drive", -"ПроверитьЗагрузкуЧасти": "CheckPartUpload", -"Получает событие по ID": "Gets an event by ID", -"Описание : rich_text": "Description : rich_text", -"Массив из Произвольный": "Array of Arbitrary", -"ДропБокс_ЗагрузитьФайл": "Dropbox_UploadFile", -"ВыполнитьЗапросБезТела": "ExecuteRequestWithoutBody", -"ПолучитьМассивПодборок": "GetSelectionArray", -"Географическая долгота": "Geographic longitude", -"ПреобразоватьЗаголовок": "ConvertHeader", -"СоответствиеПараметров": "ParameterMap", -"НаименованиеИзмененное": "EditedName", -"Dropbox_ПолучитьПревью": "Dropbox_GetPreview", -"Соответствие из Строка": "Map from String", -"Создать составной пост": "Create composite post", -"Отправить внешний файл": "Send external file", -"Вайбер_ОтправитьСсылку": "Viber_SendLink", -"Проверка_ТелеграмЧисло": "Check_TelegramNumber", -"ID календаря источника": "ID of the source calendar", -"Команда CLI: gcalendar": "CLI Command: gcalendar", -"ДобавитьТоварВПодборку": "AddProductToSelection", -"Строка, ДвоичныеДанные": "String, BinaryData", -"УдалитьТоварИзПодборки": "RemoveProductFromSelection", -"Удаляет подборку по ID": "Deletes the selection by ID", -"Проверка_ТелеграмВидео": "Check_TelegramVideo", -"ID календаря приемника": "ID of the target calendar", -"Проверка_ТелеграмАудио": "Check_TelegramAudio", -"КаталогЛоговБиблиотеки": "LibraryLogCatalog", -"ИзменитьСвойствоТовара": "EditProductProperty", -"ПолучитьИнформациюБота": "GetBotInformation", -"Массив из Строка,Число": "Array of String,Number", -"ПолучитьДвоичныеДанные": "GetBinaryData", -"Вернуть дочерние блоки": "Return child blocks", -"Проверка_ТелеграмОпрос": "Check_TelegramPoll", -"Дата окончания периода": "End date of the period", -"УдалитьЛишниеПоляБлока": "RemoveExtraBlockFields", -"Новое описание события": "New event description", "СоздатьПодборкуТоваров": "CreateProductCollection", -"Проверка_ТелеграмГифка": "Check_TelegramGif", -"Telegram_УдалитьWebhook": "Telegram_DeleteWebhook", -"АТ_СоздатьУдалитьЗаписи": "AT_CreateDeleteRecords", -"Создать\/Удалить событие": "Create\/Delete event", -"Действия с обсуждениями": "Actions with discussions", -"Вайбер_ОтправитьКонтакт": "Viber_SendContact", -"ОбеспечитьПустойКаталог": "EnsureEmptyDirectory", -"СоединитьДвоичныеДанные": "JoinBinaryData", -"Вайбер_ОтправитьЛокацию": "Viber_SendLocation", -"Создать свойство товара": "Create product property", -"Лайк\/Репост\/Комментарий": "Like\/Repost\/Comment", -"ПолучитьРазделительПути": "GetPathSeparator", -"ЗаписатьФайлыМультипарт": "WriteMultipartFiles", -"Твиттер_СоздатьТвитСГиф": "Twitter_CreateTweetWithGif", -"ГД_ЗагрузитьУдалитьФайл": "GD_UploadDeleteFile", -"ГенераторОтчетаПокрытия": "CoverageReportGenerator", -"ДропБокс_СоздатьКаталог": "Dropbox_CreateFolder", -"Скопированный файл.jpeg": "CopiedFile.jpeg", -"ПолучитьПубличныйОбъект": "GetPublicObject", -"Получить список свойств": "Get property list", -"Получить список заказов": "Get order list", -"Путь к созаваемой папке": "Path to the created folder", -"Телеграм_ОтправитьВидео": "Telegram_SendVideo", -"Проверка_ДропБоксСтатус": "Check_DropboxStatus", -"Проверка_ТелеграмИстина": "Check_TelegramTrue", -"VK_СоздатьСоставнойПост": "VK_CreateCompositePost", -"Проверка_ТелеграмМассив": "Check_TelegramArray", -"Непредвиденная ошибка!:": "Unexpected Error!", -"Проверка_ДропБоксРабота": "Check_DropboxWork", -"ВК_СоздатьСоставнойПост": "VK_CreateCompositePost", -"Слак_ЗагрузитьУдалитьВФ": "Slack_UploadDeleteExternalFile", -"Получить подборки по ID": "Get selections by ID", -"Удалить свойство товара": "Delete product property", -"ПолучитьЗначениеИзФайла": "GetValueFromFile", -"Сформировать клавиатуру": "Create keyboard", -"ТаблицаДляИспользования": "TableForUse", -"ВК_СоздатьТоварПодборку": "VK_CreateProductSelection", -"Проверка_ДропБоксМассив": "Check_DropboxArray", -"Новое название подборки": "New selection name", -"Telegram_ОтправитьОпрос": "Telegram_SendPoll", -"Телеграм_ОтправитьОпрос": "Telegram_SendPoll", -"Telegram_ОтправитьВидео": "Telegram_SendVideo", +"Сделать файл приватным": "Make file private", +"ПолучитьМассивПодборок": "GetSelectionArray", +"Загрузить\/Удалить файл": "Upload\/Delete file", +"УстановитьТелоИзСтроки": "SetBodyFromString", +"ID календаря источника": "ID of the source calendar", +"ЗаписатьДвоичныеДанные": "WriteBinaryData", +"Получает список файлов": "Gets the list of files", +"Получить список файлов": "Get list of files", +"ВК_СоздатьСсылкуТокена": "VK_CreateTokenLink", +"СтандартныеЗависимости": "StandardDependencies", +"ЗаписатьJSONМультипарт": "WriteJSONMultipart", +"СформироватьКлавиатуру": "FormKeyboard", +"ПолучитьСписокПодборок": "GetSelectionList", +"Строка, ДвоичныеДанные": "String, BinaryData", +"ЗагрузитьВидеоНаСервер": "UploadVideoToServer", +"УстановитьИмяФайлаТела": "SetBodyFileName", +"Возвращаемое значение:": "Return value:", +"Массив из Строка,Число": "Array of String,Number", +"VK_НаписатьВОбсуждение": "VK_PostToDiscussion", +"Загружает файл на диск": "Uploads a file to the drive", +"Описание : rich_text": "Description : rich_text", +"ВыполнитьЗапросБезТела": "ExecuteRequestWithoutBody", +"Отправить внешний файл": "Send external file", +"СформированноеОписание": "FormedDescription", +"Дата окончания периода": "End date of the period", +"Создает твит с опросом": "Creates a tweet with a poll", +"Массив описаний блоков": "Array of block descriptions", +"Изменить свойства базы": "Edit database properties", +"Вернуть дочерние блоки": "Return child blocks", +"Dropbox_ПолучитьПревью": "Dropbox_GetPreview", +"Получить токен по коду": "Get token by code", +"ПроверитьЗагрузкуЧасти": "CheckPartUpload", +"Установить цель канала": "Set channel purpose", +"Географическая долгота": "Geographic longitude", +"Сообщение из автотеста": "Message from autotest", +"Создать составной пост": "Create composite post", +"НаименованиеИзмененное": "EditedName", +"ДропБокс_ЗагрузитьФайл": "Dropbox_UploadFile", +"Новое описание события": "New event description", +"Путь к папке или файлу": "Path to folder or file", +"ДобавитьОписаниеДанных": "AddDataDescription", +"ID календаря приемника": "ID of the target calendar", +"Установить тему канала": "Set channel topic", +"Получает событие по ID": "Gets an event by ID", +"Пустое описание товара:": "Empty product description:", "Получить\/Обновить токен": "Get\/Update token", -"Проверка_ДвоичныеДанные": "Check_BinaryData", -"Новое значение свойства": "New property value", -"Телеграм_ОтправитьАудио": "Telegram_SendAudio", +"ДФ=yyyy-MM-ddThh:mm:ssZ": "ISO8601Datetime", +"Какой ваш любимый цвет?": "What's your favorite color?", +"Создать свойство товара": "Create product property", +"Получить список свойств": "Get property list", +"Удалить свойство товара": "Delete product property", +"СкрытьГлавнуюТемуФорума": "HideMainForumTopic", +"Непредвиденная ошибка!:": "Unexpected Error!", "Массив из Строка, Число": "Array of string, number", +"МаксимальнаяВложенность": "MaximumNesting", +"ГД_ЗагрузитьУдалитьФайл": "GD_UploadDeleteFile", "ИзменитьПодборкуТоваров": "EditProductCollection", "Новая картинка подборки": "New selection image", -"ВывестиСправкуПоМетодам": "DisplayMethodHelp", -"Telegram_ОтправитьАудио": "Telegram_SendAudio", -"ЯДиск_ПереместитьОбъект": "YDisk_MoveObject", -"Какой ваш любимый цвет?": "What's your favorite color?", -"Телеграм_ОтправитьГифку": "Telegram_SendGIF", -"Библиотека: Yandex Disk": "Library: Yandex Disk", -"Telegram_ОтправитьГифку": "Telegram_SendGif", -"МаксимальнаяВложенность": "MaximumNesting", -"Создать\/Удалить каталог": "Create\/Delete catalog", -"Новый текст комментария": "New comment text", -"OPI_ПреобразованиеТипов": "OPI_TypeConversion", -"УстановитьЗначенияЯчеек": "SetCellValues", -"Получить список записей": "Get list of records", -"ОтменитьПубликациюПапки": "CancelFolderPublication", -"МассивURLФайловВложений": "ArrayOfAttachmentURLs", -"ИсключатьАрхивированные": "ExcludeArchived", +"Новое название подборки": "New selection name", +"Новое значение свойства": "New property value", +"Получить список заказов": "Get order list", +"Сформировать клавиатуру": "Create keyboard", +"Получить подборки по ID": "Get selections by ID", +"Действия с обсуждениями": "Actions with discussions", +"Лайк\/Репост\/Комментарий": "Like\/Repost\/Comment", "ОпределитьМетодОтправки": "DetermineSendMethod", -"СкрытьГлавнуюТемуФорума": "HideMainForumTopic", -"Создать канал приватным": "Create channel as private", -"Получить список событий": "Get list of events", -"ПолучитьСписокКаталогов": "GetDirectoriesList", -"Получить историю канала": "Get channel history", -"Массив ID пользователей": "User ID Array", -"ПолучитьЧислоУчастников": "GetParticipantCount", -"Не найден входной файл!": "Input File Not Found!", -"Имя файла с расширением": "File name with extension", -"Массив вариантов ответа": "Array of answer options", -"УправлениеВнешнимФайлом": "ExternalFileManagement", -"ПолучитьКалендарьСписка": "GetListCalendar", -"УникальныйИдентификатор": "UniqueIdentifier", -"ОтправитьМестоположение": "SendLocation", -"Наименование новой базы": "New base name", -"ДФ=yyyy-MM-ddTHH:mm:ssZ": "DF=yyyy-MM-ddTHH:mm:ssZ", "ПараметрыЗапросаВСтроку": "RequestParametersToString", -"ID файла для скачивания": "File ID for downloading", "ОтменитьПубликациюФайла": "CancelFilePublication", -"СформироватьМассивМедиа": "FormMediaArray", -"Идентификатор базы База": "Base identifier Base", -"СпособКодированияСтроки": "StringEncodingMethod", -"Наименование обсуждения": "Discussion name", +"Создать\/Удалить событие": "Create\/Delete event", +"ПолучитьЧислоУчастников": "GetParticipantCount", +"Создать\/Удалить каталог": "Create\/Delete catalog", +"Не найден входной файл!": "Input File Not Found!", "ПолучитьИнформациюОБоте": "GetBotInformation", -"СоздатьПроизвольныйТвит": "CreateCustomTweet", -"Получить список каналов": "Get channel list", -"Получить список товаров": "Get product list", -"Получить значения ячеек": "Get cell values", -"Путь к объекту удаления": "Path to the object to delete", -"Удаляет календарь по ID": "Deletes a calendar by ID", -"Пустое описание товара:": "Empty product description:", -"ИзменитьКалендарьСписка": "EditListCalendar", -"СоздатьЗаголовкиЗапроса": "CreateRequestHeaders", -"ПолучитьОписаниеСобытия": "GetEventDescription", -"Создать страницу в базу": "Create page in database", -"ПолучитьСтатусОбработки": "GetProcessingStatus", -"РазделитьДвоичныеДанные": "SplitBinaryData", -"Произвольный, HTTPОтвет": "Arbitrary, HTTP Response", -"Массив вариантов опроса": "Poll options array", +"Новый текст комментария": "New comment text", +"Библиотека: Yandex Disk": "Library: Yandex Disk", +"Путь к созаваемой папке": "Path to the created folder", +"Вайбер_ОтправитьКонтакт": "Viber_SendContact", +"ПолучитьПубличныйОбъект": "GetPublicObject", +"ПолучитьЗначениеИзФайла": "GetValueFromFile", +"Получить историю канала": "Get channel history", +"ЗаписатьФайлыМультипарт": "WriteMultipartFiles", +"ЯДиск_ПереместитьОбъект": "YDisk_MoveObject", +"Telegram_ОтправитьГифку": "Telegram_SendGif", +"ПолучитьСписокКаталогов": "GetDirectoriesList", +"Телеграм_ОтправитьГифку": "Telegram_SendGIF", +"Telegram_ОтправитьАудио": "Telegram_SendAudio", +"Телеграм_ОтправитьАудио": "Telegram_SendAudio", +"Telegram_ОтправитьВидео": "Telegram_SendVideo", +"Телеграм_ОтправитьВидео": "Telegram_SendVideo", +"Слак_ЗагрузитьУдалитьВФ": "Slack_UploadDeleteExternalFile", +"Наименование обсуждения": "Discussion name", "Текст первого сообщения": "Text of the first message", -"ДФ=yyyy-MM-ddThh:mm:ssZ": "ISO8601Datetime", +"Telegram_УдалитьWebhook": "Telegram_DeleteWebhook", +"УстановитьЗначенияЯчеек": "SetCellValues", +"ВывестиСправкуПоМетодам": "DisplayMethodHelp", +"ДФ=yyyy-MM-ddTHH:mm:ssZ": "DF=yyyy-MM-ddTHH:mm:ssZ", +"Создать канал приватным": "Create channel as private", +"АТ_СоздатьУдалитьЗаписи": "AT_CreateDeleteRecords", +"Телеграм_ОтправитьОпрос": "Telegram_SendPoll", +"Telegram_ОтправитьОпрос": "Telegram_SendPoll", +"Идентификатор базы База": "Base identifier Base", +"Массив ID пользователей": "User ID Array", +"ПолучитьОписаниеСобытия": "GetEventDescription", +"ID файла для скачивания": "File ID for downloading", +"Произвольный, HTTPОтвет": "Arbitrary, HTTP Response", +"ВК_СоздатьТоварПодборку": "VK_CreateProductSelection", +"СоединитьДвоичныеДанные": "JoinBinaryData", +"Твиттер_СоздатьТвитСГиф": "Twitter_CreateTweetWithGif", +"Наименование новой базы": "New base name", "для дальнейших действий": "for further actions", +"СпособКодированияСтроки": "StringEncodingMethod", +"ТаблицаДляИспользования": "TableForUse", +"ПолучитьКалендарьСписка": "GetListCalendar", +"Скопированный файл.jpeg": "CopiedFile.jpeg", +"Получить список записей": "Get list of records", +"МассивURLФайловВложений": "ArrayOfAttachmentURLs", +"УправлениеВнешнимФайлом": "ExternalFileManagement", +"OPI_ПреобразованиеТипов": "OPI_TypeConversion", +"VK_СоздатьСоставнойПост": "VK_CreateCompositePost", +"ВК_СоздатьСоставнойПост": "VK_CreateCompositePost", +"Удаляет календарь по ID": "Deletes a calendar by ID", +"Имя файла с расширением": "File name with extension", +"ПолучитьРазделительПути": "GetPathSeparator", +"Получить значения ячеек": "Get cell values", +"Получить список событий": "Get list of events", +"Проверка_ДвоичныеДанные": "Check_BinaryData", +"Проверка_ТелеграмИстина": "Check_TelegramTrue", +"Проверка_ДропБоксМассив": "Check_DropboxArray", +"Создать страницу в базу": "Create page in database", +"Получить список товаров": "Get product list", +"ИсключатьАрхивированные": "ExcludeArchived", +"Проверка_ДропБоксРабота": "Check_DropboxWork", +"Проверка_ДропБоксСтатус": "Check_DropboxStatus", "ЗагрузитьМассивВложений": "Upload attachments array", -"Создает каталог на диске": "Creates a directory on the disk", -"ВК_ПолучитьСписокСвойств": "VK_GetPropertyList", -"ВК_ПолучитьСписокЗаказов": "VK_GetOrderList", -"Загрузить фото на сервер": "Upload photo to server", -"Файл источник обновления": "File source for update", -"РазложитьОбъектыПодробно": "BreakDownObjectsInDetail", -"ДобавитьКалендарьВСписок": "AddCalendarToList", -"Путь к целевому каталогу": "Path to the target directory", -"Ссылка (URL) под записью": "Link (URL) under the post", -"Получить данные аккаунта": "Get account data", -"ПолучитьДвоичныеИлиПоток": "GetBinaryOrStream", -"Отправить местоположение": "Send location", -"Новый каталог размещения": "New parent directory", -"Создает новое обсуждение": "Creates a new discussion", -"Создать товар и подборку": "Create product and selection", -"Данные файл для загрузки": "Data file for upload", -"Библиотека: Google Drive": "Library: Google Drive", -"Путь к объекту оригинала": "Path to the original object", -"ВывестиНачальнуюСтраницу": "DisplayStartPage", -"ОписаниеПримитивногоПоля": "PrimitiveFieldDescription", -"ВК_ПолучитьСписокТоваров": "VK_GetProductList", -"Получить информацию бота": "Get bot information", -"Набор тестов для YAxUnit": "Test suite for YAxUnit", -"СформироватьТестыАссертс": "FormAssertsTests", -"ПреобразоватьДанныеФайла": "ConvertFileData", -"ДобавитьПараметрыКоманды": "AddCommandParameters", -"Массив заголовков кнопок": "Array of button titles", -"ПолучитьЗаголовкиЗапроса": "GetRequestHeaders", -"Строка, Массив Из Строка": "String, Array of Strings", -"Изменить свойство товара": "Edit product property", -"Строка, Массив из Строка": "String, Array of Strings", -"СохранитьКартинкуВАльбом": "SaveImageToAlbum", -"Создать\/Изменить таблицу": "Create\/Edit table", -"ДобавитьПараметрКартинки": "AddImageParameter", -"СоздатьВысокуюКлавиатуру": "CreateTallKeyboard", -"ПолучитьКодПодтверждения": "GetConfirmationCode", -"Наименование нового поля": "New field name", -"ТекущаяУниверсальнаяДата": "CurrentUniversalDate", -"ПолучитьИнформациюОДиске": "GetDiskInformation", -"СоздатьСсылкуПриглашение": "CreateInvitationLink", -"СоздатьДлиннуюКлавиатуру": "CreateLongKeyboard", -"УдалитьКалендарьИзСписка": "DeleteCalendarFromList", -"Получить список областей": "Get region list", -"Создать подборку товаров": "Create product selection", +"СоздатьЗаголовкиЗапроса": "CreateRequestHeaders", +"ДропБокс_СоздатьКаталог": "Dropbox_CreateFolder", +"ИзменитьКалендарьСписка": "EditListCalendar", +"Массив вариантов опроса": "Poll options array", +"ОбеспечитьПустойКаталог": "EnsureEmptyDirectory", +"СоздатьПроизвольныйТвит": "CreateCustomTweet", +"Массив вариантов ответа": "Array of answer options", +"Проверка_ТелеграмМассив": "Check_TelegramArray", +"РазделитьДвоичныеДанные": "SplitBinaryData", +"ОтправитьМестоположение": "SendLocation", +"УникальныйИдентификатор": "UniqueIdentifier", +"ОтменитьПубликациюПапки": "CancelFolderPublication", +"Вайбер_ОтправитьЛокацию": "Viber_SendLocation", +"ГенераторОтчетаПокрытия": "CoverageReportGenerator", +"СформироватьМассивМедиа": "FormMediaArray", +"Получить список каналов": "Get channel list", +"Путь к объекту удаления": "Path to the object to delete", +"ПолучитьСтатусОбработки": "GetProcessingStatus", "Изменяет название канала": "Changes the name of the channel", -"ПолучитьСтатистикуПостов": "GetPostStatistics", -"ДропБокс_ПолучитьАккаунт": "Dropbox_GetAccount", -"СоздатьРекламнуюКампанию": "CreateAdvertisingCampaign", -"Ноушн_СоздатьУдалитьБлок": "Notion_CreateDeleteBlock", -"Проверка_ДропбоксАккаунт": "Check_DropboxAccount", -"Получить список подборок": "Get selection list", -"ИзменитьСвойстваСтраницы": "EditPageProperties", -"РаботаСПодборкамиТоваров": "ProductSelectionManagement", -"Новое описание календаря": "New calendar description", -"Создает пустой календарь": "Creates an empty calendar", +"ВК_ПолучитьСписокТоваров": "VK_GetProductList", "Проверка_ТелеграмКонтакт": "Check_TelegramContact", -"Вайбер_ОтправитьКартинку": "Viber_SendImage", -"ОбработатьОшибочныйВывод": "HandleErrorOutput", -"ID целевого пользователя": "Target user ID", -"ПолучитьСписокКалендарей": "GetCalendarList", -"D:\\GD\\Мой диск\\data.json": "D:\\GD\\My Drive\\data.json", -"АргументыКоманднойСтроки": "CommandLineArguments", -"ОпределитьТекущуюКоманду": "DetermineCurrentCommand", -"Dropbox_КопироватьОбъект": "Dropbox_CopyObject", -"Массив товаров или товар": "Array of products or product", -"ДобавитьРодителяСтраницы": "AddPageParent", -"ПолучитьСписокРазрешений": "GetPermissionsList", -"ГК_ПолучитьСписокСобытий": "GC_GetEventList", -"Признак рекламного поста": "Sign of an advertising post", -"ГК_СоздатьУдалитьСобытие": "GC_CreateDeleteEvent", -"ID пользователя адресата": "Recipient user ID", -"Новый тестовый заголовок": "NewTestTitle", +"Наименование нового поля": "New field name", +"ВК_ПолучитьСписокЗаказов": "VK_GetOrderList", "ПолучитьПараметрыТвиттер": "GetTwitterParameters", -"РаботаСУдаленнымиФайлами": "DeletedFilesManagement", +"ОписаниеПримитивногоПоля": "PrimitiveFieldDescription", +"Проверка_ДропбоксАккаунт": "Check_DropboxAccount", +"СоздатьВысокуюКлавиатуру": "CreateTallKeyboard", +"УдалитьКалендарьИзСписка": "DeleteCalendarFromList", +"СоздатьДлиннуюКлавиатуру": "CreateLongKeyboard", +"СформироватьТестыАссертс": "FormAssertsTests", +"Создает каталог на диске": "Creates a directory on the disk", +"Набор тестов для YAxUnit": "Test suite for YAxUnit", +"ДобавитьПараметрКартинки": "AddImageParameter", +"Новое описание календаря": "New calendar description", +"Отправить местоположение": "Send location", +"Строка, Массив из Строка": "String, Array of Strings", +"Массив заголовков кнопок": "Array of button titles", +"Новый тестовый заголовок": "NewTestTitle", +"СоздатьСсылкуПриглашение": "CreateInvitationLink", +"Dropbox_КопироватьОбъект": "Dropbox_CopyObject", "СформироватьБлокКартинку": "GenerateImageBlock", -"Dropbox_ОпубликоватьПапку": "Dropbox_PublishFolder", -"ДропБокс_РаботаСДоступами": "Dropbox_AccessManagement", -"ID пользователей(я) Viber": "Viber User(s) ID", -"Проверка_ТелеграмКартинка": "Check_TelegramImage", -"Проверка_ТелеграмДокумент": "Check_TelegramDocument", -"ПолучитьСписокФайловПапки": "GetListOfFolderFiles", -"Копирует файл или каталог": "Copies file or directory", -"OPI_ПолучениеДанныхТестов": "OPI_GetTestData", -"ПолучитьИнформациюОКанале": "GetChannelInformation", -"ДобавитьЗаголовокСтраницы": "AddPageHeader", -"ПереключениеОбщегоДоступа": "TogglePublicAccess", -"ПоказыватьВыводНемедленно": "ShowOutputImmediately", -"Статус : Соответствие": "Status : Map", -"ВосстановитьОбъектКВерсии": "RestoreObjectToVersion", -"Создать\/Удалить календарь": "Create\/Delete calendar", -"ОтменитьПубликациюОбъекта": "CancelObjectPublication", -"Получить публичный объект": "Get public object", -"Преобразовать код в токен": "Convert code to token", -"Проверка_ДропбоксУчастник": "Check_DropboxMember", -"РаботаСоСпискомКалендарей": "CalendarListManagement", -"Новый альбом из автотеста": "NewAlbumFromAutoTest", -"Заполнить\/Очистить ячейки": "Fill\/Clear cells", -"ОчиститьОсновнойКалендарь": "ClearMainCalendar", -"URL для установки Webhook": "URL for setting up Webhook", -"Добавить\/Удалить картинку": "Add\/Delete image", -"Создает твит без вложений": "Creates a tweet without attachments", -"Ноушн_СоздатьИзменитьБазу": "Notion_CreateEditDatabase", -"Получить календарь списка": "Get list calendar", -"Твиттер_СоздатьТвитСВидео": "Twitter_CreateTweetWithVideo", -"ВК_ПолучитьСписокПодборок": "VK_GetSelectionList", -"Заголовок файла для Slack": "File title for Slack", -"Библиотека: Google Sheets": "Library: Google Sheets", -"Тестовый товар измененный": "EditedTestProduct", +"ПолучитьКодПодтверждения": "GetConfirmationCode", +"Ноушн_СоздатьУдалитьБлок": "Notion_CreateDeleteBlock", +"ДропБокс_ПолучитьАккаунт": "Dropbox_GetAccount", +"Изменить свойство товара": "Edit product property", +"Создает пустой календарь": "Creates an empty calendar", +"ПолучитьСписокКалендарей": "GetCalendarList", +"ПолучитьИнформациюОДиске": "GetDiskInformation", +"ДобавитьКалендарьВСписок": "AddCalendarToList", +"РаботаСУдаленнымиФайлами": "DeletedFilesManagement", +"Массив товаров или товар": "Array of products or product", +"ID пользователя адресата": "Recipient user ID", +"Библиотека: Google Drive": "Library: Google Drive", +"ПолучитьСтатистикуПостов": "GetPostStatistics", +"ДобавитьРодителяСтраницы": "AddPageParent", +"СоздатьРекламнуюКампанию": "CreateAdvertisingCampaign", +"Файл источник обновления": "File source for update", +"ПолучитьДвоичныеИлиПоток": "GetBinaryOrStream", +"ПолучитьСписокРазрешений": "GetPermissionsList", +"ИзменитьСвойстваСтраницы": "EditPageProperties", +"Данные файл для загрузки": "Data file for upload", +"Получить данные аккаунта": "Get account data", +"Создать\/Изменить таблицу": "Create\/Edit table", +"Получить список областей": "Get region list", +"Вайбер_ОтправитьКартинку": "Viber_SendImage", +"ПолучитьЗаголовкиЗапроса": "GetRequestHeaders", +"D:\\GD\\Мой диск\\data.json": "D:\\GD\\My Drive\\data.json", +"Признак рекламного поста": "Sign of an advertising post", +"ТекущаяУниверсальнаяДата": "CurrentUniversalDate", +"Путь к целевому каталогу": "Path to the target directory", +"Новый каталог размещения": "New parent directory", +"ГК_ПолучитьСписокСобытий": "GC_GetEventList", +"ОпределитьТекущуюКоманду": "DetermineCurrentCommand", +"АргументыКоманднойСтроки": "CommandLineArguments", +"ВывестиНачальнуюСтраницу": "DisplayStartPage", +"Ссылка (URL) под записью": "Link (URL) under the post", +"ДобавитьПараметрыКоманды": "AddCommandParameters", +"Строка, Массив Из Строка": "String, Array of Strings", +"РазложитьОбъектыПодробно": "BreakDownObjectsInDetail", +"СохранитьКартинкуВАльбом": "SaveImageToAlbum", +"Путь к объекту оригинала": "Path to the original object", +"Загрузить фото на сервер": "Upload photo to server", +"ОбработатьОшибочныйВывод": "HandleErrorOutput", +"Создает новое обсуждение": "Creates a new discussion", +"ГК_СоздатьУдалитьСобытие": "GC_CreateDeleteEvent", +"ПреобразоватьДанныеФайла": "ConvertFileData", +"Создать товар и подборку": "Create product and selection", +"ВК_ПолучитьСписокСвойств": "VK_GetPropertyList", +"Создать подборку товаров": "Create product selection", +"РаботаСПодборкамиТоваров": "ProductSelectionManagement", +"ID целевого пользователя": "Target user ID", +"Получить список подборок": "Get selection list", +"Получить информацию бота": "Get bot information", "ПолучениеДанныхИНастройка": "DataRetrievalAndSettings", -"Изменить календарь списка": "Edit list calendar", -"ЯДиск_СоздатьКопиюОбъекта": "YDisk_CreateObjectCopy", -"Отменить публикацию файла": "Unpublish file", -"Создает новую базу данных": "Creates a new database", -"ЭкранированиеСимволовJSON": "EscapeJSONCharacters", -"ДобавитьИдентификаторЧата": "AddChatIdentifier", -"ИзменитьНаименованиеКниги": "EditBookTitle", -"Устанавливает тему канала": "Sets the channel topic", -"Получить число участников": "Get participant count", -"Наименование нового листа": "NewSheetName", "Создать произвольный твит": "Create custom tweet", -"Телеграм_ОтправитьКонтакт": "Telegram_SendContact", -"Telegram_ОтправитьКонтакт": "Telegram_SendContact", +"ПоказыватьВыводНемедленно": "ShowOutputImmediately", +"Наименование нового листа": "NewSheetName", +"ИзменитьНаименованиеКниги": "EditBookTitle", +"ДобавитьЗаголовокСтраницы": "AddPageHeader", +"Статус : Соответствие": "Status : Map", +"URL для установки Webhook": "URL for setting up Webhook", +"Путь назначения для копии": "Destination path for the copy", +"Проверка_ДропбоксУчастник": "Check_DropboxMember", +"ДобавитьИдентификаторЧата": "AddChatIdentifier", +"Добавить\/Удалить картинку": "Add\/Delete image", +"РаботаСоСпискомКалендарей": "CalendarListManagement", +"ПоказатьГлавнуюТемуФорума": "ShowMainForumTopic", +"См.ПолучитьОписаниеТовара": "See GetProductDescription", +"СоответствиеКомандМодулей": "ModuleCommandMapping", +"Архивирует активный канал": "Archives an active channel", +"ПолучитьСсылкуАвторизации": "GetAuthorizationLink", +"ЯДиск_СоздатьКопиюОбъекта": "YDisk_CreateObjectCopy", +"ОтменитьПубликациюОбъекта": "CancelObjectPublication", +"Проверка_ТелеграмКартинка": "Check_TelegramImage", "Установить значения ячеек": "SetCellValues", -"ПолучитьСсылкуНаСообщение": "GetMessageLink", -"Отменить публикацию папки": "Unpublish folder", -"Изменить имя главной темы": "Change main topic name", +"РаботаСРекламнымКабинетом": "AdAccountManagement", +"ПереключениеОбщегоДоступа": "TogglePublicAccess", +"Номер рекламной категории": "Advertising category number", +"Проверка_ТелеграмДокумент": "Check_TelegramDocument", +"Изменить подборку товаров": "Edit product selection", +"Получить публичный объект": "Get public object", +"Загрузить видео на сервер": "Upload video to server", +"Telegram_ОтправитьКонтакт": "Telegram_SendContact", +"Добавить товар в подборку": "Add product to selection", "Слак_ЗагрузитьУдалитьФайл": "Slack_UploadDeleteFile", "Слак_ПолучитьСписокФайлов": "Slack_GetFileList", +"ОчиститьОсновнойКалендарь": "ClearMainCalendar", "Слак_ОткрытьЗакрытьДиалог": "Slack_OpenCloseDialog", -"ПоказатьГлавнуюТемуФорума": "ShowMainForumTopic", -"СоответствиеКомандМодулей": "ModuleCommandMapping", -"ВыполнитьЗапросМультипарт": "ExecuteMultipartRequest", -"Архивирует активный канал": "Archives an active channel", -"Удаляет комментарий по ID": "Deletes comment by ID", -"Dropbox_ПереместитьОбъект": "Dropbox_MoveObject", -"Путь назначения для копии": "Destination path for the copy", +"Dropbox_ОпубликоватьПапку": "Dropbox_PublishFolder", +"ДропБокс_РаботаСДоступами": "Dropbox_AccessManagement", +"Телеграм_ОтправитьКонтакт": "Telegram_SendContact", +"Преобразовать код в токен": "Convert code to token", +"Создает твит без вложений": "Creates a tweet without attachments", +"ВК_ПолучитьСписокПодборок": "VK_GetSelectionList", +"OPI_ПолучениеДанныхТестов": "OPI_GetTestData", +"Получить число участников": "Get participant count", "Некорректный вид отправки": "Incorrect sending view", -"Удалить товар из подборки": "Remove product from selection", -"Номер рекламной категории": "Advertising category number", -"См.ПолучитьОписаниеТовара": "See GetProductDescription", -"Загрузить видео на сервер": "Upload video to server", -"Создает пост с картинками": "Creates a post with images", -"ВыполнитьОбработкуКоманды": "ExecuteCommandProcessing", -"Идентификатор комментария": "Comment identifier", -"РаботаСоСвойствамиТоваров": "ProductPropertiesManagement", -"РаботаСРекламнымКабинетом": "AdAccountManagement", -"ПолучитьСсылкуАвторизации": "GetAuthorizationLink", -"РаботаСФайламиИКаталогами": "FileAndDirectoryManagement", -"См. ПолучитьОписаниеФайла": "See GetFileDescription", +"ПолучитьСсылкуНаСообщение": "GetMessageLink", +"Отменить публикацию файла": "Unpublish file", +"Твиттер_СоздатьТвитСВидео": "Twitter_CreateTweetWithVideo", +"Создать\/Удалить календарь": "Create\/Delete calendar", "Получить список каталогов": "Get list of directories", -"Добавить товар в подборку": "Add product to selection", -"Изменить подборку товаров": "Edit product selection", +"ЭкранированиеСимволовJSON": "EscapeJSONCharacters", +"Тестовый товар измененный": "EditedTestProduct", +"ВыполнитьЗапросМультипарт": "ExecuteMultipartRequest", +"МобильноеПриложениеКлиент": "MobileAppClient", +"МобильноеПриложениеСервер": "MobileAppServer", +"Dropbox_ПереместитьОбъект": "Dropbox_MoveObject", +"Новый альбом из автотеста": "NewAlbumFromAutoTest", +"ВосстановитьОбъектКВерсии": "RestoreObjectToVersion", +"Изменить имя главной темы": "Change main topic name", +"Изменить календарь списка": "Edit list calendar", +"Заголовок файла для Slack": "File title for Slack", +"Заполнить\/Очистить ячейки": "Fill\/Clear cells", +"РаботаСоСвойствамиТоваров": "ProductPropertiesManagement", +"Удаляет комментарий по ID": "Deletes comment by ID", +"Устанавливает тему канала": "Sets the channel topic", +"См. ПолучитьОписаниеФайла": "See GetFileDescription", "Идентификатор базы данных": "Database identifier", -"Слак_ПолучитьСписокКаналов": "Slack_GetChannelList", -"Telegram_УдалитьТемуФорума": "Telegram_DeleteForumTopic", +"Копирует файл или каталог": "Copies file or directory", +"ПолучитьСписокФайловПапки": "GetListOfFolderFiles", +"ID пользователей(я) Viber": "Viber User(s) ID", +"Библиотека: Google Sheets": "Library: Google Sheets", +"ПолучитьИнформациюОКанале": "GetChannelInformation", +"Ноушн_СоздатьИзменитьБазу": "Notion_CreateEditDatabase", +"Идентификатор комментария": "Comment identifier", +"Создает пост с картинками": "Creates a post with images", +"Получить календарь списка": "Get list calendar", +"Отменить публикацию папки": "Unpublish folder", +"ВыполнитьОбработкуКоманды": "ExecuteCommandProcessing", +"РаботаСФайламиИКаталогами": "FileAndDirectoryManagement", +"Удалить товар из подборки": "Remove product from selection", +"Создает новую базу данных": "Creates a new database", +"Telegram_УстановитьWebhook": "Telegram_SetWebhook", "УдалитьПустыеКлючиЗначения": "RemoveEmptyKeyValues", -"СоздатьРекламноеОбъявление": "CreateAd", -"Получить информацию о боте": "Get bot information", -"Число знаков после запятой": "Number of decimal places", -"Описание тестового события": "TestEventDescription", -"ГК_СоздатьУдалитьКалендарь": "GC_CreateDeleteCalendar", -"ГД_ПолучитьСписокКаталогов": "GD_GetCatalogList", "МинимальныйРазмерДляПотока": "MinimumStreamSize", -"Получает схему таблиц базы": "Gets the schema of base tables", -"УдалитьПустыеПоляКоллекции": "RemoveEmptyCollectionFields", -"КраткоеПредставлениеОшибки": "BriefErrorRepresentation", -"Наименование новой таблицы": "New table name", "ЧислоСтандартныхПараметров": "NumberOfStandardParameters", +"Телеграм_УстановитьWebhook": "Telegram_SetWebhook", +"ПолучитьЗначенияРекурсивно": "GetValuesRecursively", +"ВывестиСправкуПоПараметрам": "DisplayParameterHelp", +"ОжидатьЗавершенияОбработки": "WaitForProcessingCompletion", +"Мне больше нравится желтый": "I like yellow more", +"ЯДиск_ЗагрузитьУдалитьФайл": "YDisk_UploadDeleteFile", +"Telegram_ОтправитьКартинку": "Telegram_SendPicture", +"Наименование новой таблицы": "New table name", +"ГД_ПолучитьСписокКаталогов": "GD_GetCatalogList", +"Число знаков после запятой": "Number of decimal places", +"ПолучитьДанныеПользователя": "GetUserData", +"СлужебныеПроцедурыИФункции": "ServiceProceduresAndFunctions", +"Получает комментарий по ID": "Gets comment by ID", +"ПолучитьСписокКомментариев": "GetCommentList", +"СформироватьЗначенияВыбора": "FormSelectionValues", +"Получает схему таблиц базы": "Gets the schema of base tables", +"ГТ_ЗаполнитьОчиститьЯчейки": "GT_FillClearCells", +"ВывестиСообщениеИсключения": "DisplayExceptionMessage", +"Получить список календарей": "Get list of calendars", +"Ноушн_СоздатьСтраницуВБазу": "Notion_CreatePageInDatabase", "ПолучитьРезультатОбработки": "GetProcessingResult", +"Массив соответствий файлов": "Array of file mappings", +"Telegram_УдалитьТемуФорума": "Telegram_DeleteForumTopic", +"Telegram_ОткрытьТемуФорума": "Telegram_OpenForumTopic", +"Telegram_ЗакрытьТемуФорума": "Telegram_CloseForumTopic", +"Telegram_СоздатьТемуФорума": "Telegram_CreateForumTopic", +"Добавляет товар в подборку": "Adds a product to the selection", +"Слак_ПолучитьСписокКаналов": "Slack_GetChannelList", +"ЯДиск_ПолучитьСписокФайлов": "YDisk_GetFileList", "Telegram_ОтправитьДокумент": "Telegram_SendDocument", "Телеграм_ОтправитьДокумент": "Telegram_SendDocument", -"Сформировать блок картинку": "Generate image block", -"Получить категории товаров": "Get product categories", -"Telegram_ОтправитьКартинку": "Telegram_SendPicture", +"Описание тестового события": "TestEventDescription", "Телеграм_ОтправитьКартинку": "Telegram_SendImage", -"ОбработатьТабуляциюСправки": "HandleHelpTabulation", -"Telegram_УстановитьWebhook": "Telegram_SetWebhook", -"Телеграм_УстановитьWebhook": "Telegram_SetWebhook", -"ЗаполнитьПоляЗапросаТовара": "FillProductRequestFields", -"Получить статистику постов": "Get post statistics", -"Добавляет товар в подборку": "Adds a product to the selection", -"Создать рекламную кампанию": "Create advertising campaign", -"Ноушн_СоздатьСтраницуВБазу": "Notion_CreatePageInDatabase", -"ДобавитьПользователяКФайлу": "AddUserToFile", -"Массив соответствий файлов": "Array of file mappings", -"Получает комментарий по ID": "Gets comment by ID", -"Telegram_СоздатьТемуФорума": "Telegram_CreateForumTopic", -"Telegram_ЗакрытьТемуФорума": "Telegram_CloseForumTopic", -"ПолучитьЗначенияРекурсивно": "GetValuesRecursively", -"Telegram_ОткрытьТемуФорума": "Telegram_OpenForumTopic", -"ОжидатьЗавершенияОбработки": "WaitForProcessingCompletion", -"Dropbox_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL", -"ГТ_ЗаполнитьОчиститьЯчейки": "GT_FillClearCells", -"ДропБокс_СоздатьУдалитьТег": "Dropbox_CreateDeleteTag", -"ЯДиск_ПолучитьСписокФайлов": "YDisk_GetFileList", -"ЯДиск_ЗагрузитьУдалитьФайл": "YDisk_UploadDeleteFile", -"ID оригинального сообщения": "Original message ID", -"Проверка_ВККартинкаАльбома": "Check_VKAlbumPicture", -"ВывестиСообщениеИсключения": "DisplayExceptionMessage", -"ПолучитьСписокКомментариев": "GetCommentList", -"Получить информацию о базе": "Get database info", -"Создать ссылку-приглашение": "Create invitation link", -"Изменить свойства страницы": "Edit page properties", -"Структура Из КлючИЗначение": "Structure of Key-Value", -"СлужебныеПроцедурыИФункции": "ServiceProceduresAndFunctions", -"Путь сохранения на Dropbox": "Save path on Dropbox", "Скрыть главную тему форума": "Hide main forum thread", -"ВывестиСправкуПоПараметрам": "DisplayParameterHelp", -"СлужебныеПроцедурыИфункции": "ServiceProceduresAndFunctions", -"Получить список календарей": "Get list of calendars", -"разрешение на методы Drive": "Drive methods permission", -"НормализоватьТекстовыйВвод": "NormalizeTextInput", -"Проверка_ТелеграмПереслать": "Check_TelegramForward", "Очищает значение в ячейках": "Clears the value in cells", -"Получить информацию канала": "Get channel info", -"Создать\/Архивировать канал": "Create\/Archive channel", -"Мне больше нравится желтый": "I like yellow more", -"ПреобразоватьВариантВыбора": "ConvertSelectionOption", -"ПолучитьДанныеПользователя": "GetUserData", +"НормализоватьТекстовыйВвод": "NormalizeTextInput", +"СоздатьРекламноеОбъявление": "CreateAd", +"Dropbox_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL", +"ДропБокс_СоздатьУдалитьТег": "Dropbox_CreateDeleteTag", +"Получить категории товаров": "Get product categories", "Dropbox_ПолчитьСписокТегов": "Dropbox_GetTagList", -"ПреобразоватьПользователей": "ConvertUsers", -"Проверка_ТелеграмСообщение": "Check_TelegramMessage", +"ЗаполнитьПоляЗапросаТовара": "FillProductRequestFields", +"Получить информацию о боте": "Get bot information", +"Структура Из КлючИЗначение": "Structure of Key-Value", +"ID оригинального сообщения": "Original message ID", +"Проверка_ТелеграмПереслать": "Check_TelegramForward", +"УдалитьПустыеПоляКоллекции": "RemoveEmptyCollectionFields", +"Создать рекламную кампанию": "Create advertising campaign", +"ДобавитьПользователяКФайлу": "AddUserToFile", +"Сформировать блок картинку": "Generate image block", +"разрешение на методы Drive": "Drive methods permission", "ПолучитьИмяВременногоФайла": "GetTempFileName", +"Проверка_ТелеграмСообщение": "Check_TelegramMessage", +"Получить статистику постов": "Get post statistics", +"ОбработатьТабуляциюСправки": "HandleHelpTabulation", +"ПреобразоватьВариантВыбора": "ConvertSelectionOption", +"Путь сохранения на Dropbox": "Save path on Dropbox", +"Получить информацию канала": "Get channel info", +"Получить информацию о базе": "Get database info", +"Изменить свойства страницы": "Edit page properties", +"ПреобразоватьПользователей": "ConvertUsers", +"Создать ссылку-приглашение": "Create invitation link", +"СлужебныеПроцедурыИфункции": "ServiceProceduresAndFunctions", +"КраткоеПредставлениеОшибки": "BriefErrorRepresentation", +"Проверка_ВККартинкаАльбома": "Check_VKAlbumPicture", +"Создать\/Архивировать канал": "Create\/Archive channel", "Получить код подтверждения": "Get confirmation code", -"СформироватьЗначенияВыбора": "FormSelectionValues", -"Создает историю из картинки": "Creates a story from an image", -"Телеграм_ПереслатьСообщение": "Telegram_ForwardMessage", -"Telegram_ПереслатьСообщение": "Telegram_ForwardMessage", -"ДобавитьПользователейКФайлу": "AddUsersToFile", -"ВК_ПолучитьСтатистикуПостов": "VK_GetPostStatistics", -"ВК_СохранитьУдалитьКартинку": "VK_SaveDeleteImage", -"Создать\/Удалить тему форума": "Create\/Delete forum topic", -"Ключ > ID, Значение > Emoji": "Key > ID, Value > Emoji", -"ВК_СоздатьРекламнуюКампанию": "VK_CreateAdCampaign", -"НастройкиСовместногоДоступа": "SharedAccessSettings", -"Массив каналов для отправки": "Array of channels for sending", -"Библиотека: Google Calendar": "Library: Google Calendar", -"ЗащищенноеСоединениеOpenSSL": "SecureConnectionOpenSSL", -"ВК_ПолучитьКатегорииТоваров": "VK_GetProductCategories", -"ID целевой стены или группы": "ID of the target wall or group", -"ЗаписатьБуферДвоичныхДанных": "WriteBinaryDataBuffer", -"ID альбома, если необходимо": "Album ID, if necessary", -"ID стены расположения поста": "ID of the wall where the post is located", -"ДобавитьПользователейКПапке": "AddUsersToFolder", -"ВК_СоздатьТоварСоСвойствами": "VK_CreateProductWithProperties", -"Telegram_ИзменитьТемуФорума": "Telegram_EditForumTopic", -"СформироватьМассивИменЯчеек": "FormCellNameArray", -"ОтправитьТекстовоеСообщение": "SendTextMessage", -"Добавить календарь в список": "Add calendar to list", -"VK_СохранитьКартинкуВАльбом": "VK_SavePictureToAlbum", -"Удалить картинку из альбома": "Deletes an image from the album", -"Telegram_ОткрепитьСообщение": "Telegram_UnpinMessage", -"Изменить наименование книги": "ChangeBookName", -"Telegram_ЗакрепитьСообщение": "Telegram_PinMessage", -"Сохранить картинку в альбом": "Save image to album", -"ГК_ПолучитьСписокКалендарей": "GC_GetCalendarList", -"СформироватьОписаниеТаблицы": "GenerateTableDescription", -"Создать\/Удалить кооментарий": "Create\/Delete Comment", -"ПолучитьСписокВерсийОбъекта": "GetObjectVersionList", -"ЗаписатьПараметрыМультипарт": "WriteMultipartParameters", -"ПолучитьСписокПользователей": "GetUserList", -"ДропБокс_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL", -"Получить информацию о диске": "Get disk information", -"Массив соответствий товаров": "Array of product matches", -"ПолучитьМетаданныеКалендаря": "GetCalendarMetadata", -"Разложить JSON на параметры": "Parse JSON to Parameters", -"Удалить календарь из списка": "Remove calendar from list", -"ИзменитьМетаданныеКалендаря": "EditCalendarMetadata", -"Отменить публикацию объекта": "Unpublish object", -"Очистить основной календарь": "Clear primary calendar", -"Путь к публикуемому объекту": "Path to the object to be published", -"ПолучитьИнформациюОбОбъекте": "GetObjectInformation", -"УправлениеПубличнымДоступом": "ManagePublicAccess", -"Проверка_ДропБоксМетаданные": "Check_DropboxMetadata", -"ПолучитьСтатусЗагрузкиПоURL": "GetUploadStatusByURL", -"Создет новое поле в таблице": "Creates a new field in the table", -"ПреобразоватьЗначениеПоТипу": "ConvertValueByType", -"URL для перехода в браузере": "URL for browser transition", -"Получить ссылку авторизации": "Get authorization link", -"Отправить\/Удалить эфемерное": "Send\/Delete ephemeral", -"ПолучитьОнлайнПользователей": "GetOnlineUsers", -"Отправить\/Удалить сообщение": "Send\/Delete message", -"ПолучитьСсылкуДляСкачивания": "GetDownloadLink", -"Путь к файлу для скачивания": "Path to the file for downloading", -"разрешение на методы Sheets": "Sheets methods permission", -"ОтправитьЭфемерноеСообщение": "SendEphemeralMessage", -"Тип отправляемого сообщения": "TypeOfSentMessage", -"URL для кнопки под историей": "URL for button under the story", -"Временная отметка сообщения": "Message timestamp", -"ПолучитьСписокВнешнихФайлов": "GetExternalFileList", -"Создать товар со свойствами": "Create product with properties", -"Загрузить по URL и получить": "Upload by URL and get", -"Получает информацию о файле": "Gets information about the file", -"Telegram_ПолучитьОбновления": "Telegram_GetUpdates", -"Телеграм_ПолучитьОбновления": "Telegram_GetUpdates", -"Твиттер_СоздатьТвитСОпросом": "Twitter_CreateTweetWithPoll", -"ДобавитьПараметрФлагКоманды": "AddCommandFlagParameter", -"ВыгнатьПользователяИзКанала": "KickUserFromChannel", -"Код со страницы авторизации": "Code from the authorization page", +"ГК_СоздатьУдалитьКалендарь": "GC_CreateDeleteCalendar", "Ноушн_ПолучитьПользователей": "Notion_GetUsers", "ВернутьСтандартныеПараметры": "ReturnStandardParameters", -"Массив соответствий событий": "Array of event mappings", "Слак_ПолучитьСписокОбластей": "Slack_GetRegionList", -"Получить данные пользователя": "Get user data", -"Библиотека: Google Workspace": "Library: Google Workspace", -"ПолучитьСписокИконокАватаров": "GetAvatarIconList", -"ПодробноеПредставлениеОшибки": "DetailedErrorRepresentation", -"Создает новую таблицу в базе": "Creates a new table in the base", -"РаботаСМетаданнымиКалендарей": "CalendarMetadataManagement", -"Твиттер_СоздатьТекстовыйТвит": "Twitter_CreateTextTweet", -"JSON массива описаний блоков": "JSON array of block descriptions", -"Получить ссылку на сообщение": "Get message link", -"URL картинки иконки страницы": "URL of the page icon image", -"C:\\GDrive\\Мой диск\\data.json": "C:\\GDrive\\My Drive\\data.json", -"Получает описание поля с URL": "Gets the description of a URL field", -"Добавляет новый внешний файл": "Adds a new external file", -"Создать рекламное объявление": "Create advertising post", -"Массив соответствий подборок": "Array of selection matches", +"Массив каналов для отправки": "Array of channels for sending", +"Telegram_ИзменитьТемуФорума": "Telegram_EditForumTopic", +"Проверка_ДропБоксМетаданные": "Check_DropboxMetadata", +"Создает историю из картинки": "Creates a story from an image", +"Удалить календарь из списка": "Remove calendar from list", +"ПолучитьСсылкуДляСкачивания": "GetDownloadLink", +"ОтправитьЭфемерноеСообщение": "SendEphemeralMessage", +"Создать\/Удалить кооментарий": "Create\/Delete Comment", +"Путь к файлу для скачивания": "Path to the file for downloading", +"ЗащищенноеСоединениеOpenSSL": "SecureConnectionOpenSSL", +"Библиотека: Google Calendar": "Library: Google Calendar", +"ВК_ПолучитьСтатистикуПостов": "VK_GetPostStatistics", +"Добавить календарь в список": "Add calendar to list", +"ПолучитьОнлайнПользователей": "GetOnlineUsers", +"Получить информацию о диске": "Get disk information", +"Отправить\/Удалить сообщение": "Send\/Delete message", +"Отправить\/Удалить эфемерное": "Send\/Delete ephemeral", +"ДобавитьПараметрФлагКоманды": "AddCommandFlagParameter", +"ЗаписатьБуферДвоичныхДанных": "WriteBinaryDataBuffer", +"ПолучитьСписокПользователей": "GetUserList", +"Твиттер_СоздатьТвитСОпросом": "Twitter_CreateTweetWithPoll", +"ВК_ПолучитьКатегорииТоваров": "VK_GetProductCategories", +"Изменить наименование книги": "ChangeBookName", +"Временная отметка сообщения": "Message timestamp", +"ДобавитьПользователейКПапке": "AddUsersToFolder", +"VK_СохранитьКартинкуВАльбом": "VK_SavePictureToAlbum", +"ОтправитьТекстовоеСообщение": "SendTextMessage", +"ВК_СохранитьУдалитьКартинку": "VK_SaveDeleteImage", +"ВыгнатьПользователяИзКанала": "KickUserFromChannel", +"Получает информацию о файле": "Gets information about the file", +"Массив соответствий товаров": "Array of product matches", +"URL для кнопки под историей": "URL for button under the story", +"ПреобразоватьЗначениеПоТипу": "ConvertValueByType", +"Телеграм_ПолучитьОбновления": "Telegram_GetUpdates", +"Код со страницы авторизации": "Code from the authorization page", +"ВК_СоздатьТоварСоСвойствами": "VK_CreateProductWithProperties", +"Telegram_ПолучитьОбновления": "Telegram_GetUpdates", +"Сохранить картинку в альбом": "Save image to album", +"Тип отправляемого сообщения": "TypeOfSentMessage", +"ИзменитьМетаданныеКалендаря": "EditCalendarMetadata", +"Создать\/Удалить тему форума": "Create\/Delete forum topic", +"Массив соответствий событий": "Array of event mappings", +"ДропБокс_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL", +"Создет новое поле в таблице": "Creates a new field in the table", +"СформироватьМассивИменЯчеек": "FormCellNameArray", +"Создать товар со свойствами": "Create product with properties", +"ID стены расположения поста": "ID of the wall where the post is located", +"ДобавитьПользователейКФайлу": "AddUsersToFile", +"ID целевой стены или группы": "ID of the target wall or group", +"ПолучитьСтатусЗагрузкиПоURL": "GetUploadStatusByURL", +"ПолучитьМетаданныеКалендаря": "GetCalendarMetadata", +"ПолучитьСписокВнешнихФайлов": "GetExternalFileList", +"разрешение на методы Sheets": "Sheets methods permission", +"ГК_ПолучитьСписокКалендарей": "GC_GetCalendarList", +"СформироватьОписаниеТаблицы": "GenerateTableDescription", +"ВК_СоздатьРекламнуюКампанию": "VK_CreateAdCampaign", +"Получить ссылку авторизации": "Get authorization link", +"НастройкиСовместногоДоступа": "SharedAccessSettings", +"Telegram_ОткрепитьСообщение": "Telegram_UnpinMessage", +"Telegram_ЗакрепитьСообщение": "Telegram_PinMessage", +"Ключ > ID, Значение > Emoji": "Key > ID, Value > Emoji", +"ПолучитьИнформациюОбОбъекте": "GetObjectInformation", +"URL для перехода в браузере": "URL for browser transition", +"Очистить основной календарь": "Clear primary calendar", +"Телеграм_ПереслатьСообщение": "Telegram_ForwardMessage", +"Удалить картинку из альбома": "Deletes an image from the album", +"ЗаписатьПараметрыМультипарт": "WriteMultipartParameters", +"Telegram_ПереслатьСообщение": "Telegram_ForwardMessage", +"ПолучитьСписокВерсийОбъекта": "GetObjectVersionList", +"ID альбома, если необходимо": "Album ID, if necessary", +"Загрузить по URL и получить": "Upload by URL and get", +"Разложить JSON на параметры": "Parse JSON to Parameters", +"Отменить публикацию объекта": "Unpublish object", +"Путь к публикуемому объекту": "Path to the object to be published", +"УправлениеПубличнымДоступом": "ManagePublicAccess", "Время ожидания новых событий": "Waiting time for new events", -"УдалитьВариантСвойстваТовара": "DeleteProductPropertyVariant", "Обсуждаем: какой цвет лучше?": "Discussing: Which color is better?", -"Получает информацию о канале": "Gets information about the channel", -"ГД_СоздатьУдалитьКомментарий": "GD_CreateDeleteComment", -"ПреобразоватьBase64ВДвоичные": "ConvertBase64ToBinary", -"Проверка_ТелеграмПриглашение": "Check_TelegramInvitation", -"Слак_ПолучитьИнформациюОБоте": "Slack_GetBotInfo", -"JSON файлов или путь к .json": "File JSON or path to .json", -"Отправить группу медиафайлов": "Send media group", -"ГВ_ПолучитьСсылкуАвторизации": "GV_GetAuthorizationLink", -"Проверка_ТелеграмМедиагруппа": "Check_TelegramMediaGroup", -"ПреобразоватьПараметрВСтроку": "ConvertParameterToString", -"ПолучитьЗаголовокАвторизации": "GetAuthorizationHeader", -"Добавляет новый лист в книгу": "Adds a new sheet to the book", -"Получить список файлов папки": "Get list of folder files", -"СледующаяВложенностьДоступна": "NextNestingAvailable", -"Получить список комментариев": "Get list of comments", -"Эти токены обновлять не надо": "These tokens do not need to be updated", -"ПолучитьИнформациюОбАккаунте": "GetAccountInformation", -"СоздатьСсылкуПолученияТокена": "CreateTokenRetrievalLink", -"ИзменитьИмяГлавнойТемыФорума": "EditMainForumTopicName", -"Массив сформированных кнопок": "Array of formed buttons", -"УдалитьПустыеЭлементыМассива": "RemoveEmptyArrayElements", -"Показать главную тему форума": "Show main forum thread", -"Восстановить объект к версии": "Restore object to version", -"Получить список внеш. файлов": "Get external file list", -"Загрузить\/Удалить внеш. файл": "Upload\/Delete external file", -"ПолучитьСтандартныеПараметры": "GetStandardParameters", -"Получить информацию о канале": "Get channel information", "Скрывает главную тему форума": "Hides the main forum thread", -"Скрыть\/Показать главную тему": "Hide\/Show main topic", +"Создает новую таблицу в базе": "Creates a new table in the base", +"Получить список комментариев": "Get list of comments", +"Массив сформированных кнопок": "Array of formed buttons", +"ПолучитьСписокИконокАватаров": "GetAvatarIconList", "HEX цвет кнопок с # в начале": "HEX color of buttons with # at the beginning", +"Твиттер_СоздатьТекстовыйТвит": "Twitter_CreateTextTweet", +"СоздатьСсылкуПолученияТокена": "CreateTokenRetrievalLink", +"ПолучитьИнформациюОбАккаунте": "GetAccountInformation", +"Восстановить объект к версии": "Restore object to version", +"ПреобразоватьBase64ВДвоичные": "ConvertBase64ToBinary", +"ГД_СоздатьУдалитьКомментарий": "GD_CreateDeleteComment", +"Получить список файлов папки": "Get list of folder files", +"Проверка_ТелеграмМедиагруппа": "Check_TelegramMediaGroup", +"Добавляет новый внешний файл": "Adds a new external file", +"УдалитьПустыеЭлементыМассива": "RemoveEmptyArrayElements", +"Создать рекламное объявление": "Create advertising post", +"Показать главную тему форума": "Show main forum thread", +"Получает информацию о канале": "Gets information about the channel", +"Получить данные пользователя": "Get user data", +"Отправить группу медиафайлов": "Send media group", +"JSON файлов или путь к .json": "File JSON or path to .json", +"Получить ссылку на сообщение": "Get message link", +"Скрыть\/Показать главную тему": "Hide\/Show main topic", +"ПодробноеПредставлениеОшибки": "DetailedErrorRepresentation", +"Библиотека: Google Workspace": "Library: Google Workspace", +"УдалитьВариантСвойстваТовара": "DeleteProductPropertyVariant", +"ПреобразоватьПараметрВСтроку": "ConvertParameterToString", +"Проверка_ТелеграмПриглашение": "Check_TelegramInvitation", +"СледующаяВложенностьДоступна": "NextNestingAvailable", +"URL картинки иконки страницы": "URL of the page icon image", +"ПолучитьЗаголовокАвторизации": "GetAuthorizationHeader", +"РаботаСМетаданнымиКалендарей": "CalendarMetadataManagement", +"ИзменитьИмяГлавнойТемыФорума": "EditMainForumTopicName", +"Получает описание поля с URL": "Gets the description of a URL field", +"C:\\GDrive\\Мой диск\\data.json": "C:\\GDrive\\My Drive\\data.json", +"Слак_ПолучитьИнформациюОБоте": "Slack_GetBotInfo", +"Добавляет новый лист в книгу": "Adds a new sheet to the book", +"ГВ_ПолучитьСсылкуАвторизации": "GV_GetAuthorizationLink", +"Получить информацию о канале": "Get channel information", +"Эти токены обновлять не надо": "These tokens do not need to be updated", +"JSON массива описаний блоков": "JSON array of block descriptions", +"Массив соответствий подборок": "Array of selection matches", +"ПолучитьСтандартныеПараметры": "GetStandardParameters", +"Загрузить\/Удалить внеш. файл": "Upload\/Delete external file", +"Получить список внеш. файлов": "Get external file list", "ПолучитьСоответствиеКартинки": "GetImageCorrespondence", -"Получить отложенные сообщения": "Get scheduled messages", -"Отправить текстовое сообщение": "Send text message", -"ПараметрыЗапросаВСоответствие": "RequestParametersToMatch", -"Соответствие Из КлючИЗначение": "Key-Value Pair", -"URL картинки обложки страницы": "URL of the page cover image", -"Телеграм_ОтправитьМедиагруппу": "Telegram_SendMediaGroup", -"Telegram_ОтправитьМеидагруппу": "Telegram_SendMediaGroup", -"ПолучитьСписокРабочихОбластей": "GetWorkspaceList", -"Альтернативный текст картинки": "Alternate text of the image", "Удаляет внешний файл из Slack": "Deletes an external file from Slack", +"Ошибка в данных описания поля": "Error in field description data", +"Альтернативный текст картинки": "Alternate text of the image", +"ДобавитьВариантСвойстваТовара": "AddProductPropertyVariant", +"Твиттер_СоздатьТвитСКартинкой": "Twitter_CreateTweetWithImage", +"Получить отложенные сообщения": "Get scheduled messages", +"ID блока или сам блок образец": "Block ID or block sample itself", +"Удаляет ранее созданный товар": "Deletes a previously created product", +"Соответствие из КлючИЗначение": "Map from KeyAndValue", "JSON описание товара или путь": "JSON description of the product or path", "Получить данные о базе данных": "Get database information", -"Соответствие из КлючИЗначение": "Map from KeyAndValue", -"Закрепить\/Открепить сообщение": "Pin\/Unpin message", -"Получить онлайн пользователей": "Get online users", "ID подборки, если нужен отбор": "Selection ID, if filtering is needed", -"Проверка_ТелеграмСозданиеТемы": "Check_TelegramCreateTopic", -"ID блока или сам блок образец": "Block ID or block sample itself", -"Изменяет существующее событие": "Edits an existing event", -"Проверка_ДропбоксПространство": "Check_DropboxSpace", -"СформироватьМассивДанныхЯчеек": "FormCellDataArray", -"Получить список пользователей": "Get user list", -"ДобавитьВариантСвойстваТовара": "AddProductPropertyVariant", -"разрешение на методы Calendar": "Calendar methods permission", -"Слак_СоздатьАрхивироватьКанал": "Slack_CreateArchiveChannel", -"ПригласитьПользователейВКанал": "InviteUsersToChannel", -"app_id из настроек приложения": "app_id from application settings", +"СлужебныйПрограммныйИнтерфейс": "ServiceProgramInterface", +"URL картинки обложки страницы": "URL of the page cover image", "СоздатьЗаголовокАвторизацииV2": "CreateAuthorizationHeaderV2", -"Массив соответствий каталогов": "Array of directory mappings", -"Закрывает существующий диалог": "Closes an existing dialog", -"Удаляет ранее созданный товар": "Deletes a previously created product", -"Ноушн_ПолучитьИнформациюОБазе": "Notion_GetDatabaseInfo", -"Ошибка в данных описания поля": "Error in field description data", "Создает твит с видеовложением": "Creates a tweet with a video attachment", "Получить статистику по постам": "Get post statistics", "Добавить пользователя к файлу": "Add user to file", -"Твиттер_СоздатьТвитСКартинкой": "Twitter_CreateTweetWithImage", -"ИзменитьВариантСвойстваТовара": "EditProductPropertyVariant", +"разрешение на методы Calendar": "Calendar methods permission", "СоздатьЗаголовокАвторизацииV1": "CreateAuthorizationHeaderV1", -"СлужебныйПрограммныйИнтерфейс": "ServiceProgramInterface", +"СформироватьМассивДанныхЯчеек": "FormCellDataArray", +"Массив соответствий каталогов": "Array of directory mappings", "Отбор по ID каталога родителя": "Filter by parent directory ID", -"Получает список доступных баз": "Gets the list of available bases", -"Отправить эфемерное сообщение": "Send ephemeral message", -"Получить ссылку на скачивание": "Get download link", +"Получить онлайн пользователей": "Get online users", +"app_id из настроек приложения": "app_id from application settings", "ПолучитьТелоКакДвоичныеДанные": "GetBodyAsBinaryData", -"Слак_ОтправитьУдалитьЭфемерное": "Slack_SendDeleteEphemeral", -"СохранитьПубличныйОбъектНаДиск": "SavePublicObjectToDisk", -"Структура, Массив из Структура": "Structure, Array of Structures", -"Целевой путь создания каталога": "Target path for creating the directory", -"Удаляет файл или каталог по ID": "Deletes file or directory by ID", -"Выгнать пользователя из канала": "Kick user from channel", -"Размер файла в случае отправке": "File size in case of sending", -"Получить список версий объекта": "Get list of object versions", -"ПолучитьСтрокуИзДвоичныхДанных": "GetStringFromBinaryData", -"Идентификатор записи в таблице": "Record identifier in the table", -"УстановитьТелоИзДвоичныхДанных": "SetBodyFromBinaryData", -"ID события календаря источника": "ID of the source calendar event", -"Идентификатор удаляемого листа": "IdentifierOfSheetToDelete", -"ПолучитьСписокКатегорийТоваров": "GetProductCategoryList", -"Путь или набору путей к файлам": "Path or set of paths to the files", -"ДропБокс_ПолучитьОбновитьТокен": "Dropbox_GetUpdateToken", -"Получить список опубликованных": "Get published list", -"Получить список внешних файлов": "Get list of external files", -"Получить описание файла !NOCLI": "Get file description !NOCLI", +"Закрывает существующий диалог": "Closes an existing dialog", +"Получить ссылку на скачивание": "Get download link", +"ПараметрыЗапросаВСоответствие": "RequestParametersToMatch", +"Проверка_ДропбоксПространство": "Check_DropboxSpace", +"Telegram_ОтправитьМеидагруппу": "Telegram_SendMediaGroup", +"Телеграм_ОтправитьМедиагруппу": "Telegram_SendMediaGroup", +"Получает список доступных баз": "Gets the list of available bases", +"Проверка_ТелеграмСозданиеТемы": "Check_TelegramCreateTopic", +"Соответствие Из КлючИЗначение": "Key-Value Pair", +"Отправить эфемерное сообщение": "Send ephemeral message", +"Слак_СоздатьАрхивироватьКанал": "Slack_CreateArchiveChannel", +"Ноушн_ПолучитьИнформациюОБазе": "Notion_GetDatabaseInfo", +"ПолучитьСписокРабочихОбластей": "GetWorkspaceList", +"Отправить текстовое сообщение": "Send text message", +"ИзменитьВариантСвойстваТовара": "EditProductPropertyVariant", +"ПригласитьПользователейВКанал": "InviteUsersToChannel", +"Изменяет существующее событие": "Edits an existing event", +"Получить список пользователей": "Get user list", +"Закрепить\/Открепить сообщение": "Pin\/Unpin message", "Ноушн_ИзменитьСвойстваСтраницы": "Notion_EditPageProperties", -"Слак_ОтправитьУдалитьСообщение": "Slack_SendDeleteMessage", -"СформироватьСтрокуВызоваМетода": "FormMethodCallString", -"Изменяет ранее созданный товар": "Edits a previously created product", -"Получить информацию о странице": "Get page info", "Создать\/Удалить составной пост": "Create\/Delete composite post", +"Получить описание файла !NOCLI": "Get file description !NOCLI", +"ТолстыйКлиентОбычноеПриложение": "ThickClientOrdinaryApplication", +"JSON описания или путь к .json": "JSON description or path to .json", +"Идентификатор удаляемого листа": "IdentifierOfSheetToDelete", +"Слак_ОтправитьУдалитьЭфемерное": "Slack_SendDeleteEphemeral", +"Слак_ОтправитьУдалитьСообщение": "Slack_SendDeleteMessage", +"Выгнать пользователя из канала": "Kick user from channel", +"СформироватьСтрокуВызоваМетода": "FormMethodCallString", +"ДропБокс_ПолучитьОбновитьТокен": "Dropbox_GetUpdateToken", +"ПолучитьСтрокуИзДвоичныхДанных": "GetStringFromBinaryData", +"МаксимальныйУровеньВложенности": "MaximumNestingLevel", +"ID события календаря источника": "ID of the source calendar event", +"Получить список опубликованных": "Get published list", +"УстановитьТелоИзДвоичныхДанных": "SetBodyFromBinaryData", +"Получить информацию о странице": "Get page info", +"Удаляет файл или каталог по ID": "Deletes file or directory by ID", +"ПолучитьСписокКатегорийТоваров": "GetProductCategoryList", +"Получить ссылку для скачивания": "Get download link", +"ЯДиск_ПолучитьИнформациюОДиске": "YDisk_GetDiskInfo", +"Изменяет ранее созданный товар": "Edits a previously created product", +"СохранитьПубличныйОбъектНаДиск": "SavePublicObjectToDisk", +"Получить список версий объекта": "Get list of object versions", +"Получить информацию об объекте": "Get object information", +"Размер файла в случае отправке": "File size in case of sending", +"Структура, Массив из Структура": "Structure, Array of Structures", "ПолучитьДвоичныеДанныеИзСтроки": "GetBinaryDataFromString", "ЗаполнитьПараметрыЗагрузкиФото": "FillPhotoUploadParameters", -"JSON описания или путь к .json": "JSON description or path to .json", -"ЯДиск_ПолучитьИнформациюОДиске": "YDisk_GetDiskInfo", -"Получить ссылку для скачивания": "Get download link", +"Путь или набору путей к файлам": "Path or set of paths to the files", +"Получить список внешних файлов": "Get list of external files", "УправлениеСостояниемТемыФорума": "ManageForumThreadState", -"МаксимальныйУровеньВложенности": "MaximumNestingLevel", -"Получить информацию об объекте": "Get object information", +"Идентификатор записи в таблице": "Record identifier in the table", "Добавить пользователей к папке": "Add users to folder", -"Нельзя замешивать разные типы!": "Different types cannot be mixed!", "Удаляет ранее созданный альбом": "Deletes a previously created album", -"Получить информацию об аккаунте": "Get account information", -"Массив из Строка,ДвоичныеДанные": "Array from String, BinaryData", -"ПолучитьСписокСобытийРекурсивно": "GetEventsListRecursively", -"только конкретному пользователю": "only to a specific user", -"Создает пустой каталог на диске": "Creates an empty directory on the drive", -"Отправка в канал или в чат бота": "Sending to channel or bot chat", -"Удалить вариант свойства товара": "Delete product property variant", -"Telegram_ПолучитьИнформациюБота": "Telegram_GetBotInformation", -"ID чата оригинального сообщения": "Chat ID of the original message", -"Получает список каталогов диска": "Gets the list of drive directories", -"Создать ссылку получения токена": "Create token retrieval link", -"Загружает файл на сервера Slack": "Uploads a file to Slack servers", -"Проверка_ДропБоксПубличнаяПапка": "Check_DropboxPublicFolder", -"Создает пустую подборку товаров": "Creates an empty product selection", -"ПолучитьСписокЗаказовРекурсивно": "GetOrderListRecursively", -"СформироватьСсылкуПолученияКода": "FormCodeRetrievalLink", -"Загружает файл на облачный диск": "Uploads a file to the cloud drive", -"Двоичные данные или пути к фото": "Binary Data or Photo Paths", -"Удаляет текущего бота из канала": "Removes the current bot from the channel", -"Добавляет текущего бота в канал": "Adds the current bot to the channel", -"Создает твит с вложением-гифкой": "Creates a tweet with a gif attachment", -"VK_СоздатьСсылкуПолученияТокена": "VK_CreateTokenRetrievalLink", -"Проверка_ДропбоксПубличнаяПапка": "Check_DropboxPublicFolder", -"Получает информацию об аккаунте": "Gets account information", -"Целевой путь для нового объекта": "Target path for the new object", -"Проверка_ТелеграмУдалениеВебхук": "Check_TelegramWebhookDeletion", -"Телеграм_ИзменитьИмяГлавнойТемы": "Telegram_ChangeMainTopicName", -"Проверка_ТелеграмИнформацияБота": "Check_TelegramBotInformation", -"Обновляет двоичные данные файла": "Updates file binary data", -"Проверка_ТелеграмМестоположение": "Check_TelegramLocation", -"Dropbox_ОтменитьПубликациюФайла": "Dropbox_CancelFilePublication", -"Dropbox_ОтменитьПубликациюПапки": "Dropbox_CancelFolderPublication", -"ПолучитьСписокТоваровРекурсивно": "GetProductListRecursively", -"ПреобразоватьМножественныйВыбор": "ConvertMultipleChoice", -"См.ПолучитьСтандартныеПараметры": "See GetStandardParameters", -"Получить ссылку для авторизации": "Get authorization link", -"Copyright (c) 2019, ООО 1С-Софт": "Copyright (c) 2019, LLC 1C-Soft", +"Целевой путь создания каталога": "Target path for creating the directory", +"Нельзя замешивать разные типы!": "Different types cannot be mixed!", "Не удалось записать файл лога!:": "Failed to write log file!:", -"Функция вернула пустое значение": "Function Returned Empty Value", -"Получить список аватаров форума": "Get forum avatars list", -"ПарсерАргументовКоманднойСтроки": "CommandLineArgumentParser", -"Путь назначение для перемещения": "Destination path for moving", -"ЯДиск_ДействияПубличныхОбъектов": "YDisk_PublicObjectActions", -"Двоичные данные или путь к фото": "Binary data or path to photo", -"Получает значения ячеек таблицы": "Gets cell values of the table", +"Dropbox_ОтменитьПубликациюПапки": "Dropbox_CancelFolderPublication", +"Создает твит с вложением-гифкой": "Creates a tweet with a gif attachment", "Получить статус загрузки по URL": "Get upload status by URL", +"Получает значения ячеек таблицы": "Gets cell values of the table", +"Получает список каталогов диска": "Gets the list of drive directories", +"Dropbox_ОтменитьПубликациюФайла": "Dropbox_CancelFilePublication", "Телеграм_ПолучитьИнформациюБота": "Telegram_GetBotInfo", +"Telegram_ПолучитьИнформациюБота": "Telegram_GetBotInformation", +"Функция вернула пустое значение": "Function Returned Empty Value", +"Телеграм_ИзменитьИмяГлавнойТемы": "Telegram_ChangeMainTopicName", +"Целевой путь для нового объекта": "Target path for the new object", +"СформироватьСсылкуПолученияКода": "FormCodeRetrievalLink", +"Массив из Строка,ДвоичныеДанные": "Array from String, BinaryData", +"Получить список аватаров форума": "Get forum avatars list", +"Проверка_ТелеграмУдалениеВебхук": "Check_TelegramWebhookDeletion", +"ПолучитьСписокЗаказовРекурсивно": "GetOrderListRecursively", +"Удалить вариант свойства товара": "Delete product property variant", +"ПреобразоватьМножественныйВыбор": "ConvertMultipleChoice", +"Создает пустую подборку товаров": "Creates an empty product selection", "Получить список иконок-аватаров": "Get avatar icon list", "Действия с публичными объектами": "Actions with public objects", -"Массив ячеек вида А1 для очистки": "Array of cells like A1 to be cleared", -"Получает список подборок товаров": "Gets the list of product selections", -"Слак_ПолучитьОтложенныеСообщения": "Slack_GetScheduledMessages", -"Количество возвращаемых объектов": "Number of returned objects", -"См.ДобавитьВариантСвойстваТовара": "See AddPropertyVariant", -"ПолучитьСписокОтветовНаСообщение": "GetMessageReplyList", +"Получить информацию об аккаунте": "Get account information", +"Получает информацию об аккаунте": "Gets account information", +"Двоичные данные или пути к фото": "Binary Data or Photo Paths", +"Двоичные данные или путь к фото": "Binary data or path to photo", +"только конкретному пользователю": "only to a specific user", +"Проверка_ДропбоксПубличнаяПапка": "Check_DropboxPublicFolder", +"Получить ссылку для авторизации": "Get authorization link", +"См.ПолучитьСтандартныеПараметры": "See GetStandardParameters", +"ПолучитьСписокСобытийРекурсивно": "GetEventsListRecursively", +"Путь назначение для перемещения": "Destination path for moving", +"Загружает файл на облачный диск": "Uploads a file to the cloud drive", +"ПолучитьСписокТоваровРекурсивно": "GetProductListRecursively", +"Проверка_ТелеграмМестоположение": "Check_TelegramLocation", +"VK_СоздатьСсылкуПолученияТокена": "VK_CreateTokenRetrievalLink", +"ID чата оригинального сообщения": "Chat ID of the original message", +"Проверка_ТелеграмИнформацияБота": "Check_TelegramBotInformation", +"Добавляет текущего бота в канал": "Adds the current bot to the channel", +"Проверка_ДропБоксПубличнаяПапка": "Check_DropboxPublicFolder", +"ЯДиск_ДействияПубличныхОбъектов": "YDisk_PublicObjectActions", +"ПарсерАргументовКоманднойСтроки": "CommandLineArgumentParser", +"Создать ссылку получения токена": "Create token retrieval link", +"Copyright (c) 2019, ООО 1С-Софт": "Copyright (c) 2019, LLC 1C-Soft", +"Создает пустой каталог на диске": "Creates an empty directory on the drive", +"Загружает файл на сервера Slack": "Uploads a file to Slack servers", +"Удаляет текущего бота из канала": "Removes the current bot from the channel", +"Обновляет двоичные данные файла": "Updates file binary data", +"Отправка в канал или в чат бота": "Sending to channel or bot chat", "Получить описание товара. !NOCLI": "Get product description. !NOCLI", -"Получить описание события !NOCLI": "Get event description !NOCLI", -"ПриостановитьРекламноеОбъявление": "PauseAdvertisingAd", -"Отправка в канал или чат с ботом": "Sending to channel or bot chat", -"Идентификатор изменяемого товара": "Identifier of the product being edited", "Создает страницу в базе-родителе": "Creates a page in the parent database", -"ВыполнитьЗапросСДвоичнымиДанными": "ExecuteRequestWithBinaryData", -"ПолучитьСписокРекламныхКатегорий": "GetAdvertisingCategoryList", +"ОпределитьМетодУправленияФорумом": "DetermineForumManagementMethod", +"ПриостановитьРекламноеОбъявление": "PauseAdvertisingAd", +"Массив ячеек вида А1 для очистки": "Array of cells like A1 to be cleared", "Получить список рабочих областей": "Get workspace list", +"ДобавитьДополнительныеФотоТовара": "AddAdditionalProductPhotos", +"Получает список подборок товаров": "Gets the list of product selections", +"Отправляет гифку в чат или канал": "Sends a GIF to a chat or channel", "Удаляет объект с облачного диска": "Deletes an object from the cloud drive", -"Путь к удаляемой папке или файлу": "Path to the folder or file to be deleted", -"Удаляет объект по заданному пути": "Deletes an object at the specified path", -"Обновляет токен по Refresh token": "Updates token by Refresh token", -"Проверка_ТелеграмУстановкаВебхук": "Check_TelegramWebhookSetup", -"Закрывает или удаляет обсуждение": "Close or delete discussion", -"Слак_ПолучитьСписокПользователей": "Slack_GetUserList", -"Изменяет имя главной темы форума": "Edits the name of the main forum thread", -"Изменить вариант свойства товара": "Edit product property variant", -"Идентификатор файла или каталога": "Identifier of the file or folder", -"Добавить вариант свойства товара": "Add product property variant", -"ЯДиск_ПолучитьСсылкуНаСкачивание": "YDisk_GetDownloadLink", "Вайбер_ПолучитьИнформациюОКанале": "Viber_GetChannelInfo", +"Количество возвращаемых объектов": "Number of returned objects", +"ПолучитьСписокАльбомовРекурсивно": "GetAlbumListRecursively", +"ПолучитьСписокОтветовНаСообщение": "GetMessageReplyList", +"Обновляет токен по Refresh token": "Updates token by Refresh token", +"См.ДобавитьВариантСвойстваТовара": "See AddPropertyVariant", "Получает описание поля типа дата": "Gets the description of a date field", -"Изменить имя главной темы форума": "Edit main forum thread name", +"Массив из Строка, ДвоичныеДанные": "Array from String, BinaryData", +"Загрузить массив вложений !NOCLI": "Upload attachments array !NOCLI", +"Удаляет объект по заданному пути": "Deletes an object at the specified path", +"Путь к удаляемой папке или файлу": "Path to the folder or file to be deleted", +"ВыполнитьЗапросСДвоичнымиДанными": "ExecuteRequestWithBinaryData", +"Идентификатор файла или каталога": "Identifier of the file or folder", +"ЯДиск_ПолучитьСсылкуНаСкачивание": "YDisk_GetDownloadLink", "Телеграм_ОтправитьМестоположение": "Telegram_SendLocation", -"Telegram_ОтправитьМестоположение": "Telegram_SendLocation", +"Изменяет имя главной темы форума": "Edits the name of the main forum thread", +"JSON клавиатуры или путь к .json": "Keyboard JSON or path to .json", +"Ошибка в данных коллекции таблиц": "Error in table collection data", +"См. ПолучитьСписокИконокАватаров": "See GetAvatarIconList", "ПолучитьСписокОбъектовРекурсивно": "GetObjectsListRecursively", "Отправляет видео в чат или канал": "Sends a video to a chat or channel", -"JSON клавиатуры или путь к .json": "Keyboard JSON or path to .json", -"Телеграм_ПолучитьЧислоУчастников": "Telegram_GetMemberCount", -"Telegram_ПолучитьЧислоУчастников": "Telegram_GetParticipantCount", -"Telegram_СкрытьГлавнуюТемуФорума": "Telegram_HideMainForumTopic", -"Отправляет гифку в чат или канал": "Sends a GIF to a chat or channel", -"Ошибка в данных коллекции таблиц": "Error in table collection data", -"ОпределитьМетодУправленияФорумом": "DetermineForumManagementMethod", -"ДобавитьДополнительныеФотоТовара": "AddAdditionalProductPhotos", -"Пригласить пользователей в канал": "Invite users to channel", -"Массив из Строка, ДвоичныеДанные": "Array from String, BinaryData", +"Проверка_ТелеграмУстановкаВебхук": "Check_TelegramWebhookSetup", +"Изменить вариант свойства товара": "Edit product property variant", "Ноушн_ПолучитьДанныеПользователя": "Notion_GetUserData", -"Загрузить массив вложений !NOCLI": "Upload attachments array !NOCLI", -"ПолучитьСписокАльбомовРекурсивно": "GetAlbumListRecursively", -"См. ПолучитьСписокИконокАватаров": "See GetAvatarIconList", -"Открепляет сообщение в шапке чата": "Unpins a message in the chat header", -"Создает опрос с вариантами ответа": "Creates a poll with answer options", -"Dropbox_ВосстановитьОбъектКВерсии": "Dropbox_RestoreObjectToVersion", -"Получить список категорий товаров": "Get a list of product categories", -"Запрос, приходящий на http-сервис": "Request coming to the http service", -"Телеграм_СоздатьСсылкуПриглашение": "Telegram_CreateInvitationLink", -"Telegram_СоздатьСсылкуПриглашение": "Telegram_CreateInviteLink", -"Dropbox_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList", -"ПолучитьСписокПользователейКанала": "GetChannelUserList", -"ПолучитьHexСтрокуИзДвоичныхДанных": "GetHexStringFromBinaryData", -"Телеграм_СоздатьУдалитьТемуФорума": "Telegram_CreateDeleteForumTopic", -"сериализованный JSON ответа от VK": "Serialized JSON response from VK", -"JSON авторизации или путь к .json": "Authorization JSON or path to .json", -"Dropbox_ПолучитьСсылкуАвторизации": "Dropbox_GetAuthorizationLink", -"РежимВосстановленияПутейФайловZIP": "ZIPFilePathRecoveryMode", -"Закрепляет сообщение в шапке чата": "Pins a message in the chat header", -"Скачивает файл по указанному пути": "Downloads a file at the specified path", -"ПолучитьСписокОтложенныхСообщений": "GetDelayedMessageList", -"v1.1. Поэтому что-то нужно делать": "v1.1. Therefore, something needs to be done", -"Ссылка на страницу сайта магазина": "Link to the store's website page", -"ПолучитьДвоичныеДанныеИзHexСтроки": "GetBinaryDataFromHexString", -"Ноушн_ПолучитьИнформациюОСтранице": "Notion_GetPageInfo", -"ПолучитьСоответствиеКомандМодулей": "GetCommandModuleMapping", -"Получает информацию о книге по ID": "Gets information about the book by ID", -"ВыполнитьЗапросМультипартРелэйтед": "ExecuteMultipartRelatedRequest", -"Получает список доступных каналов": "Gets a list of available channels", -"Путь помещения загруженного файла": "Path to place the downloaded file", -"Предпочтительное хранение токенов": "Preferred token storage", +"Добавить вариант свойства товара": "Add product property variant", +"Слак_ПолучитьСписокПользователей": "Slack_GetUserList", +"Telegram_СкрытьГлавнуюТемуФорума": "Telegram_HideMainForumTopic", +"Telegram_ОтправитьМестоположение": "Telegram_SendLocation", +"ПолучитьСписокРекламныхКатегорий": "GetAdvertisingCategoryList", +"Отправка в канал или чат с ботом": "Sending to channel or bot chat", +"Получить описание события !NOCLI": "Get event description !NOCLI", +"Идентификатор изменяемого товара": "Identifier of the product being edited", +"Закрывает или удаляет обсуждение": "Close or delete discussion", +"Пригласить пользователей в канал": "Invite users to channel", +"Telegram_ПолучитьЧислоУчастников": "Telegram_GetParticipantCount", +"Слак_ПолучитьОтложенныеСообщения": "Slack_GetScheduledMessages", +"Телеграм_ПолучитьЧислоУчастников": "Telegram_GetMemberCount", +"Изменить имя главной темы форума": "Edit main forum thread name", "Твиттер_ПолучитьСсылкуАвторизации": "Twitter_GetAuthorizationLink", +"ПолучитьДвоичныеДанныеИзHexСтроки": "GetBinaryDataFromHexString", +"ПолучитьСоответствиеКомандМодулей": "GetCommandModuleMapping", +"Запрос, приходящий на http-сервис": "Request coming to the http service", +"Предпочтительное хранение токенов": "Preferred token storage", +"Скачивает файл по указанному пути": "Downloads a file at the specified path", +"РежимВосстановленияПутейФайловZIP": "ZIPFilePathRecoveryMode", +"JSON авторизации или путь к .json": "Authorization JSON or path to .json", +"Dropbox_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList", +"Путь помещения загруженного файла": "Path to place the downloaded file", +"сериализованный JSON ответа от VK": "Serialized JSON response from VK", +"ПолучитьСписокОтложенныхСообщений": "GetDelayedMessageList", +"Ноушн_ПолучитьИнформациюОСтранице": "Notion_GetPageInfo", +"Получить список категорий товаров": "Get a list of product categories", +"Telegram_СоздатьСсылкуПриглашение": "Telegram_CreateInviteLink", +"Получает информацию о книге по ID": "Gets information about the book by ID", +"Dropbox_ВосстановитьОбъектКВерсии": "Dropbox_RestoreObjectToVersion", +"Телеграм_СоздатьСсылкуПриглашение": "Telegram_CreateInvitationLink", +"ПолучитьHexСтрокуИзДвоичныхДанных": "GetHexStringFromBinaryData", +"v1.1. Поэтому что-то нужно делать": "v1.1. Therefore, something needs to be done", +"Закрепляет сообщение в шапке чата": "Pins a message in the chat header", +"Создает опрос с вариантами ответа": "Creates a poll with answer options", +"Открепляет сообщение в шапке чата": "Unpins a message in the chat header", "Вайбер_ПолучитьДанныеПользователя": "Viber_GetUserData", -"Путь для сохранение файла на Диске": "Path for saving the file to disk", -"Вайбер_ОтправитьТекстовоеСообщение": "Viber_SendTextMessage", -"querry из Telegram.WebApp.initData": "Query from Telegram.WebApp.initData", -"Сохранить публичный объект на диск": "Save public object to disk", -"Телеграм_СкрытьПоказатьГлавнуюТему": "Telegram_HideShowMainTopic", -"СформироватьПараметрыЗагрузкиФайла": "FormFileUploadParameters", -"Telegram_ПоказатьГлавнуюТемуФорума": "Telegram_ShowMainForumTopic", -"Получает описание поля типа булево": "Gets the description of a boolean field", -"Сформировать ссылку получения кода": "Generate code retrieval link", -"ЗаписатьПобитовоеИсключительноеИли": "WriteBitwiseExclusiveOr", -"Получает данные пользователя по ID": "Gets user data by ID", -"ДобавитьИменованныйПараметрКоманды": "AddNamedCommandParameter", -"ID целевого чата или IDЧата*IDТемы": "Target chat ID or ChatID*TopicID", -"ОпределитьМетодЗагрузкиИзображений": "DetermineImageUploadMethod", -"Идентификатор обновляемого объекта": "Identifier of the object to update", -"Текст лицензии доступен по ссылке:": "License text available at:", -"ЯДиск_ПолучитьСписокОпубликованных": "YDisk_GetPublishedList", -"ДобавитьПозиционныйПараметрКоманды": "AddPositionalCommandParameter", -"Соответствие изменяемых параметров": "Matching of editable parameters", -"Вайбер_ПолучитьОнлайнПользователей": "Viber_GetOnlineUsers", -"ОбработатьДанные Telegram Mini App": "Process Telegram Mini App data", -"Закрывает тему для новых сообщений": "Closes the thread for new messages", -"ПолучитьСписокКалендарейРекурсивно": "GetCalendarsListRecursively", -"См. ПолучитьСписокКатегорийТоваров": "See GetProductCategoryList", -"Устанавливает значения ячеек листа": "Sets sheet cell values", -"Временная отметка или ID сообщения": "Timestamp or message ID", -"Получает список товаров сообщества": "Gets the community's product list", -"ДропБокс_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList", -"Приостановить рекламное объявление": "Pause advertising post", +"Получает список доступных каналов": "Gets a list of available channels", +"Dropbox_ПолучитьСсылкуАвторизации": "Dropbox_GetAuthorizationLink", +"ВыполнитьЗапросМультипартРелэйтед": "ExecuteMultipartRelatedRequest", +"Ссылка на страницу сайта магазина": "Link to the store's website page", +"ПолучитьСписокПользователейКанала": "GetChannelUserList", +"Телеграм_СоздатьУдалитьТемуФорума": "Telegram_CreateDeleteForumTopic", "Изменяет свойства подборки товаров": "Edits the properties of a product selection", "Идентификатор объекта для удаления": "Identifier of the object to delete", -"Скачивает файл с серверов Telegram": "Download file from Telegram servers", -"что обсуловлено наличием сразу 2-х": "which is due to the presence of two at once", -"Создает твит с картинкой вложением": "Creates a tweet with an image attachment", -"Массив данных статистики по постам": "Array of post statistics data", +"Получает список товаров сообщества": "Gets the community's product list", +"Закрывает тему для новых сообщений": "Closes the thread for new messages", +"Получает данные пользователя по ID": "Gets user data by ID", +"СформироватьПараметрыЗагрузкиФайла": "FormFileUploadParameters", +"ТолстыйКлиентУправляемоеПриложение": "ThickClientManagedApplication", +"ЗаписатьПобитовоеИсключительноеИли": "WriteBitwiseExclusiveOr", +"Вайбер_ПолучитьОнлайнПользователей": "Viber_GetOnlineUsers", +"Путь для сохранение файла на Диске": "Path for saving the file to disk", +"Временная отметка или ID сообщения": "Timestamp or message ID", +"Текст лицензии доступен по ссылке:": "License text available at:", +"Идентификатор обновляемого объекта": "Identifier of the object to update", "Расширение файла в случае отправки": "File extension in case of sending", -"Получает информацию о внешнем файле": "Gets information about the external file", -"Получает массив календарей аккаунта": "Gets an array of account calendars", -"Наименование создаваемого календаря": "Name of the created calendar", -"Dropbox_ДобавитьПользователейКПапке": "Dropbox_AddUsersToFolder", -"Создает сокращенный URL из обычного": "Creates a shortened URL from a regular one", +"См. ПолучитьСписокКатегорийТоваров": "See GetProductCategoryList", +"Вайбер_ОтправитьТекстовоеСообщение": "Viber_SendTextMessage", +"ЯДиск_ПолучитьСписокОпубликованных": "YDisk_GetPublishedList", +"ID целевого чата или IDЧата*IDТемы": "Target chat ID or ChatID*TopicID", +"Сохранить публичный объект на диск": "Save public object to disk", +"querry из Telegram.WebApp.initData": "Query from Telegram.WebApp.initData", +"Сформировать ссылку получения кода": "Generate code retrieval link", +"ДропБокс_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList", +"ДобавитьИменованныйПараметрКоманды": "AddNamedCommandParameter", +"Приостановить рекламное объявление": "Pause advertising post", +"Получает описание поля типа булево": "Gets the description of a boolean field", +"ПолучитьСписокКалендарейРекурсивно": "GetCalendarsListRecursively", +"ОбработатьДанные Telegram Mini App": "Process Telegram Mini App data", +"Создает твит с картинкой вложением": "Creates a tweet with an image attachment", +"что обсуловлено наличием сразу 2-х": "which is due to the presence of two at once", +"Соответствие изменяемых параметров": "Matching of editable parameters", +"ОпределитьМетодЗагрузкиИзображений": "DetermineImageUploadMethod", +"Телеграм_СкрытьПоказатьГлавнуюТему": "Telegram_HideShowMainTopic", +"Telegram_ПоказатьГлавнуюТемуФорума": "Telegram_ShowMainForumTopic", +"Скачивает файл с серверов Telegram": "Download file from Telegram servers", +"Массив данных статистики по постам": "Array of post statistics data", +"ДобавитьПозиционныйПараметрКоманды": "AddPositionalCommandParameter", +"Устанавливает значения ячеек листа": "Sets sheet cell values", +"Получает информацию о текущем диске": "Gets information about the current disk", "ПолучитьСтатусАсинхронногоИзменения": "GetAsynchronousChangeStatus", -"Получает информацию событиях канала": "Gets information about channel events", -"Строка,Число,Массив из Строка,Число": "String,Number,Array of String,Number", -"Изменяет свойства существующей базы": "Edits properties of an existing database", -"ПолучитьБуферДвоичныхДанныхИзСтроки": "GetBinaryDataBufferFromString", +"Создает сокращенный URL из обычного": "Creates a shortened URL from a regular one", +"Идентификатор рабочего пространства": "Workspace identifier", +"Отправляет документ в чат или канал": "Sends a document to a chat or channel", +"Получает основную информацию о боте": "Gets basic information about the bot", "Банит пользователя в выбранном чате": "Bans a user in the selected chat", -"Получить список рекламных категорий": "Get a list of advertising categories", +"Открывает ранее закрытое обсуждение": "Opens a previously closed discussion", +"Получает информацию событиях канала": "Gets information about channel events", +"Отправляет картинку в чат или канал": "Sends an image to a chat or channel", +"Получает массив календарей аккаунта": "Gets an array of account calendars", +"Получает информацию о внешнем файле": "Gets information about the external file", "ID темы. Главная, если не заполнено": "Thread ID. Main if not filled", "Типы: audio, document, photo, video": "Types: audio, document, photo, video", -"Dropbox_ДобавитьПользователейКФайлу": "Dropbox_AddUsersToFile", -"Dropbox_ПолучитьСтатусЗагрузкиПоURL": "Dropbox_GetUploadStatusByURL", -"Открывает ранее закрытое обсуждение": "Opens a previously closed discussion", -"Получает основную информацию о боте": "Gets basic information about the bot", -"Отправляет картинку в чат или канал": "Sends an image to a chat or channel", -"Идентификатор рабочего пространства": "Workspace identifier", -"Dropbox_ПолучитьСписокВерсийОбъекта": "Dropbox_GetObjectVersionList", -"Получает информацию о текущем диске": "Gets information about the current disk", "Dropbox_ПолучитьИнформациюОбОбъекте": "Dropbox_GetObjectInformation", +"Dropbox_ПолучитьСписокВерсийОбъекта": "Dropbox_GetObjectVersionList", +"Получить список рекламных категорий": "Get a list of advertising categories", +"Изменяет свойства существующей базы": "Edits properties of an existing database", +"Dropbox_ДобавитьПользователейКПапке": "Dropbox_AddUsersToFolder", +"ПолучитьБуферДвоичныхДанныхИзСтроки": "GetBinaryDataBufferFromString", +"Dropbox_ДобавитьПользователейКФайлу": "Dropbox_AddUsersToFile", +"Строка,Число,Массив из Строка,Число": "String,Number,Array of String,Number", "ID родительского блока или страницы": "Parent block or page ID", -"Отправляет документ в чат или канал": "Sends a document to a chat or channel", -"Главный в группе, если есть в группе": "Main in the group, if exists in the group", -"Получает статистику в разрезе постов": "Gets statistics in terms of posts", -"Получить список ответов на сообщение": "Get list of message replies", +"Наименование создаваемого календаря": "Name of the created calendar", +"Dropbox_ПолучитьСтатусЗагрузкиПоURL": "Dropbox_GetUploadStatusByURL", +"Возвращает список заказов сообщества": "Returns the community's order list", +"Telegram_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage", +"Отправляет аудиофайл в чат или канал": "Sends an audio file to a chat or channel", +"ПолучитьСоответствиеПараметровТовара": "GetProductParameterMapping", +"Путь к оригинальному файлу или папке": "Path to the original file or folder", +"Dropbox_ПолучитьИнформациюОбАккаунте": "Dropbox_GetAccountInformation", +"Результат чтения JSON ответа сервера": "Result of reading the JSON response from the server", +"Удаляет существующее свойство товара": "Deletes the existing product property", +"Создает альбом для хранения картинок": "Creates an album to store images", +"ПолучитьСписокОпубликованныхОбъектов": "GetPublishedObjectsList", +"Перемещает объект по выбранному пути": "Moves an object to the selected path", "Телеграм_ЗакрепитьОткрепитьСообщение": "Telegram_PinUnpinMessage", "Получает общее число участников чата": "Gets the total number of chat participants", -"Устанавливает цель (описание) канала": "Sets the channel purpose (description)", -"Возвращает список заказов сообщества": "Returns the community's order list", -"Получает ссылку для скачивания файла": "Gets a download link for the file", -"Создает альбом для хранения картинок": "Creates an album to store images", -"Получить список пользователей канала": "Get channel user list", -"сериализованный JSON ответа от Viber": "serialized JSON response from Viber", -"Перемещает объект по выбранному пути": "Moves an object to the selected path", -"Dropbox_ПолучитьИнформациюОбАккаунте": "Dropbox_GetAccountInformation", -"Удаляет комментарий к записи таблицы": "Deletes a comment for a table record", -"Отправляет опрос с вариантами ответа": "Sends a poll with answer options", -"Удаляет существующее свойство товара": "Deletes the existing product property", -"Отправляет сообщение в выбранный час": "Sends a message at a selected hour", -"Строка,Соответствие Из КлючИЗначение": "String, Map From KeyAndValue", -"Отправляет аудиофайл в чат или канал": "Sends an audio file to a chat or channel", -"Путь к оригинальному файлу или папке": "Path to the original file or folder", -"сериализованный JSON ответа от Slack": "Serialized JSON response from Slack", -"Telegram_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage", -"Путь к опубликованному ранее объекту": "Path to the previously published object", -"ПолучитьСоответствиеПараметровТовара": "GetProductParameterMapping", -"Результат чтения JSON ответа сервера": "Result of reading the JSON response from the server", "Телеграм_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage", -"Получает информацию о странице по ID": "Gets information about the page by ID", +"Удаляет комментарий к записи таблицы": "Deletes a comment for a table record", +"Получает статистику в разрезе постов": "Gets statistics in terms of posts", +"Получить список ответов на сообщение": "Get list of message replies", +"Главный в группе, если есть в группе": "Main in the group, if exists in the group", +"Отправляет сообщение в выбранный час": "Sends a message at a selected hour", "Получить список отложенных сообщений": "Get list of delayed messages", -"ПолучитьСписокОпубликованныхОбъектов": "GetPublishedObjectsList", -"ПреобразоватьДанныеСПолучениемРазмера": "ConvertDataWithSizeRetrieval", -"Получает описание поля файлового типа": "Gets the description of a file field", -"Массив соответствий данных календарей": "Array of calendar data mappings", -"Получает описание поля числового типа": "Gets the description of a numeric field", -"Перемещает событие в другой календарь": "Moves an event to another calendar", -"Копирует лист из одной книги в другую": "Copies a sheet from one book to another", -"ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект": "YDisk_UploadByUrlAndGetObject", +"Отправляет опрос с вариантами ответа": "Sends a poll with answer options", +"Путь к опубликованному ранее объекту": "Path to the previously published object", +"Получить список пользователей канала": "Get channel user list", +"Получает информацию о странице по ID": "Gets information about the page by ID", +"Устанавливает цель (описание) канала": "Sets the channel purpose (description)", +"сериализованный JSON ответа от Slack": "Serialized JSON response from Slack", +"Получает ссылку для скачивания файла": "Gets a download link for the file", +"Строка,Соответствие Из КлючИЗначение": "String, Map From KeyAndValue", +"сериализованный JSON ответа от Viber": "serialized JSON response from Viber", "сериализованный JSON ответа от Notion": "Serialized JSON response from Notion", -"Изменяет существующее свойство товара": "Edits the existing product property", -"ID свойства, куда добавляется вариант": "Property ID where the variant is added", -"СформироватьКлавиатуруИзМассиваКнопок": "CreateKeyboardFromArrayButton", -"сериализованный JSON ответа от Yandex": "serialized JSON response from Yandex", -"Получает статус загрузки файла по URL": "Gets the upload status of the file by URL", -"ID версии (ревизии) для востановления": "ID of the version (revision) for restoration", -"Телеграм_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarsList", -"Telegram_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarList", -"Telegram_ИзменитьИмяГлавнойТемыФорума": "Telegram_ChangeMainTopicName", -"УправлениеВидимостьюГлавнойТемыФорума": "ManageMainTopicVisibility", -"СформироватьКлавиатуруПоМассивуКнопок": "FormKeyboardFromButtonArray", -"Для отображения скидки\/изменения цены": "For displaying discount\/changing price", -"сериализованный JSON ответа от Google": "serialized JSON response from Google", -"Получает информацию о календаре по ID": "Gets calendar information by ID", -"Удаляет сообщение канала по timestamp": "Deletes a channel message by timestamp", "Пример структуры\/соответствия свойств": "Example structure\/property map", -"Признак удаления отложенного сообщения": "Indicator of deleting a delayed message", -"Формирует клавиатуру по массиву кнопок": "Forms a keyboard from an array of buttons", -"Получает описание поля строкового типа": "Gets the description of a string field", -"Сохраняет картинку в альбом сообщества": "Saves an image to the community album", -"Получить статус асинхронного изменения": "Get asynchronous change status", +"Перемещает событие в другой календарь": "Moves an event to another calendar", +"Получает статус загрузки файла по URL": "Gets the upload status of the file by URL", +"ID свойства, куда добавляется вариант": "Property ID where the variant is added", +"Для отображения скидки\/изменения цены": "For displaying discount\/changing price", +"Копирует лист из одной книги в другую": "Copies a sheet from one book to another", +"Изменяет существующее свойство товара": "Edits the existing product property", +"УправлениеВидимостьюГлавнойТемыФорума": "ManageMainTopicVisibility", +"ID версии (ревизии) для востановления": "ID of the version (revision) for restoration", +"ПреобразоватьДанныеСПолучениемРазмера": "ConvertDataWithSizeRetrieval", +"СформироватьКлавиатуруИзМассиваКнопок": "CreateKeyboardFromArrayButton", +"Получает информацию о календаре по ID": "Gets calendar information by ID", +"сериализованный JSON ответа от Yandex": "serialized JSON response from Yandex", +"Telegram_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarList", +"Получает описание поля числового типа": "Gets the description of a numeric field", +"Telegram_ИзменитьИмяГлавнойТемыФорума": "Telegram_ChangeMainTopicName", +"Получает описание поля файлового типа": "Gets the description of a file field", +"Телеграм_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarsList", +"СформироватьКлавиатуруПоМассивуКнопок": "FormKeyboardFromButtonArray", +"ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект": "YDisk_UploadByUrlAndGetObject", +"сериализованный JSON ответа от Google": "serialized JSON response from Google", +"Массив соответствий данных календарей": "Array of calendar data mappings", +"Удаляет сообщение канала по timestamp": "Deletes a channel message by timestamp", +"Получить список подборок по массиву ID": "Gets the list of selections by array of IDs", +"Получает список всех событий календаря": "Gets the list of all calendar events", "Некорректный статус управления форумом": "Incorrect forum management status", -"Создает комментарий к записи в таблице": "Creates a comment for a record in the table", -"Удалить полностью (Истина) или закрыть": "Delete completely (True) or close", -"Получает список свойств товаров группы": "Gets the list of properties of group products", +"ПолучитьБуферДвоичныхДанныхИзHexСтроки": "GetBinaryDataBufferFromHexString", +"Получает описание поля строкового типа": "Gets the description of a string field", +"Получает список файлов бота или канала": "Gets a list of files of the bot or channel", "Сохраняет публичный объект на ваш диск": "Saves the public object to your disk", "Получает список тегов выбранных файлов": "Gets the list of tags of the selected files", "сериализованный JSON ответа от Dropbox": "serialized JSON response from Dropbox", -"Получает список файлов бота или канала": "Gets a list of files of the bot or channel", -"Получить список подборок по массиву ID": "Gets the list of selections by array of IDs", -"Получает список всех событий календаря": "Gets the list of all calendar events", -"ПолучитьБуферДвоичныхДанныхИзHexСтроки": "GetBinaryDataBufferFromHexString", -"сериализованный JSON ответа от Twitter": "serialized JSON response from Twitter", +"Сохраняет картинку в альбом сообщества": "Saves an image to the community album", "Смещение в списке получаемых сообщений": "Offset in the list of received messages", -"Дата отправки для отложенного сообщения": "Sending date for delayed message", -"ОчиститьСписокЗакрепленныхСообщенийТемы": "ClearThreadPinnedMessagesList", -"Получает список опубликованных объектов": "Gets a list of published objects", -"Перезаписывать файл при конфликте путей": "Overwrite file in case of path conflicts", +"сериализованный JSON ответа от Twitter": "serialized JSON response from Twitter", +"Создает комментарий к записи в таблице": "Creates a comment for a record in the table", +"Признак удаления отложенного сообщения": "Indicator of deleting a delayed message", +"Получить статус асинхронного изменения": "Get asynchronous change status", +"Удалить полностью (Истина) или закрыть": "Delete completely (True) or close", +"Получает список свойств товаров группы": "Gets the list of properties of group products", +"Формирует клавиатуру по массиву кнопок": "Forms a keyboard from an array of buttons", "Изменяет состав существующего сообщения": "Edits the content of an existing message", -"HTTPОтвет, Произвольный, ДвоичныеДанные": "HTTPResponse, Arbitrary, BinaryData", -"ПолучитьДанныеИспользованияПространства": "GetSpaceUsageData", -"сериализованный JSON ответа от Airtable": "serialized JSON response from Airtable", +"Дата отправки для отложенного сообщения": "Sending date for delayed message", "ID существующей группы, если необходимо": "ID of the existing group, if needed", -"Путь к оригинальному файлу или каталогу": "Path to the original file or directory", "сериализованный JSON ответа от Telegram": "Serialized JSON response from Telegram", -"Удаляет календарь из списка пользователя": "Removes a calendar from the user's list", -"Создает комментарий к файлу или каталогу": "Creates a comment for a file or directory", -"Массив вариантов опроса, если необходимо": "Array of poll options, if necessary", -"Удаляет текстовый тег файла или каталога": "Deletes the text tag of a file or directory", -"Изменяет текст существующего комментария": "Changes the text of an existing comment", -"Удаляет ранее созданный вариант свойства": "Deletes the previously created product property variant", -"Добавляет список файлов к полям каталога": "Adds a list of files to the directory fields", +"ПолучитьДанныеИспользованияПространства": "GetSpaceUsageData", +"HTTPОтвет, Произвольный, ДвоичныеДанные": "HTTPResponse, Arbitrary, BinaryData", +"ОчиститьСписокЗакрепленныхСообщенийТемы": "ClearThreadPinnedMessagesList", +"Путь к оригинальному файлу или каталогу": "Path to the original file or directory", +"Перезаписывать файл при конфликте путей": "Overwrite file in case of path conflicts", +"сериализованный JSON ответа от Airtable": "serialized JSON response from Airtable", +"Получает список опубликованных объектов": "Gets a list of published objects", "Массив идентификаторов вида photo123_123": "Array of identifiers like photo123_123", -"Получает информацию о пользователе по ID": "Gets user information by ID", -"Загружает файл на диск по заданному пути": "Uploads a file to disk at the specified path", +"Массив вариантов опроса, если необходимо": "Array of poll options, if necessary", "Скачивает файл по указанному пути или ID": "Downloads a file by the specified path or ID", -"Получает информацию о файле или каталоге": "Gets information about a file or directory", -"Получает список версий (ревизий) объекта": "Gets the list of versions (revisions) of the object", "Изменяет наименование существующей книги": "Changes the name of the existing book", +"Удаляет календарь из списка пользователя": "Removes a calendar from the user's list", +"Получает информацию о файле или каталоге": "Gets information about a file or directory", "ПолучитьСоответствиеРазделовТестирования": "GetTestingSectionMapping", -"ОбработкаВходящегоЗапросаПослеАвторизации": "HandleIncomingRequestAfterAuthorization", -"действия будут выполняться от лица группы": "actions will be performed on behalf of the group", -"См. СформироватьКлавиатуруИзМассиваКнопок": "See CreateKeyboardFromArrayButton", -"Сформировать клавиатуру по массиву кнопок": "Generate keyboard from array of buttons", -"См. СформироватьКлавиатуруПоМассивуКнопок": "See GenerateKeyboardFromArray", -"Новые или изменяемые свойства базы данных": "New or modified database properties", -"Изменяет свойства существуещего календаря": "Edits properties of an existing calendar", -"Публикует объект диска в публичный доступ": "Publishes the disk object for public access", -"Получает список всех комментариев объекта": "Gets the list of all comments of the object", -"Создает комментарий под выбранной записью": "Creates a comment under the selected record", -"Сформировать клавиатуру из массива кнопок": "Create a keyboard from an array of buttons", -"ПолучитьСсылкуСкачиванияПубличногоОбъекта": "GetDownloadLinkForPublicObject", -"Удаляет указанного пользователя из канала": "Removes specified user from channel", +"Добавляет список файлов к полям каталога": "Adds a list of files to the directory fields", +"Удаляет ранее созданный вариант свойства": "Deletes the previously created product property variant", +"Создает комментарий к файлу или каталогу": "Creates a comment for a file or directory", +"Удаляет текстовый тег файла или каталога": "Deletes the text tag of a file or directory", +"Получает список версий (ревизий) объекта": "Gets the list of versions (revisions) of the object", +"Получает информацию о пользователе по ID": "Gets user information by ID", +"Изменяет текст существующего комментария": "Changes the text of an existing comment", +"Загружает файл на диск по заданному пути": "Uploads a file to disk at the specified path", "Создает пустой каталог по выбранному пути": "Creates an empty directory at the selected path", +"ОбработкаВходящегоЗапросаПослеАвторизации": "HandleIncomingRequestAfterAuthorization", +"Возвращает URL для авторизации в браузере": "Returns URL for browser authorization", +"Создает комментарий под выбранной записью": "Creates a comment under the selected record", +"Получает список записей выбранной таблицы": "Gets the list of records of the selected table", +"Публикует объект диска в публичный доступ": "Publishes the disk object for public access", +"ПолучитьСсылкуСкачиванияПубличногоОбъекта": "GetDownloadLinkForPublicObject", +"См. СформироватьКлавиатуруИзМассиваКнопок": "See CreateKeyboardFromArrayButton", +"Новые или изменяемые свойства базы данных": "New or modified database properties", "Массив двоичных данных или путей к файлам": "Array of binary data or file paths", "Кодировка, в которой записаны JSON данные": "Encoding of JSON Data", -"Получает список записей выбранной таблицы": "Gets the list of records of the selected table", +"Сформировать клавиатуру из массива кнопок": "Create a keyboard from an array of buttons", "Добавляет указанных пользователей в канал": "Adds specified users to the channel", -"Изменяет наименование и|или описание базы": "Changes the name and\/or description of the base", -"Признак исключения архивированных каналов": "Indicator of excluding archived channels", +"Сформировать клавиатуру по массиву кнопок": "Generate keyboard from array of buttons", "Получает описание поля с номером телефона": "Gets the description of a phone number field", -"Возвращает URL для авторизации в браузере": "Returns URL for browser authorization", +"Изменяет наименование и|или описание базы": "Changes the name and\/or description of the base", +"См. СформироватьКлавиатуруПоМассивуКнопок": "See GenerateKeyboardFromArray", +"действия будут выполняться от лица группы": "actions will be performed on behalf of the group", +"Удаляет указанного пользователя из канала": "Removes specified user from channel", +"Изменяет свойства существуещего календаря": "Edits properties of an existing calendar", "|--------[через 2 ч.]-------------------|": "|--------[after 2 hrs.]-------------------|", -"Отправляет внейшний файл по списку каналов": "Sends an external file to a list of channels", -"ID поста, используемого в качетсве рекламы": "ID of the post used for advertising", +"Получает список всех комментариев объекта": "Gets the list of all comments of the object", +"Признак исключения архивированных каналов": "Indicator of excluding archived channels", "JSON клавиатуры. См.СформироватьКлавиатуру": "JSON keyboard. See FormKeyboard", -"Добавляет новый товар в каталог сообщества": "Adds a new product to the community's catalog", -"Получает постоянный UTL к сообщению канала": "Gets a permanent URL to the channel message", -"Ошибка преобразовани данных параметра JSON": "JSON Parameter Data Conversion Error", -"Разбанивает забаненного ранее пользователя": "Unbans a previously banned user", "Очищает список событий основного календаря": "Clears the event list of the primary calendar", +"Получает постоянный UTL к сообщению канала": "Gets a permanent URL to the channel message", +"Добавляет новый товар в каталог сообщества": "Adds a new product to the community's catalog", +"Отправляет внейшний файл по списку каналов": "Sends an external file to a list of channels", "Сформировать клавиатуру из массива кнопок:": "Create a keyboard from an array of buttons:", "Получить данные использования пространства": "Get space usage data", -"Отменяет режим общего доступа для каталога": "Cancels the public access mode for the directory", +"ID поста, используемого в качетсве рекламы": "ID of the post used for advertising", +"Разбанивает забаненного ранее пользователя": "Unbans a previously banned user", "Отправляет файл (документ) в чат или канал": "Sends a file (document) to a chat or channel", -"Красный, желтый, синий или какой-то другой?": "Red, yellow, blue, or some other?", +"Отменяет режим общего доступа для каталога": "Cancels the public access mode for the directory", +"Ошибка преобразовани данных параметра JSON": "JSON Parameter Data Conversion Error", +"Обновляет v2 токен при помощи refresh_token": "Updates the v2 token using the refresh_token", +"Ошибка получения данных булево из параметра": "Error getting boolean data from parameter", +"Получает список отложенных сообщений канала": "Gets a list of delayed channel messages", +"Получает описание поля с электронной почтой": "Gets the description of an email field", "Получает информацию о папке или файле по ID": "Gets information about a folder or file by ID", "Очистить список закрепленных сообщений темы": "Clear thread's pinned messages list", -"ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных": "GetBinaryDataBufferFromBinaryData", -"ID файла, к которому предоставляется доступ": "ID of the file to be accessed", -"Получает описание поля с электронной почтой": "Gets the description of an email field", -"Ошибка получения данных булево из параметра": "Error getting boolean data from parameter", "Получает информацию о товарах по массиву ID": "Gets information about products by array of IDs", -"конкретное значение при указании имени поля": "Specific Value When Specifying Field Name", -"Обновляет v2 токен при помощи refresh_token": "Updates the v2 token using the refresh_token", -"Получает список отложенных сообщений канала": "Gets a list of delayed channel messages", +"ID файла, к которому предоставляется доступ": "ID of the file to be accessed", "Удаляет ранее добавленный товар из подборки": "Removes a previously added product from the selection", +"конкретное значение при указании имени поля": "Specific Value When Specifying Field Name", +"Красный, желтый, синий или какой-то другой?": "Red, yellow, blue, or some other?", +"ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных": "GetBinaryDataBufferFromBinaryData", +"Создает ссылку для вступления в закрытый чат": "Creates a link for joining a closed chat", +"Показывает ранее скрытую главную тему форума": "Shows a previously hidden main forum thread", +"Приостанавливает показ рекламного объявления": "Pauses the display of the advertising post", +"Добавляет вариант для существующего свойства": "Adds a variant for an existing property", +"ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных": "GetBinaryDataFromBinaryDataBuffer", +"Получает новый токен на основе рефреш токена": "Gets a new token based on the refresh token", "Создает рекламное объявление на основе поста": "Creates an advertising post based on a post", +"Удалить объект без возможности востановления": "Delete object without the possibility of recovery", +"Преобразует файл с Base64 строкой в бинарный": "Convert Base64 String to Binary File", +"Похоже, что в ответе пришли двоичные данные!": "It Seems Binary Data Was Received in Response!", +"Переводит каталог в режим публичного доступа": "Sets the directory to public access mode", "Загружает файлы на сервер и возвращает их ID": "Uploads files to the server and returns their IDs", "Копирует файл или каталог по выбранному пути": "Copies a file or directory to the selected path", -"ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных": "GetBinaryDataFromBinaryDataBuffer", -"Преобразует файл с Base64 строкой в бинарный": "Convert Base64 String to Binary File", -"Приостанавливает показ рекламного объявления": "Pauses the display of the advertising post", -"Удалить объект без возможности востановления": "Delete object without the possibility of recovery", -"Показывает ранее скрытую главную тему форума": "Shows a previously hidden main forum thread", -"Похоже, что в ответе пришли двоичные данные!": "It Seems Binary Data Was Received in Response!", -"Создает ссылку для вступления в закрытый чат": "Creates a link for joining a closed chat", -"Добавляет вариант для существующего свойства": "Adds a variant for an existing property", -"Переводит каталог в режим публичного доступа": "Sets the directory to public access mode", -"Получает новый токен на основе рефреш токена": "Gets a new token based on the refresh token", +"Получить ссылку скачивания публичного объекта": "Get download link for public object", +"Требования: платформа 1С версии 8.3.10 и выше": "Requirements: 1C platform version 8.3.10 and above", +"Раскомментировать, если выполняется OneScript": "Uncomment if OneScript is executed", +"Повторно открывает ранее закрытую тему форума": "Reopens a previously closed forum thread", +"Возвращает структура клавиатуры для сообщений": "Returns a keyboard structure for messages", "Получает список пользователей рабочей области": "Gets a list of users in the workspace", "Идентификатор новой подборки, если необходимо": "Identifier of the new selection, if needed", -"Раскомментировать, если выполняется OneScript": "Uncomment if OneScript is executed", -"Возвращает структура клавиатуры для сообщений": "Returns a keyboard structure for messages", -"Повторно открывает ранее закрытую тему форума": "Reopens a previously closed forum thread", -"Требования: платформа 1С версии 8.3.10 и выше": "Requirements: 1C platform version 8.3.10 and above", "Не удалось получить информацию из json медиа!": "Failed to Retrieve Information from JSON media!", -"Получить ссылку скачивания публичного объекта": "Get download link for public object", -"Число последних версий объекта для отображения": "Number of the latest versions of the object to display", -"Расположение OS: .\/OInt\/core\/Modules\/OPI_VK.os": "Location OS: .\/OInt\/core\/Modules\/OPI_VK.os", -"Ошибка получения двоичных данных из параметра:": "Error getting binary data from parameter:", -"URL, по которому необходимо перейти в браузере": "URL to go to in the browser", -"Получает общую статистику сообщества за период": "Gets the overall community statistics for a period", -"Клавиатура под сообщением или на нижней панели": "Keyboard under the message or on the bottom panel", -"Отправляет контакт с именем и номером телефона": "Sends a contact with name and phone number", "Отправляет текстовое сообщение в чат или канал": "Sends a text message to a chat or channel", -"Формирует ссылку для авторизации через браузер": "Forms a link for authorization via the browser", +"Расположение OS: .\/OInt\/core\/Modules\/OPI_VK.os": "Location OS: .\/OInt\/core\/Modules\/OPI_VK.os", "Список адресов почты добавляемых пользователей": "List of email addresses of users being added", +"URL, по которому необходимо перейти в браузере": "URL to go to in the browser", +"Формирует ссылку для авторизации через браузер": "Forms a link for authorization via the browser", +"Отправляет контакт с именем и номером телефона": "Sends a contact with name and phone number", +"Клавиатура под сообщением или на нижней панели": "Keyboard under the message or on the bottom panel", +"Ошибка получения двоичных данных из параметра:": "Error getting binary data from parameter:", +"Получает общую статистику сообщества за период": "Gets the overall community statistics for a period", +"Число последних версий объекта для отображения": "Number of the latest versions of the object to display", +"Получает список файлов с или без отбора по типу": "Gets a list of files with or without filtering by type", +"Отправляет URL с предпросмотром в чат или канал": "Sends a URL with a preview to a chat or channel", +"Получает список пользователей указанного канала": "Gets a list of users in the specified channel", +"Массив имен для добавления новых листов в книгу": "Array of names to add new sheets to the book", "Получает список комментариев к записи в таблице": "Gets the list of comments for a record in the table", +"Создает кампанию в выбранном рекламном кабинете": "Creates a campaign in the selected advertising account", +"Dropbox_ПолучитьДанныеИспользованияПространства": "Dropbox_GetSpaceUsageData", "Путь к объекту, тег которого необходимо удалить": "Path to the object whose tag needs to be deleted", "Получает календарь из списка пользователя по ID": "Gets a calendar from the user's list by ID", -"Отправляет URL с предпросмотром в чат или канал": "Sends a URL with a preview to a chat or channel", -"Dropbox_ПолучитьДанныеИспользованияПространства": "Dropbox_GetSpaceUsageData", -"Массив имен для добавления новых листов в книгу": "Array of names to add new sheets to the book", -"Создает кампанию в выбранном рекламном кабинете": "Creates a campaign in the selected advertising account", -"Получает список файлов с или без отбора по типу": "Gets a list of files with or without filtering by type", -"Получает список пользователей указанного канала": "Gets a list of users in the specified channel", -"двоичные данные zip архива с содержимым каталога": "binary data of the zip archive with the contents of the directory", -"Добавляет сообщение в обсуждение от имени группы": "Adds a message to the discussion on behalf of the group", -"Создает новый блок на основе существующего блока": "Creates a new block based on an existing block", -"Некорректный метод! Проверьте правильность ввода": "Incorrect method! Check input correctness", -"Истина > сортировать по дате, Ложь > по алфавиту": "True > sort by date, False > alphabetically", -"Получает данные строки таблицы по идентификатору": "Gets row data of the table by identifier", -"Получает токен по коду из авторизации в бразуере": "Gets token by code from browser authorization", -"Созвращает список дочерних блоков блока-родителя": "Returns list of child blocks of parent block", "Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы": "Telegram_ClearPinnedMessagesList", -"Расположение OS: .\/OInt\/core\/Modules\/OPI_Slack.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Slack.os", +"Получает токен по коду из авторизации в бразуере": "Gets token by code from browser authorization", +"Добавляет сообщение в обсуждение от имени группы": "Adds a message to the discussion on behalf of the group", +"Получает данные строки таблицы по идентификатору": "Gets row data of the table by identifier", +"Созвращает список дочерних блоков блока-родителя": "Returns list of child blocks of parent block", +"Создает новый блок на основе существующего блока": "Creates a new block based on an existing block", +"Истина > сортировать по дате, Ложь > по алфавиту": "True > sort by date, False > alphabetically", +"Некорректный метод! Проверьте правильность ввода": "Incorrect method! Check input correctness", +"двоичные данные zip архива с содержимым каталога": "binary data of the zip archive with the contents of the directory", "Твиттер не смог обработать загруженное вами видео": "Twitter could not process the video you uploaded", +"ID подборка для помещения товара, если необходимо": "Selection ID for placing the product, if needed", "Путь к каталогу. Необязателен, если указан курсор": "Path to the directory. Optional if the cursor is specified", -"Отменяет публикацию ранее опубликованного объекта": "Unpublishes a previously published object", +"Расположение OS: .\/OInt\/core\/Modules\/OPI_Slack.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Slack.os", +"Преобразует файл с Base64 строкой в бинарный файл": "Convert file with Base64 string to binary file", "Источник: https:github.com\/vbondarevsky\/Connector": "Source: https:github.com\/vbondarevsky\/Connector", +"Отменяет публикацию ранее опубликованного объекта": "Unpublishes a previously published object", "Расположение OS: .\/OInt\/core\/Modules\/OPI_Viber.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Viber.os", "Идентификатор или массив индентификаторов записей": "Identifier or array of record identifiers", -"ID подборка для помещения товара, если необходимо": "Selection ID for placing the product, if needed", -"Преобразует файл с Base64 строкой в бинарный файл": "Convert file with Base64 string to binary file", -"Некорректная команда! Проверьте правильность ввода": "Incorrect command! Check input correctness", -"Создает новое свойство для использования в товарах": "Creates a new property for use in products", -"Запрещает доступ к файлу для внешних пользователей": "Prohibits access to the file for external users", -"ID блока, после которого необходимо встаивть новый": "Block ID after which to insert the new one", -"Добавляет новый текстовый тег к файлу или каталогу": "Adds a new text tag to a file or directory", "Расположение OS: .\/OInt\/core\/Modules\/OPI_Notion.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Notion.os", -"ID асинхронной работы из ответа ЗагрузитьФайлПоURL": "ID of the asynchronous job from the UploadFileByURL response", "Не удалось привести структуру значений к коллекции": "Failed to convert the structure of values to a collection", +"Добавляет новый текстовый тег к файлу или каталогу": "Adds a new text tag to a file or directory", +"Создает новое свойство для использования в товарах": "Creates a new property for use in products", "Данные заполнения, где ключ это имя ячейки вида A1": "Fill data where the key is the cell name like A1", +"Некорректная команда! Проверьте правильность ввода": "Incorrect command! Check input correctness", "Удаляет одну или массив записей по идентификаторам": "Deletes one or an array of records by identifiers", -"Путь к объекту, для которого необходимо создать тег": "Path to the object for which the tag needs to be created", -"Расположение OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os", -"Коннектор: удобный HTTP-клиент для 1С:Предприятие 8": "Connector: convenient HTTP client for 1C:Enterprise 8", -"Очищает список закрепленных сообщений в теме форума": "Clears the list of pinned messages in the forum thread", +"Запрещает доступ к файлу для внешних пользователей": "Prohibits access to the file for external users", +"ID асинхронной работы из ответа ЗагрузитьФайлПоURL": "ID of the asynchronous job from the UploadFileByURL response", +"ID блока, после которого необходимо встаивть новый": "Block ID after which to insert the new one", "Расположение OS: .\/OInt\/core\/Modules\/OPI_Twitter.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Twitter.os", +"Расположение OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os", +"Очищает список закрепленных сообщений в теме форума": "Clears the list of pinned messages in the forum thread", "Изменяет свойства календаря из списка пользователей": "Edits the properties of a calendar from the user's list", +"Путь к объекту, для которого необходимо создать тег": "Path to the object for which the tag needs to be created", +"Коннектор: удобный HTTP-клиент для 1С:Предприятие 8": "Connector: convenient HTTP client for 1C:Enterprise 8", "Смещение для получение объектов не из начала списка": "Offset for getting objects not from the beginning of the list", -"Отправляет географические координаты в чат или канал": "Sends geographic coordinates to a chat or channel", -"Расположение OS: .\/OInt\/core\/Modules\/OPI_Airtable.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Airtable.os", -"Скачивает zip архив с содержимым указанного каталога": "Downloads a zip archive with the contents of the specified directory", "Истина > кнопки выводятся в столбик, Ложь > в строку": "True > buttons are displayed in a column, False > in a row", -"Загружает файл на диск, забирая его по заданному URL": "Downloads a file to disk from the specified URL", -"Обрабатывает данные TMA и опредеяет их достоверность": "Processes TMA data and determines its validity", -"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexID.os": "Location OS: .\/OInt\/core\/Modules\/OPI_YandexID.os", -"Написать сообщение пользователю в диалоге сообщества": "Write a message to a user in the community's dialog", -"Основное измерение при заполнении диапазона массивом": "Main dimension when filling the array range", "Здесь собрано определение данных для работы с VK API": "Here is a collection of data definitions for working with the VK API", -"Описание таблиц: Ключ > имя, Значение > массив полей": "Table description: Key > name, Value > array of fields", +"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexID.os": "Location OS: .\/OInt\/core\/Modules\/OPI_YandexID.os", "Расположение OS: .\/OInt\/core\/Modules\/OPI_Telegram.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Telegram.os", -"Генерирует ссылку авторизации для перехода в браузере": "Generates an authorization link for browser transition", -"Возвращает список пользователей рабочего пространства": "Returns a list of workspace users", -"Отправляет контакт с номером телефона в чат или канал": "Sends a contact with a phone number to a chat or channel", +"Скачивает zip архив с содержимым указанного каталога": "Downloads a zip archive with the contents of the specified directory", +"Отправляет географические координаты в чат или канал": "Sends geographic coordinates to a chat or channel", +"Основное измерение при заполнении диапазона массивом": "Main dimension when filling the array range", +"Загружает файл на диск, забирая его по заданному URL": "Downloads a file to disk from the specified URL", +"Написать сообщение пользователю в диалоге сообщества": "Write a message to a user in the community's dialog", +"Обрабатывает данные TMA и опредеяет их достоверность": "Processes TMA data and determines its validity", +"Описание таблиц: Ключ > имя, Значение > массив полей": "Table description: Key > name, Value > array of fields", +"Расположение OS: .\/OInt\/core\/Modules\/OPI_Airtable.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Airtable.os", "Определяет доступ к файлу для стороннего пользователя": "Defines access to the file for an external user", -"Группирует товары на основе одинаковых наборов свойств": "Groups products based on similar sets of properties", +"Отправляет контакт с номером телефона в чат или канал": "Sends a contact with a phone number to a chat or channel", +"Возвращает список пользователей рабочего пространства": "Returns a list of workspace users", +"Генерирует ссылку авторизации для перехода в браузере": "Generates an authorization link for browser transition", "Добавляет существующий календарь в список пользователя": "Adds an existing calendar to the user's list", "Изменяет имя и|или описание существующего поля таблицы": "Changes the name and\/or description of an existing table field", -"Перемещает объект по заданному пути и пути к оригиналу": "Moves the object to the specified path and path to the original", -"Перезаписывать если файл с таким именем уже существует": "Overwrite if a file with the same name already exists", "Получает список внешних файлов пользователя или канала": "Gets a list of external files of a user or channel", +"Перемещает объект по заданному пути и пути к оригиналу": "Moves the object to the specified path and path to the original", +"Группирует товары на основе одинаковых наборов свойств": "Groups products based on similar sets of properties", +"Перезаписывать если файл с таким именем уже существует": "Overwrite if a file with the same name already exists", "Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexDisk.os": "OS Location: .\/OInt\/core\/Modules\/OPI_YandexDisk.os", "ID аккаунта. Текущий аккаунт токена, если не заполнено": "Account ID. Current token account if not filled", "Получает информацию об объекте диска по заданному пути": "Gets information about a disk object at the specified path", +"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os", "Предоставляет стороннии пользователям доступ к каталогу": "Grants external users access to the directory", "Перезаписывать, если файл с таким именем уже существует": "Overwrite if a file with the same name already exists", -"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os", "Идентификатор файла или каталога размещения комментария": "Identifier of the file or directory where the comment is located", -"Получает статус асинхронной работы по изменению доступов": "Gets the status of the asynchronous access change job", -"Отправляет сообщение, которое приходит в канал, но видно": "Sends a message that arrives in the channel but is visible", -"Получает прямую ссылку для скачивания публичного объекта": "Gets a direct link to download the public object", "Получает информацию об опубликованном объекте по его URL": "Gets information about the published object by its URL", "Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleSheets.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleSheets.os", +"Создает дочернюю страницу над другой страницей-родителем": "Creates a child page above another parent page", +"Отправляет сообщение, которое приходит в канал, но видно": "Sends a message that arrives in the channel but is visible", +"Получает прямую ссылку для скачивания публичного объекта": "Gets a direct link to download the public object", "Соответствие данных с результатом проверки в поле passed": "Map of data with the result of verification in the passed field", "Добавляет дополнительные поля информации для медиафайлов": "Adds additional information fields for media files", "Изменяет значение варианта существующего свойства товара": "Edits the value of an existing product property variant", -"Создает дочернюю страницу над другой страницей-родителем": "Creates a child page above another parent page", -"Идентификатор объекта, для которого необходим комментарий": "Identifier of the object that needs a comment", -"Создает новую тему в группе с включенным функционалом тем": "Creates a new thread in the group with theme functionality enabled", -"Получает список рабочих областей, в которых подключен бот": "Gets a list of workspaces where the bot is connected", +"Получает статус асинхронной работы по изменению доступов": "Gets the status of the asynchronous access change job", "Удаляет публичный URL у файла. Требует токен пользователя": "Removes the public URL from the file. Requires user token", -"Пересылает сообщение между чатами или в рамках одного чата": "Forwards a message between chats or within a chat", -"Загружает фото на сервер для его дальнейшего использования": "Uploads photo to server for further use", -"Создает копию объекта по заданному пути и пути к оригиналу": "Creates a copy of the object at the specified path and path to the original", -"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os", +"Идентификатор объекта, для которого необходим комментарий": "Identifier of the object that needs a comment", +"Получает список рабочих областей, в которых подключен бот": "Gets a list of workspaces where the bot is connected", +"Создает новую тему в группе с включенным функционалом тем": "Creates a new thread in the group with theme functionality enabled", "Запрещает редактирование файла для стороннего пользователя": "Prohibits file editing for the external user", +"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os", +"Загружает фото на сервер для его дальнейшего использования": "Uploads photo to server for further use", +"Пересылает сообщение между чатами или в рамках одного чата": "Forwards a message between chats or within a chat", +"Создает копию объекта по заданному пути и пути к оригиналу": "Creates a copy of the object at the specified path and path to the original", +"Код, полученный из авторизации См.ПолучитьСсылкуАвторизации": "Code obtained from authorization See GetAuthorizationLink", +"Создает публичный URL для файла. Требует токен пользователя": "Creates a public URL for the file. Requires user token", +"Вы можете переопределять их, передавая в качестве параметра": "You can override them by passing them as a parameter", +"Расположение OS: .\/OInt\/tests\/Modules\/internal\/OPI_Тесты.os": "Location OS: .\/OInt\/tests\/Modules\/internal\/OPI_Tests.os", "Истина > служебные поля удаляются, остается только сам блок": "True > service fields are deleted, only the block itself remains", "Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os", -"Расположение OS: .\/OInt\/tests\/Modules\/internal\/OPI_Тесты.os": "Location OS: .\/OInt\/tests\/Modules\/internal\/OPI_Tests.os", -"Вы можете переопределять их, передавая в качестве параметра": "You can override them by passing them as a parameter", -"Создает публичный URL для файла. Требует токен пользователя": "Creates a public URL for the file. Requires user token", -"Код, полученный из авторизации См.ПолучитьСсылкуАвторизации": "Code obtained from authorization See GetAuthorizationLink", -"механизм загрузки файлов и некоторые другие из старой версии": "file upload mechanism and some others from the old version", "Имя поля для получения. Выводит весь список, если не указано": "Field name to retrieve. Displays the entire list if not specified", -"Смещение для получение вложенных объектов не из начала списка": "Offset for getting nested objects not from the beginning of the list", +"механизм загрузки файлов и некоторые другие из старой версии": "file upload mechanism and some others from the old version", "Иднтификатор следующей страницы данных из предыдущего запроса": "Next page identifier of data from the previous request", -"Открывает новый диалог с одним или несколькими пользователями": "Opens a new dialog with one or more users", "Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено": "String, Arbitrary, HTTPResponse, BinaryData, Undefined", +"Смещение для получение вложенных объектов не из начала списка": "Offset for getting nested objects not from the beginning of the list", "Указатель из предыдущего запроса, если строк результата > 100": "Pointer from the previous request, if the result rows > 100", +"Открывает новый диалог с одним или несколькими пользователями": "Opens a new dialog with one or more users", "Токен бота чата сообщества, котрый можно получить в настройках": "Community chat bot token, which can be obtained in the settings", "Загружает файл на облачный диск, получая его по указанному URL": "Uploads a file to the cloud drive by fetching it from the specified URL", -"Игнорируем проверку целостности архива, просто читаем результат": "Ignore archive integrity check, just read the result", "Получает статус пользователя или нескольких пользователей по ID": "Gets the status of a user or several users by ID", -"Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПреобразованиеТипов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TypeConversion.os", +"Игнорируем проверку целостности архива, просто читаем результат": "Ignore archive integrity check, just read the result", +"Получает массив сообщений, которые являются ответом на указанное": "Gets an array of messages that are replies to the specified", "Набор или массив наборов пар Ключ : Значение > Поле : Показатель": "Set or array of sets of Key : Value pairs > Field : Indicator", "Удаляет URL обработчика событий бота для работы в режиме Webhook": "Deletes the bot event handler URL for webhook operation", -"Получает массив сообщений, которые являются ответом на указанное": "Gets an array of messages that are replies to the specified", +"Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПреобразованиеТипов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TypeConversion.os", "Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок": "Keyboard, if needed, see CreateKeyboardFromArrayButton", "Идентификатор следующей страницы списка баз из перыдудщего запроса": "Next page identifier of the base list from the previous request", "Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПолучениеДанныхТестов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TestDataRetrieval.os", -"Совпадающие поля будут перезаписаны с приоритетом параметра функции": "Matching fields will be overwritten with the parameter of the function", -"ID пользователя. Для канала > администратора, для бота > получателя": "User ID. For channel > administrator, for bot > recipient", -"Формирует блок с картинкой для добавления в массив блоков сообщения": "Generates a block with an image to add to the message block array", "Ограничение на ур. вложенности разбора. На всю глубину по умолчанию": "Parsing depth limit. Full depth by default", +"Формирует блок с картинкой для добавления в массив блоков сообщения": "Generates a block with an image to add to the message block array", +"ID пользователя. Для канала > администратора, для бота > получателя": "User ID. For channel > administrator, for bot > recipient", +"Совпадающие поля будут перезаписаны с приоритетом параметра функции": "Matching fields will be overwritten with the parameter of the function", "на redirect_uri после авторизации через браузер есть всего 30 секунд": "on redirect_uri after authorization via the browser is only 30 seconds", "Курсор из предыдущего запроса для получения следующего набора файлов": "Cursor from the previous request to get the next set of files", "Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации": "Gets token based on the code from the GetAuthorizationLink page", "Загружает видео в группу с возможностью его дальнейшего использования": "Uploads video to the group for further use", -"Получает список ID товарных категорий для указания при создании товара": "Gets a list of product category IDs to specify when creating a product", "Устанавливает URL обработчика событий бота для работы в режиме Webhook": "Set webhook URL for bot event handling in webhook mode", -"access_token нужно будет забрать из параметра в строке адреса браузера": "access_token will need to be taken from the parameter in the browser address bar", +"Получает список ID товарных категорий для указания при создании товара": "Gets a list of product category IDs to specify when creating a product", "Двоичные данные или путь к файлу при указании параметра ПутьСохранения": "Binary data or file path when SavePath parameter is specified", +"access_token нужно будет забрать из параметра в строке адреса браузера": "access_token will need to be taken from the parameter in the browser address bar", "В следующий раз используйте опцию --out для указания пути их сохранения": "Next time, use the --out option to specify the path for saving", "Получает информацию о количестве использованного дискового пространства": "Gets information on the amount of used disk space", "Полную документацию можно найти по адресу: (https:\/\/openintegrations.dev": "Full documentation can be found at: (https:\/\/openintegrations.dev", -"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Инструменты.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Tools.os", "Получает соответствие ID Emoji для установки в качестве иконок тем форума": "Gets the mapping of Emoji IDs for setting as forum theme icons", +"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Инструменты.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Tools.os", "Получает список id рекламных категорий для создания рекламного объявления": "Gets a list of advertising category IDs for creating an advertising post", -"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Криптография.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Cryptography.os", "Метод для вставки в http-сервис, адрес которого указывается в redirect_uri": "Method for insertion into an http service, the address of which is specified in redirect_uri", +"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Криптография.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Cryptography.os", "URL вашего http-сервиса (или другого обработчика запросов) для авторизации": "URL of your http service (or other request handler) for authorization", "Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer": "From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer", -"Отправляет местоположение по географической широте и долготе в чат или канал": "Sends location by geographic latitude and longitude to a chat or channel", "Показывает значения, которые можно получить из переданного JSON и возвращает": "Displays the values that can be obtained from the passed JSON and returns", -"Получает код подтверждения и адрес страницы, на которой его необходимо ввести": "Gets the confirmation code and the address of the page where it needs to be entered", +"Отправляет местоположение по географической широте и долготе в чат или канал": "Sends location by geographic latitude and longitude to a chat or channel", "Размер файла. Если не заполнен > определяется автоматически скачиванием файла": "File size. If not filled in > determined automatically by downloading the file", +"Получает код подтверждения и адрес страницы, на которой его необходимо ввести": "Gets the confirmation code and the address of the page where it needs to be entered", "Все права защищены. Эта программа и сопроводительные материалы предоставляются": "All rights reserved. This program and accompanying materials are provided", +"1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1": "1, and something on 2: up to the point that they removed the ability to post tweets from v1", "Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer": "From Consumer Keys -> Access Token and Secret settings page of Twitter Developer", "Создает одну или массив записей по описанию или массиву описаний значений полей": "Creates one or an array of records by description or an array of field value descriptions", -"1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1": "1, and something on 2: up to the point that they removed the ability to post tweets from v1", "id приложения, которое необходимо создать в профиле на странице для разработчиков": "application ID that needs to be created in the profile on the developer page", "Вызывает метод получения токена, так как для получения токена из кода, приходящего": "Calls the token acquisition method, as for obtaining a token from the code received", "Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели": "Generates a simple JSON keyboard from an array of buttons for a message or bottom panel", "ID пользователя из информации о канале не подойдет для отправки сообщений через бота": "The user ID from channel information is not suitable for sending messages through the bot", "Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения": "Converts the code to a token after entering the code when executing GetConfirmationCode", -"Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя": "All pages created as children must have parent base properties", "|--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов": "|--> RefreshToken() ->| access_token --> Used in the interval of 2 hours for requests", "Файл не был записан! Используйте флаг --debug для получения дополнительной информации": "File was not saved! Use the --debug flag for more information", +"Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя": "All pages created as children must have parent base properties", "Описание структур см. здесь https:pkware.cachefly.net\/webdocs\/casestudies\/APPNOTE.TXT": "Description of structures see here https:pkware.cachefly.net\/webdocs\/casestudies\/APPNOTE.TXT", -"Получение ссылки для интерактивного получения токена (access_token), который необходим": "Getting a link for interactive token retrieval (access_token), which is necessary", "id группы с \"-\" в начале. Можно найти в настройках группы ВК или в ее URL, если не был": "group ID with \"-\" at the beginning. Can be found in the settings of the VK group or in its URL if not set", +"Получение ссылки для интерактивного получения токена (access_token), который необходим": "Getting a link for interactive token retrieval (access_token), which is necessary", "набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен": "a set of permissions for the received key. Can be any, but offline.access is mandatory", "Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer": "From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer", "можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях": "you can use an HTTP service. Information about new messages will also be sent there", "При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить": "For the next update, you need to use a new refresh_token, so hardcode", -"Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации": "Gets the token by the code obtained during authorization via the link from GetAuthorizationLink", "Приходит вместе с access_token и используется для его обновления (время жизни access_token": "Comes together with access_token and is used to refresh it (access_token lifetime", +"Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации": "Gets the token by the code obtained during authorization via the link from GetAuthorizationLink", "Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video": "Sends a set of files to a chat or channel. Media types: audio, document, photo, video", "Получает список первых файлов каталога или продолжает получение следующих при указании курсора": "Gets the list of the first files in the directory or continues getting the next ones when the cursor is specified", "который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована": "which will return 200 and a genuine SSL certificate. If there is a certificate and the database is published", diff --git a/service/dictionaries/keywords.json b/service/dictionaries/keywords.json new file mode 100644 index 0000000000..73282eae56 --- /dev/null +++ b/service/dictionaries/keywords.json @@ -0,0 +1,50 @@ +{ +"ВызватьИсключение":"Raise", +"Выполнить":"Execute", +"ДобавитьОбработчик":"AddHandler", +"Для":"For", +"Если":"If", +"Знач":"Val", +"И":"And", +"Из":"In", +"ИЛИ,Или":"Or", +"Иначе":"Else", +"ИначеЕсли":"ElsIf", +"Исключение":"Except", +"Истина":"True", +"Каждого,каждого":"Each,each", +"КонецЕсли":"EndIf", +"КонецПопытки":"EndTry", +"КонецПроцедуры":"EndProcedure", +"КонецФункции":"EndFunction", +"КонецЦикла":"EndDo", +"Не":"Not", +"Неопределено":"Undefined", +"Перейти":"Goto", +"Перем":"Var", +"По":"For", +"Пока":"WHile", +"Попытка":"Try", +"Процедура":"Procedure", +"Прервать":"Break", +"Продолжить":"Continue", +"Тогда":"Then", +"Цикл":"Do", +"УдалитьОбработчик":"RemoveHandler", +"Функция":"Function", +"Экспорт":"Export", +"ВебКлиент":"WebClient", +"ВнешнееСоединение":"ExternalConnection", +"КонецОбласти":"EndRegion", +"Клиент":"Client", +"МобильноеПриложениеКлиент":"MobileAppClient", +"МобильноеПриложениеСервер":"MobileAppServer", +"МобильныйКлиент":"MobileClient", +"НаКлиенте":"AtClient", +"НаСервере":"AtServer", +"Область":"Region", +"Сервер":"Server", +"ТолстыйКлиентОбычноеПриложение":"ThickClientOrdinaryApplication", +"ТолстыйКлиентУправляемоеПриложение":"ThickClientManagedApplication", +"ТонкийКлиент":"ThinClient" +} \ No newline at end of file diff --git a/service/interim/en/OPI/.project b/service/interim/en/OPI/.project new file mode 100644 index 0000000000..5b6683c1ce --- /dev/null +++ b/service/interim/en/OPI/.project @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>OPI</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.xtext.ui.shared.xtextBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.xtext.ui.shared.xtextNature</nature> + <nature>com._1c.g5.v8.dt.core.V8ExtensionNature</nature> + </natures> +</projectDescription> diff --git a/service/interim/en/OPI/.settings/org.eclipse.core.resources.prefs b/service/interim/en/OPI/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..d21dc84127 --- /dev/null +++ b/service/interim/en/OPI/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/service/interim/en/OPI/DT-INF/PROJECT.PMF b/service/interim/en/OPI/DT-INF/PROJECT.PMF new file mode 100644 index 0000000000..f82b4856d1 --- /dev/null +++ b/service/interim/en/OPI/DT-INF/PROJECT.PMF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Runtime-Version: 8.3.15 +Base-Project: OpenIntegrations diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl new file mode 100644 index 0000000000..719401ad78 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl @@ -0,0 +1,681 @@ +// Location OS: ./OInt/core/Modules/OPI_Airtable.os +// Library: Airtable +// CLI Command: airtable + +// 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:IncorrectLineBreak-off + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region DatabaseWork + +// Get list of bases +// Gets the list of available bases +// +// Parameters: +// Token - String - Token - token +// Indent - String - Next page identifier of the base list from the previous request - offset +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function GetListOfBases(Val Token, Val Indent = "") Export + + OPI_TypeConversion.GetLine(Indent); + + URL = "https://api.airtable.com/v0/meta/bases"; + Headers = GetAuthorizationHeader(Token); + Parameters = New Structure; + + OPI_Tools.AddField("offset", Indent, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get base tables +// Gets the schema of base tables +// +// Parameters: +// Token - String - Token - token +// Base - String - Base identifier - base +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function GetDatabaseTables(Val Token, Val Base) Export + + OPI_TypeConversion.GetLine(Base); + + URL = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables"; + Headers = GetAuthorizationHeader(Token); + + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +// Create base +// Creates a new database +// +// Parameters: +// Token - String - Token - token +// Workspace - String - Workspace identifier - ws +// Name - String - New base name - title +// TableCollection - Key-Value Pair - Table description: Key > name, Value > array of fields - tablesdata +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function CreateDatabase(Val Token, Val Workspace, Val Name, Val TableCollection) Export + + OPI_TypeConversion.GetCollection(TableCollection); + + If Not TypeValue(TableCollection) = Type("Structure") + And Not TypeValue(TableCollection) = Type("Match") Then + + Raise "Error in table collection data"; + + EndIf; + + URL = "https://api.airtable.com/v0/meta/bases"; + Headers = GetAuthorizationHeader(Token); + TableArray = New Array; + + For Each Table In TableCollection Do + + Description = GenerateTableDescription(Table.Key, Table.Value); + TableArray.Add(Description); + + EndDo; + + Parameters = New Structure; + OPI_Tools.AddField("name" , Name , "String", Parameters); + OPI_Tools.AddField("tables" , TableArray , "Array", Parameters); + OPI_Tools.AddField("workspaceId", Workspace, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region TableManagement + +// Create table +// Creates a new table in the base +// +// Parameters: +// Token - String - Token - token +// Base - String - Base identifier - base +// Name - String - New table name - title +// FieldArray - Array of Structures - Array of field descriptions - fieldsdata +// Description - String - Table description - description +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function CreateTable(Val Token, Val Base, Val Name, Val FieldArray, Val Description = "") Export + + OPI_TypeConversion.GetLine(Base); + + URL = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables"; + Headers = GetAuthorizationHeader(Token); + Parameters = GenerateTableDescription(Name, FieldArray, Description); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Modify table +// Changes the name and/or description of the base +// +// Parameters: +// Token - String - Token - token +// Base - String - Base identifier - base +// Table - String - Table identifier - table +// Name - String - New name - title +// Description - String - New description - description +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function ModifyTable(Val Token, Val Base, Val Table, Val Name = "", Val Description = "") Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + + URL = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables/" + Table; + Headers = GetAuthorizationHeader(Token); + Parameters = New Structure; + + OPI_Tools.AddField("name" , Name, "String", Parameters); + OPI_Tools.AddField("description", Description , "String", Parameters); + + Response = OPI_Tools.Patch(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region FieldWork + +// Create field +// Creates a new field in the table +// +// Parameters: +// Token - String - Token - token +// Base - String - Base identifier - base +// Table - String - Table identifier - table +// FieldStructure - Structure of Key-Value - Description of the new field - fielddata +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function CreateField(Val Token, Val Base, Val Table, Val FieldStructure) Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetCollection(FieldStructure); + + If Not TypeValue(FieldStructure) = Type("Structure") + And Not TypeValue(FieldStructure) = Type("Match") Then + + Raise "Error in field description data"; + + EndIf; + + URL = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables/" + Table + "/fields"; + Headers = GetAuthorizationHeader(Token); + + Response = OPI_Tools.Post(URL, FieldStructure, Headers); + + Return Response; + +EndFunction + +// Modify field +// Changes the name and/or description of an existing table field +// +// Parameters: +// Token - String - Token - token +// Base - String - Base identifier Base - base +// Table - String - Table identifier - table +// Field - String - Field identifier - field +// Name - String - New name - title +// Description - String - New description - description +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function ModifyField(Val Token, Val Base, Val Table, Val Field, Val Name = "", Val Description = "") Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetLine(Field); + + URL = "https://api.airtable.com/v0/meta/bases/" + + Base + + "/tables/" + + Table + + "/fields/" + + Field; + + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure(); + OPI_Tools.AddField("name" , Name, "String", Parameters); + OPI_Tools.AddField("description", Description , "String", Parameters); + + Response = OPI_Tools.Patch(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get поле (withтроtoоinое) +// Gets the description of a string field +// +// Parameters: +// Name - String - New field name - title +// +// Return value: +// Structure - Field description +Function GetStringField(Val Name) Export + Return PrimitiveFieldDescription(Name, "richText"); +EndFunction + +// Get поле (чиwithлоinое) +// Gets the description of a numeric field +// +// Parameters: +// Name - String - New field name - title +// Precision - Number, String - Number of decimal places - precision +// +// Return value: +// Structure - Field description +Function GetNumberField(Val Name, Val Precision = 0) Export + + OPI_TypeConversion.GetNumber(Precision); + + OptionsStructure = New Structure("precision", Precision); + Return PrimitiveFieldDescription(Name, "number", OptionsStructure); + +EndFunction + +// Get поле (file) +// Gets the description of a file field +// +// Parameters: +// Name - String - Field name - title +// +// Return value: +// Structure - Field description +Function GetAttachmentField(Val Name) Export + Return PrimitiveFieldDescription(Name, "multipleAttachments"); +EndFunction + +// Get поле (флажоto) +// Gets the description of a boolean field +// +// Parameters: +// Name - String - Field name - title +// +// Return value: +// Structure - Field description +Function GetCheckboxField(Val Name) Export + + OptionsStructure = New Structure("icon,color", "check", "yellowBright"); + Return PrimitiveFieldDescription(Name, "checkbox", OptionsStructure); + +EndFunction + +// Get поле (dата) +// Gets the description of a date field +// +// Parameters: +// Name - String - Field name - title +// +// Return value: +// Structure - Field description +Function GetDateField(Val Name) Export + + FormatStructure = New Structure("format,name", "YYYY-MM-DD", "iso"); + OptionsStructure = New Structure("dateFormat", FormatStructure); + + Return PrimitiveFieldDescription(Name, "date", OptionsStructure); + +EndFunction + +// Get поле (email) +// Gets the description of an email field +// +// Parameters: +// Name - String - Field name - title +// +// Return value: +// Structure - Field description +Function GetEmailField(Val Name) Export + Return PrimitiveFieldDescription(Name, "email"); +EndFunction + +// Get поле (телефон) +// Gets the description of a phone number field +// +// Parameters: +// Name - String - Field name - title +// +// Return value: +// Structure - Field description +Function GetPhoneField(Val Name) Export + Return PrimitiveFieldDescription(Name, "phoneNumber"); +EndFunction + +// Get поле (url) +// Gets the description of a URL field +// +// Parameters: +// Name - String - Field name - title +// +// Return value: +// Structure - Field description +Function GetLinkField(Val Name) Export + Return PrimitiveFieldDescription(Name, "url"); +EndFunction + +#EndRegion + +#Region RecordManagement + +// Get list of records +// Gets the list of records of the selected table +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Indent - String - Next page identifier of data from the previous request - offset +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function GetListOfRecords(Val Token, Val Base, Val Table, Val Indent = "") Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure(); + OPI_Tools.AddField("offset", Indent, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get record +// Gets row data of the table by identifier +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Record - String - Record identifier in the table - record +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function GetRecord(Val Token, Val Base, Val Table, Val Record) Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetLine(Record); + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record; + Headers = GetAuthorizationHeader(Token); + + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +// Create records +// Creates one or an array of records by description or an array of field value descriptions +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Data - Structure, Array of Structures - Set or array of sets of Key : Value pairs > Field : Indicator - data +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function CreatePosts(Val Token, Val Base, Val Table, Val Data) Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetCollection(Data); + + Parameters = New Structure(); + AddDataDescription(Data, Parameters); + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table; + Headers = GetAuthorizationHeader(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Delete records +// Deletes one or an array of records by identifiers +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Records - String, Array of Strings - Identifier or array of record identifiers - records +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function DeletePosts(Val Token, Val Base, Val Table, Val Records) Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetArray(Records); + + RecordString = ""; + + For Each Record In Records Do + RecordString = RecordString + + ?(ValueFilled(RecordString), "&", "?") + + "records[]=" + + OPI_Tools.NumberToString(Record); + EndDo; + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table + RecordString; + Headers = GetAuthorizationHeader(Token); + + Response = OPI_Tools.Delete(URL, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region CommentManagement + +// Get comments +// Gets the list of comments for a record in the table +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Record - String - Record identifier in the table - record +// Indent - String - Next page identifier of data from the previous request - offset +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function GetComments(Val Token, Val Base, Val Table, Val Record, Val Indent = "") Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetLine(Record); + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure(); + OPI_Tools.AddField("offset", Indent, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Create comment +// Creates a comment for a record in the table +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Record - String - Record identifier in the table - record +// Text - String - Comment text - text +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function CreateComment(Val Token, Val Base, Val Table, Val Record, Val Text) Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetLine(Record); + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure(); + OPI_Tools.AddField("text", Text, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Modify comment +// Changes the text of an existing comment +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Record - String - Record identifier in the table - record +// Comment - String - Comment identifier - comment +// Text - String - New comment text - text +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function EditComment(Val Token, Val Base, Val Table, Val Record, Val Comment, Val Text) Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetLine(Record); + OPI_TypeConversion.GetLine(Comment); + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments/" + Comment; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure(); + OPI_Tools.AddField("text", Text, "String", Parameters); + + Response = OPI_Tools.Patch(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Delete comment +// Deletes a comment for a table record +// +// Parameters: +// Token - String - Token - token +// Base - String - Database identifier - base +// Table - String - Table identifier - table +// Record - String - Record identifier in the table - record +// Comment - String - Comment identifier - comment +// +// Return value: +// Key-Value Pair - serialized JSON response from Airtable +Function DeleteComment(Val Token, Val Base, Val Table, Val Record, Val Comment) Export + + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Table); + OPI_TypeConversion.GetLine(Record); + OPI_TypeConversion.GetLine(Comment); + + URL = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments/" + Comment; + Headers = GetAuthorizationHeader(Token); + + Response = OPI_Tools.Delete(URL, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function GetAuthorizationHeader(Val Token) + + OPI_TypeConversion.GetLine(Token); + + Headers = New Match; + Headers.Insert("Authorization", "Bearer " + Token); + + Return Headers; + +EndFunction + +Function GenerateTableDescription(Val Name, Val FieldArray, Val Description = "") + + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetCollection(FieldArray); + + TableDescription = New Structure("name,fields", Name, FieldArray); + + OPI_Tools.AddField("description", Description, "String", TableDescription); + + Return TableDescription; + +EndFunction + +Function PrimitiveFieldDescription(Val Name, Val Type, Val Options = "") + + FieldStructure = New Structure(); + OPI_Tools.AddField("name" , Name, "String" , FieldStructure); + OPI_Tools.AddField("type" , Type , "String" , FieldStructure); + OPI_Tools.AddField("options", Options , "Collection", FieldStructure); + + Return FieldStructure; + +EndFunction + +Procedure AddDataDescription(Val Data, Parameters) + + If TypeValue(Data) = Type("Array") Then + + SendArray = New Array; + + For Each RecordDescription In Data Do + SendArray.Add(New Structure("fields", RecordDescription)); + EndDo; + + OPI_Tools.AddField("records", SendArray, "Array", Parameters); + + Else + + OPI_Tools.AddField("fields", Data, "Collection", Parameters); + + EndIf; + +EndProcedure + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo new file mode 100644 index 0000000000..a1ecfa6d68 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="457991ad-c2ad-49b8-a26a-9fc83c8a7d11"> + <name>OPI_Airtable</name> + <synonym> + <key></key> + <value>OPI airtable</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl new file mode 100644 index 0000000000..8cf5ebb25a --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl @@ -0,0 +1,961 @@ +// Location OS: ./OInt/core/Modules/OPI_Dropbox.os +// Library: Dropbox +// CLI Command: dropbox + +// 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:IncorrectLineBreak-off + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region AccountAndAuthorization + +// Get authorization link +// Generates an authorization link for browser transition +// +// Parameters: +// AppKey - String - Application key - appkey +// +// Return value: +// String - URL for browser transition +Function GetAuthorizationLink(Val AppKey) Export + + OPI_TypeConversion.GetLine(AppKey); + Return "https://www.dropbox.com/oauth2/authorize?client_id=" + + AppKey + + "&response_type=code&token_access_type=offline"; + +EndFunction + +// Get token +// Gets token based on the code from the GetAuthorizationLink page +// +// Parameters: +// AppKey - String - Application key - appkey +// AppSecret - String - Application secret - appsecret +// Code - String - Code from the authorization page - code +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetToken(Val AppKey, Val AppSecret, Val Code) Export + + URL = "https://api.dropbox.com/oauth2/token"; + DataType = "application/x-www-form-urlencoded; charset=utf-8"; + + Parameters = New Structure; + OPI_Tools.AddField("code" , Code , "String", Parameters); + OPI_Tools.AddField("grant_type", "authorization_code", "String", Parameters); + + URLStructure = OPI_Tools.SplitURL(URL); + Server = URLStructure["Server"]; + Address = URLStructure["Address"]; + + Request = OPI_Tools.CreateRequest(Address, , DataType); + Connection = OPI_Tools.CreateConnection(Server, AppKey, AppSecret); + + ParameterString = OPI_Tools.RequestParametersToString(Parameters); + Data = Right(ParameterString, StrLength(ParameterString) - 1); + + Request.SetBodyFromString(Data); + + Response = Connection.CallHTTPMethod("POST", Request); + OPI_Tools.ProcessResponse(Response); + + Return Response; + +EndFunction + +// Refresh token +// Gets a new token based on the refresh token +// +// Parameters: +// AppKey - String - Application key - appkey +// AppSecret - String - Application secret - appsecret +// RefreshToken - String - Refresh token - refresh +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function RefreshToken(Val AppKey, Val AppSecret, Val RefreshToken) Export + + String_ = "String"; + URL = "https://api.dropbox.com/oauth2/token"; + + Parameters = New Structure; + OPI_Tools.AddField("refresh_token", RefreshToken , String_, Parameters); + OPI_Tools.AddField("grant_type" , "refresh_token" , String_, Parameters); + OPI_Tools.AddField("client_id" , AppKey , String_, Parameters); + OPI_Tools.AddField("client_secret", AppSecret, String_, Parameters); + + Response = OPI_Tools.Post(URL, Parameters, , False); + + Return Response; + +EndFunction + +// Get account information +// Gets account information +// +// Parameters: +// Token - String - Token - token +// Account - String - Account ID. Current token account if not filled - account +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetAccountInformation(Val Token, Val Account = "") Export + + If ValueFilled(Account) Then + Result = GetAccount(Token, Account); + Else + Result = GetOwnAccount(Token); + EndIf; + + Return Result; + +EndFunction + +// Get space usage data +// Gets information on the amount of used disk space +// +// Parameters: +// Token - String - Token - token +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetSpaceUsageData(Val Token) Export + + URL = "https://api.dropboxapi.com/2/users/get_space_usage"; + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.PostBinary(URL + , GetBinaryDataFromString("null") + , Headers + , + , "text/plain; charset=dropbox-cors-hack"); + + Return Response; + +EndFunction + +#EndRegion + +#Region FileAndDirectoryManagement + +// Get object information +// Gets information about a file or directory +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object - path +// Detailed - Boolean - Adds additional information fields for media files - detail +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetObjectInformation(Val Token, Val Path, Val Detailed = False) Export + + URL = "https://api.dropboxapi.com/2/files/get_metadata"; + + Parameters = New Structure; + OPI_Tools.AddField("path" , Path , "String", Parameters); + OPI_Tools.AddField("include_media_info", Detailed, "Boolean", Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get list of folder files +// Gets the list of the first files in the directory or continues getting the next ones when the cursor is specified +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the directory. Optional if the cursor is specified - path +// Detailed - Boolean - Adds additional information fields for media files - detail +// Cursor - String - Cursor from the previous request to get the next set of files - cursor +// +// Return value: +// HTTPResponse - Get list of folder files +Function GetListOfFolderFiles(Val Token, Val Path = "", Val Detailed = False, Val Cursor = "") Export + + If Not ValueFilled(Cursor) Then + + URL = "https://api.dropboxapi.com/2/files/list_folder"; + + Parameters = New Structure; + OPI_Tools.AddField("path" , Path , "String", Parameters); + OPI_Tools.AddField("include_media_info", Detailed , "Boolean", Parameters); + + Else + + URL = "https://api.dropboxapi.com/2/files/list_folder/continue"; + + Parameters = New Structure; + OPI_Tools.AddField("cursor", Cursor, "String", Parameters); + + EndIf; + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get preview +// Forлучает PDF or HTML преinью объеtoта (тольtoо for тоtoументоin) +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object - path +// +// Return value: +// BinaryData - document preview +Function GetPreview(Val Token, Val Path) Export + + URL = "https://content.dropboxapi.com/2/files/get_preview"; + Response = ProcessObject(Token, URL, Path, True); + + Return Response; + +EndFunction + +// Upload file +// Uploads a file to the cloud drive +// +// Parameters: +// Token - String - Token - token +// File - String, BinaryData - Data file for upload - file +// Path - String - Save path on Dropbox - path +// Overwrite - Boolean - Overwrite file in case of path conflicts - overwrite +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function UploadFile(Val Token, Val File, Val Path, Val Overwrite = False) Export + + OPI_TypeConversion.GetBinaryData(File); + OPI_TypeConversion.GetBoolean(Overwrite); + OPI_TypeConversion.GetLine(Path); + + Mode = ?(Overwrite, "overwrite", "add"); + Size = File.Size(); + Boundary = 100000000; + + If Size > Boundary Then + Response = UploadLargeFile(Token, File, Path, Mode); + Else + Response = UploadSmallFile(Token, File, Path, Mode); + EndIf; + + Return Response; + +EndFunction + +// Upload file by URL +// Uploads a file to the cloud drive by fetching it from the specified URL +// +// Parameters: +// Token - String - Token - token +// FileURL - String - URL source of the file - url +// Path - String - Save path on Dropbox - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function UploadFileByURL(Val Token, Val FileURL, Val Path) Export + + URL = "https://api.dropboxapi.com/2/files/save_url"; + + Parameters = New Structure; + OPI_Tools.AddField("path", Path , "String", Parameters); + OPI_Tools.AddField("url" , FileURL , "String", Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get upload status by URL +// Gets the upload status of the file by URL +// +// Parameters: +// Token - String - Token - token +// JobID - String - ID of the asynchronous job from the UploadFileByURL response - job +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetUploadStatusByURL(Val Token, Val JobID) Export + + URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; + + Parameters = New Structure; + OPI_Tools.AddField("async_job_id", JobID, "String", Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Delete object +// Deletes an object from the cloud drive +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object to delete - path +// Irrecoverable - String - Delete object without the possibility of recovery - permanently +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function DeleteObject(Val Token, Val Path, Val Irretrievably = False) Export + + OPI_TypeConversion.GetBoolean(Irretrievably); + + If Irretrievably Then + URL = "https://api.dropboxapi.com/2/files/permanently_delete"; + Else + URL = "https://api.dropboxapi.com/2/files/delete_v2"; + EndIf; + + Response = ProcessObject(Token, URL, Path); + + Return Response; + +EndFunction + +// Copy object +// Copies a file or directory to the selected path +// +// Parameters: +// Token - String - Token - token +// From - String - Path to the original object - form +// To - String - Target path for the new object - to +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function CopyObject(Val Token, Val From, Val To) Export + + URL = "https://api.dropboxapi.com/2/files/copy_v2"; + + Parameters = New Structure; + OPI_Tools.AddField("from_path", From, "String", Parameters); + OPI_Tools.AddField("to_path" , To , "String", Parameters); + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Move object +// Moves an object to the selected path +// +// Parameters: +// Token - String - Token - token +// From - String - Path to the original object - form +// To - String - Target path for the new object - to +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function MoveObject(Val Token, Val From, Val To) Export + + URL = "https://api.dropboxapi.com/2/files/move_v2"; + + Parameters = New Structure; + OPI_Tools.AddField("from_path", From, "String", Parameters); + OPI_Tools.AddField("to_path" , To , "String", Parameters); + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Create folder +// Creates an empty directory at the selected path +// +// Parameters: +// Token - String - Token - token +// Path - String - Target path for creating the directory - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function CreateFolder(Val Token, Val Path) Export + + URL = "https://api.dropboxapi.com/2/files/create_folder_v2"; + Response = ProcessObject(Token, URL, Path); + + Return Response; + +EndFunction + +// Download file +// Downloads a file by the specified path or ID +// +// Parameters: +// Token - String - Token - token +// Path - String - Path or ID of the file - path +// +// Return value: +// BinaryData - binary data of the file +Function DownloadFile(Val Token, Val Path) Export + + URL = "https://content.dropboxapi.com/2/files/download"; + Response = ProcessObject(Token, URL, Path, True); + + Return Response; + +EndFunction + +// Download folder +// Downloads a zip archive with the contents of the specified directory +// +// Parameters: +// Token - String - Token - token +// Path - String - Path or ID of the directory - path +// +// Return value: +// BinaryData - binary data of the zip archive with the contents of the directory +Function DownloadFolder(Val Token, Val Path) Export + + URL = "https://content.dropboxapi.com/2/files/download_zip"; + Response = ProcessObject(Token, URL, Path, True); + + Return Response; + +EndFunction + +// Get list of object versions +// Gets the list of versions (revisions) of the object +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object - path +// Quantity - String, Number - Number of the latest versions of the object to display - amount +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetObjectVersionList(Val Token, Val Path, Val Quantity = 10) Export + + URL = "https://api.dropboxapi.com/2/files/list_revisions"; + + Parameters = New Structure; + OPI_Tools.AddField("path" , Path , "String", Parameters); + OPI_Tools.AddField("limit", Quantity, "Number" , Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Restore object to version +// Inоwithwithтаtoinлиinает withоwithтояние объеtoта to необхоdимой inерwithии (реinfromии) +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object - path +// Version - String - ID of the version (revision) for restoration - rev +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function RestoreObjectToVersion(Val Token, Val Path, Val Version) Export + + URL = "https://api.dropboxapi.com/2/files/restore"; + + Parameters = New Structure; + OPI_Tools.AddField("path", Path , "String", Parameters); + OPI_Tools.AddField("rev" , Version, "String", Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region TagWork + +// Get list of tags +// Gets the list of tags of the selected files +// +// Parameters: +// Token - String - Token - token +// Paths - String, Array of Strings - Path or set of paths to the files - paths +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetTagList(Val Token, Val Paths) Export + + URL = "https://api.dropboxapi.com/2/files/tags/get"; + + Parameters = New Structure; + OPI_Tools.AddField("paths", Paths, "Array", Parameters); + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Add tag +// Adds a new text tag to a file or directory +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object for which the tag needs to be created - path +// Tag - String - Tag text - tag +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function AddTag(Val Token, Val Path, Val Tag) Export + + Return ProcessTag(Token, Path, Tag); + +EndFunction + +// Delete tag +// Deletes the text tag of a file or directory +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object whose tag needs to be deleted - path +// Tag - String - Tag text - tag +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function DeleteTag(Val Token, Val Path, Val Tag) Export + + Return ProcessTag(Token, Path, Tag, True); + +EndFunction + +#EndRegion + +#Region SharedAccessSettings + +// Publish folder +// Sets the directory to public access mode +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the target directory - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function PublishFolder(Val Token, Val Path) Export + + URL = "https://api.dropboxapi.com/2/sharing/share_folder"; + Response = ProcessObject(Token, URL, Path); + + Return Response; + +EndFunction + +// Unpublish folder +// Cancels the public access mode for the directory +// +// Parameters: +// Token - String - Token - token +// FolderID - String - ID публичного directory (shared folder ID) - folder +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function CancelFolderPublication(Val Token, Val FolderID) Export + + URL = "https://api.dropboxapi.com/2/sharing/unshare_folder"; + + Parameters = New Structure; + OPI_Tools.AddField("shared_folder_id", FolderID, "String", Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Add user to file +// Defines access to the file for an external user +// +// Parameters: +// Token - String - Token - token +// FileID - String - ID of the file to be accessed - fileid +// EmailAddresses - String, Array of Strings - List of email addresses of users being added - emails +// ViewOnly - Boolean - Prohibits file editing for the external user - readonly +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function AddUsersToFile(Val Token, Val FileID, Val EmailAddresses, Val ViewOnly = True) Export + + String_ = "String"; + + OPI_TypeConversion.GetArray(EmailAddresses); + OPI_TypeConversion.GetLine(FileID); + OPI_TypeConversion.GetBoolean(ViewOnly); + + If Not StringStartsWith(FileID, "id:") Then + FileID = "id:" + FileID; + EndIf; + + URL = "https://api.dropboxapi.com/2/sharing/add_file_member"; + + ArrayOfUsers = New Array; + + For Each Address In EmailAddresses Do + + UserData = New Match; + OPI_Tools.AddField(".tag" , "email", String_, UserData); + OPI_Tools.AddField("email", Address , String_, UserData); + + ArrayOfUsers.Add(UserData); + + EndDo; + + Parameters = New Structure; + OPI_Tools.AddField("file" , FileID , String_, Parameters); + OPI_Tools.AddField("members", ArrayOfUsers , "Array", Parameters); + + Mode = ?(ViewOnly, "viewer", "editor"); + + OPI_Tools.AddField("access_level", Mode , String_, Parameters); + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Add users to folder +// Grants external users access to the directory +// +// Parameters: +// Token - String - Token - token +// FolderID - String - ID публичного directory (shared folder ID) - folder +// EmailAddresses - String, Array of Strings - List of email addresses of users being added - emails +// ViewOnly - Boolean - Prohibits file editing for the external user - readonly +// +// Return value: +// Undefined - empty response +Function AddUsersToFolder(Val Token, Val FolderID, Val EmailAddresses, Val ViewOnly = True) Export + + String_ = "String"; + + OPI_TypeConversion.GetArray(EmailAddresses); + OPI_TypeConversion.GetBoolean(ViewOnly); + Mode = ?(ViewOnly, "viewer", "editor"); + + URL = "https://api.dropboxapi.com/2/sharing/add_folder_member"; + + ArrayOfUsers = New Array; + + For Each Address In EmailAddresses Do + + UserData = New Match; + OPI_Tools.AddField(".tag" , "email", String_, UserData); + OPI_Tools.AddField("email", Address , String_, UserData); + + UserStructure = New Structure("member,access_level", UserData, Mode); + + ArrayOfUsers.Add(UserStructure); + + EndDo; + + Parameters = New Structure; + OPI_Tools.AddField("shared_folder_id", FolderID , String_, Parameters); + OPI_Tools.AddField("members" , ArrayOfUsers , "Array", Parameters); + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get asynchronous change status +// Gets the status of the asynchronous access change job +// +// Parameters: +// Token - String - Token - token +// JobID - String - AsynchronousJobID - job +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function GetAsynchronousChangeStatus(Val Token, Val JobID) Export + + URL = "https://api.dropboxapi.com/2/sharing/check_job_status"; + + Parameters = New Structure; + OPI_Tools.AddField("async_job_id", JobID, "String", Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Unpublish file +// Prohibits access to the file for external users +// +// Parameters: +// Token - String - Token - token +// FileID - String - ID of the file to be accessed - fileid +// +// Return value: +// Key-Value Pair - serialized JSON response from Dropbox +Function CancelFilePublication(Val Token, Val FileID) Export + + OPI_TypeConversion.GetLine(FileID); + + If Not StringStartsWith(FileID, "id:") Then + FileID = "id:" + FileID; + EndIf; + + URL = "https://api.dropboxapi.com/2/sharing/unshare_file"; + + Parameters = New Structure; + OPI_Tools.AddField("file", FileID, "String", Parameters); + + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function ProcessObject(Val Token, Val URL, Val Path, Val InHeaders = False) + + Parameters = New Structure; + OPI_Tools.AddField("path", Path, "String", Parameters); + + If InHeaders Then + Headers = GetRequestHeaders(Token, Parameters); + Response = OPI_Tools.PostBinary(URL, GetBinaryDataFromString(""), Headers); + Else + Headers = GetRequestHeaders(Token); + Response = OPI_Tools.Post(URL, Parameters, Headers); + EndIf; + + Return Response; + +EndFunction + +Function ProcessTag(Val Token, Val Path, Val Tag, Val ThisIsDeletion = False) + + If ThisIsDeletion Then + URL = "https://api.dropboxapi.com/2/files/tags/remove"; + Else + URL = "https://api.dropboxapi.com/2/files/tags/add"; + EndIf; + + Parameters = New Structure; + OPI_Tools.AddField("path" , Path, "String", Parameters); + OPI_Tools.AddField("tag_text" , Tag , "String", Parameters); + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +Function GetRequestHeaders(Val Token, Val Parameters = "") + + OPI_TypeConversion.GetLine(Token); + + Headers = New Match; + Headers.Insert("Authorization" , "Bearer " + Token); + + If ValueFilled(Parameters) Then + + JSON = OPI_Tools.JSONString(Parameters, "No"); + JSON = StringReplace(JSON, Symbols.VK + Symbols.PS, ""); + + Headers.Insert("Dropbox-API-Arg", JSON); + + EndIf; + + Return Headers; + +EndFunction + +Function UploadLargeFile(Val Token, Val File, Val Path, Val Mode) + + URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; + + ChunkSize = 100000000; + CurrentPosition = 0; + BytesRead = 0; + TotalSize = File.Size(); + Session = OpenSession(Token); + + WHile BytesRead < TotalSize Do + + Indent = CurrentPosition; + Cursor = New Structure("offset,session_id", Indent, Session); + + Parameters = New Structure("cursor", Cursor); + Headers = GetRequestHeaders(Token, Parameters); + + ReadingData = New ReadingData(File); + BytesRead = ReadingData.Skip(CurrentPosition); + Result = ReadingData.Read(ChunkSize); + Current data = Result.GetBinaryData(); + CurrentSize = Current data.Size(); + NextPosition = CurrentPosition + CurrentSize; + + If Not ValueFilled(Current data) Then + Break; + EndIf; + + Response = OPI_Tools.PostBinary(URL, Current data, Headers); + + CurrentPosition = NextPosition; + + // !OInt KBytes = 1024; + // !OInt MByte = KBytes * KBytes; + // !OInt Notify(OPI_Tools.ProgressInformation(CurrentPosition, TotalSize, "MB", MByte)); + + // !OInt PerformGarbageCollection(); + // !OInt ReleaseObject(Current data); + + EndDo; + + Response = CloseSession(Token, Path, Mode, TotalSize, Session); + + Return Response; + +EndFunction + +Function UploadSmallFile(Val Token, Val File, Val Path, Val Mode) + + Boolean_ = "Boolean"; + String_ = "String"; + URL = "https://content.dropboxapi.com/2/files/upload"; + + Parameters = New Structure; + + OPI_Tools.AddField("autorename" , False , Boolean_, Parameters); + OPI_Tools.AddField("mode" , Mode, String_, Parameters); + OPI_Tools.AddField("mute" , False , Boolean_, Parameters); + OPI_Tools.AddField("path" , Path , String_, Parameters); + OPI_Tools.AddField("strict_conflict", False , Boolean_, Parameters); + + Headers = GetRequestHeaders(Token, Parameters); + + Response = OPI_Tools.PostBinary(URL, File, Headers); + + Return Response; + +EndFunction + +Function OpenSession(Val Token) + + SessionId = "session_id"; + URL = "https://content.dropboxapi.com/2/files/upload_session/start"; + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.PostBinary(URL, GetBinaryDataFromString(""), Headers); + + Return Response[SessionId]; + +EndFunction + +Function CloseSession(Val Token, Val Path, Val Mode, Val TotalSize, Val Session) + + URL = "https://content.dropboxapi.com/2/files/upload_session/finish"; + + Commit = New Structure(); + OPI_Tools.AddField("mode", Mode, "String", Commit); + OPI_Tools.AddField("path", Path, "String", Commit); + + Cursor = New Structure("offset,session_id", TotalSize, Session); + + Parameters = New Structure("commit,cursor", Commit, Cursor); + Headers = GetRequestHeaders(Token, Parameters); + + Response = OPI_Tools.PostBinary(URL, GetBinaryDataFromString(""), Headers); + + Return Response; + +EndFunction + +Function GetAccount(Val Token, Val Account) + + URL = "https://api.dropboxapi.com/2/users/get_account"; + + Parameters = New Structure; + OPI_Tools.AddField("account_id", Account, "String", Parameters); + + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +Function GetOwnAccount(Val Token) + + URL = "https://api.dropboxapi.com/2/users/get_current_account"; + Headers = GetRequestHeaders(Token); + + Response = OPI_Tools.PostBinary(URL + , GetBinaryDataFromString("null") + , Headers + , + , "text/plain; charset=dropbox-cors-hack"); + + Return Response; + +EndFunction + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo new file mode 100644 index 0000000000..fb078b30c9 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="66ce7792-41e5-47e4-bfad-2dcff1c96287"> + <name>OPI_Dropbox</name> + <synonym> + <key></key> + <value>OPI dropbox</value> + </synonym> + <synonym> + <key>ru</key> + <value>Drop box</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl new file mode 100644 index 0000000000..bc9071245d --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl @@ -0,0 +1,631 @@ +// Location OS: ./OInt/core/Modules/OPI_GoogleCalendar.os +// Library: Google Calendar +// CLI Command: gcalendar + +// 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 + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region CalendarMetadataManagement + +// Create calendar +// Creates an empty calendar +// +// Parameters: +// Token - String - Token - token +// Name - String - Name of the created calendar - title +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function CreateCalendar(Val Token, Val Name) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Name); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars"; + + Parameters = New Structure; + Parameters.Insert("summary" , Name); + Parameters.Insert("timeZone", "Europe/Moscow"); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get calendar +// Gets calendar information by ID +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetCalendarMetadata(Val Token, Val Calendar) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Calendar; + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +// Edit calendar +// Edits properties of an existing calendar +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// Name - String - New name - title +// Description - String - New calendar description - description +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function EditCalendarMetadata(Val Token + , Val Calendar + , Val Name = "" + , Val Description = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetLine(Description); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Calendar; + + Parameters = New Structure; + + If ValueFilled(Name) Then + Parameters.Insert("summary", Name); + EndIf; + + If ValueFilled(Description) Then + Parameters.Insert("description", Description); + EndIf; + + Response = OPI_Tools.Patch(URL, Parameters, Headers, True); + + Return Response; + +EndFunction + +// Clear primary calendar +// Clears the event list of the primary calendar +// +// Parameters: +// Token - String - Token - token +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function ClearMainCalendar(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; + Response = OPI_Tools.Post(URL, , Headers, False); + + Return Response; + +EndFunction + +// Delete calendar +// Deletes a calendar by ID +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function DeleteCalendar(Val Token, Val Calendar) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Calendar; + Response = OPI_Tools.Delete(URL, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region CalendarListManagement + +// Get list of calendars +// Gets an array of account calendars +// +// Parameters: +// Token - String - Token - token +// +// Return value: +// Key-Value Pair - Array of calendar data mappings +Function GetCalendarList(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + ArrayOfCalendars = New Array; + + GetCalendarsListRecursively(Headers, ArrayOfCalendars); + + Return ArrayOfCalendars; + +EndFunction + +// Add calendar to list +// Adds an existing calendar to the user's list +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function AddCalendarToList(Val Token, Val Calendar) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; + + Parameters = New Structure; + Parameters.Insert("id", Calendar); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get list calendar +// Gets a calendar from the user's list by ID +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetListCalendar(Val Token, Val Calendar) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Calendar; + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +// Remove calendar from list +// Removes a calendar from the user's list +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function DeleteCalendarFromList(Val Token, Val Calendar) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Calendar; + Response = OPI_Tools.Delete(URL, , Headers); + + Return Response; + +EndFunction + +// Edit list calendar +// Edits the properties of a calendar from the user's list +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// PrimaryColor - String - HEX mainоinного цinета (#ffffff) - primary +// SecondaryColor - String - HEX addолнительного цinета (#ffffff) - secondary +// Hidden - Boolean - Hidden calendar - hidden +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function EditListCalendar(Val Token + , Val Calendar + , Val PrimaryColor + , Val SecondaryColor + , Val Hidden = False) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + OPI_TypeConversion.GetLine(PrimaryColor); + OPI_TypeConversion.GetLine(SecondaryColor); + OPI_TypeConversion.GetBoolean(Hidden); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Calendar + "?colorRgbFormat=true"; + + Parameters = New Match; + Parameters.Insert("hidden" , Hidden); + Parameters.Insert("foregroundColor", PrimaryColor); + Parameters.Insert("backgroundColor", SecondaryColor); + + Response = OPI_Tools.Put(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region EventManagement + +// Get event description !NOCLI +// +// Return value: +// Key-Value Pair - Empty event template +Function GetEventDescription() Export + + CurrentDate = OPI_Tools.GetCurrentDate(); + Hour = 3600; + Event = New Match; + + Event.Insert("Description" , ""); // Event description + Event.Insert("Title" , "New event"); // Title events + Event.Insert("Venue" , ""); // String description of the venue of the event + Event.Insert("StartDate" , CurrentDate); // Date of start events + Event.Insert("EndDate" , CurrentDate + Hour); // Date of end events + Event.Insert("ArrayOfAttachmentURLs", New Match); // Key - name, Value - URL to file + Event.Insert("SendNotifications" , True); // Indication of sending notifications to participants + + Return Event; + +EndFunction + +// Get list of events +// Gets the list of all calendar events +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// +// Return value: +// Key-Value Pair - Array of event mappings +Function GetEventList(Val Token, Val Calendar) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + ArrayOfEvents = New Array; + + GetEventsListRecursively(Headers, Calendar, ArrayOfEvents); + + Return ArrayOfEvents; + +EndFunction + +// Get event +// Gets an event by ID +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// Event - String - Event ID - event +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetEvent(Val Token, Val Calendar, Val Event) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + OPI_TypeConversion.GetLine(Event); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Calendar + + "/events/" + + Event; + + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +// Create event +// Creates a new event +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// EventDescription - Key-Value Pair - Event description - props +// +// Return value: +// String, Arbitrary, HTTPResponse, BinaryData, Undefined - Google server response +Function CreateEvent(Val Token, Val Calendar, Val EventDescription) Export + Return EventManagement(Token, Calendar, EventDescription); +EndFunction + +// Move event +// Moves an event to another calendar +// +// Parameters: +// Token - String - Token - token +// SourceCalendar - String - ID of the source calendar - from +// TargetCalendar - String - ID of the target calendar - to +// Event - String - ID of the source calendar event - event +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function MoveEvent(Val Token, Val SourceCalendar, Val TargetCalendar, Val Event) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(SourceCalendar); + OPI_TypeConversion.GetLine(TargetCalendar); + OPI_TypeConversion.GetLine(Event); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + SourceCalendar + + "/events/" + + Event + + "/move?destination=" + + TargetCalendar; + + Response = OPI_Tools.Post(URL, , Headers); + + Return Response; + +EndFunction + +// Edit event +// Edits an existing event +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// EventDescription - String - New event description - props +// Event - String - Event ID - event +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function EditEvent(Val Token, Val Calendar, Val EventDescription, Val Event) Export + Return EventManagement(Token, Calendar, EventDescription, Event); +EndFunction + +// Delete event +// Deletes an event by ID +// +// Parameters: +// Token - String - Token - token +// Calendar - String - Calendar ID - calendar +// Event - String - Event ID - event +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function DeleteEvent(Val Token, Val Calendar, Val Event) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + OPI_TypeConversion.GetLine(Event); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Calendar + + "/events/" + + Event; + + Response = OPI_Tools.Delete(URL, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function ConvertDate(Val Date) + + OPI_TypeConversion.GetDate(Date); + + DateStructure = New Structure; + + If Not TypeValue(Date) = Type("Date") Then + Return Undefined; + EndIf; + + If Date = StartOfDay(Date) Then + DateFormat = "DF=yyyy-MM-dd"; + Field = "date"; + Else + DateFormat = "DF=yyyy-MM-ddTHH:mm:ssZ"; + Field = "dateTime"; + EndIf; + + Date = Format(Date, DateFormat); + DateStructure.Insert(Field , Date); + DateStructure.Insert("timeZone", "Europe/Moscow"); + + Return DateStructure; + +EndFunction + +Function ConvertAttachments(Val Attachments) + + OPI_TypeConversion.GetCollection(Attachments); + + AttachmentsArray = New Array; + + If TypeValue(Attachments) = Type("Match") Or TypeValue(Attachments) = Type("Structure") Then + + For Each Attachment In Attachments Do + + CurrentAttachment = New Structure; + CurrentAttachment.Insert("title" , Attachment.Key); + CurrentAttachment.Insert("fileUrl", Attachment.Value); + + AttachmentsArray.Add(CurrentAttachment); + + EndDo; + + EndIf; + + If AttachmentsArray.Quantity() > 0 Then + Return AttachmentsArray; + Else + Return Undefined; + EndIf; + +EndFunction + +Function EventManagement(Val Token, Val Calendar, Val EventDescription, Val Event = "") + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Calendar); + OPI_TypeConversion.GetLine(Event); + OPI_TypeConversion.GetCollection(EventDescription); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + Existing = ValueFilled(Event); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Calendar + + "/events" + + ?(Existing, "/" + Event, ""); + + Date0 = EventDescription["StartDate"]; + Date1 = EventDescription["EndDate"]; + Attachments = EventDescription["ArrayOfAttachmentURLs"]; + Attachments = ConvertAttachments(Attachments); + Notifications = ?(EventDescription["SendNotifications"] = Undefined + , False + , EventDescription["SendNotifications"]); + + Parameters = New Structure; + Parameters.Insert("summary" , EventDescription["Title"]); + Parameters.Insert("description", EventDescription["Description"]); + Parameters.Insert("location" , EventDescription["Venue"]); + Parameters.Insert("start" , ConvertDate(Date0)); + Parameters.Insert("end" , ConvertDate(Date1)); + Parameters.Insert("attachments", Attachments); + + URLParameters = New Structure; + URLParameters.Insert("sendUpdates" , ?(Notifications, "all", "none")); + URLParameters.Insert("supportsAttachments" , ?(ValueFilled(Attachments), "true", "false")); + + URL = URL + OPI_Tools.RequestParametersToString(URLParameters); + + OPI_Tools.RemoveEmptyCollectionFields(Parameters); + + If Existing Then + Response = OPI_Tools.Patch(URL, Parameters, Headers, True); + Else + Response = OPI_Tools.Post(URL, Parameters, Headers, True); + EndIf; + + Return Response; + +EndFunction + +Procedure GetCalendarsListRecursively(Val Headers, ArrayOfCalendars, Page = "") + + Items = "items"; + NPT = "nextPageToken"; + Parameters = New Structure; + + If ValueFilled(Page) Then + Parameters.Insert("pageToken", Page); + EndIf; + + Result = OPI_Tools.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList" + , Parameters + , Headers); + + Calendars = Result[Items]; + Page = Result[NPT]; + + For Each Calendar In Calendars Do + ArrayOfCalendars.Add(Calendar); + EndDo; + + If Calendars.Quantity() > 0 And ValueFilled(Page) Then + GetCalendarsListRecursively(Headers, ArrayOfCalendars, Page); + EndIf; + +EndProcedure + +Procedure GetEventsListRecursively(Val Headers, Val Calendar, ArrayOfEvents, Page = "") + + Items = "items"; + NPT = "nextPageToken"; + Parameters = New Structure; + + If ValueFilled(Page) Then + Parameters.Insert("pageToken", Page); + EndIf; + + Result = OPI_Tools.Get("https://www.googleapis.com/calendar/v3/calendars/" + Calendar + "/events" + , Parameters + , Headers); + + Events = Result[Items]; + Page = Result[NPT]; + + For Each Event In Events Do + ArrayOfEvents.Add(Event); + EndDo; + + If Events.Quantity() > 0 And ValueFilled(Page) Then + GetEventsListRecursively(Headers, ArrayOfEvents, Page); + EndIf; + +EndProcedure + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo new file mode 100644 index 0000000000..aefdff4c4f --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="d27d4ffb-31c2-4362-bd6d-d785ce171b49"> + <name>OPI_GoogleCalendar</name> + <synonym> + <key></key> + <value>OPI google calendar</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl new file mode 100644 index 0000000000..4e775dd3a3 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl @@ -0,0 +1,719 @@ +// Location OS: ./OInt/core/Modules/OPI_GoogleDrive.os +// Library: Google Drive +// CLI Command: gdrive + +// 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 + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region FileAndDirectoryManagement + +// Get object information +// Gets information about a folder or file by ID +// +// Parameters: +// Token - String - Token - token +// Identifier - String - Identifier of the file or folder - object +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetObjectInformation(Val Token, Val Identifier) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Identifier); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + Identifier; + + Parameters = New Structure; + Parameters.Insert("fields", "*"); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get list of directories +// Gets the list of drive directories +// +// Parameters: +// Token - String - Token - token +// NameContains - String - Filter by name - querry +// Detailed - Boolean - Adds a list of files to the directory fields - depth +// +// Return value: +// Key-Value Pair - Array of directory mappings +Function GetDirectoriesList(Val Token, Val NameContains = "", Val Detailed = False) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(NameContains); + OPI_TypeConversion.GetBoolean(Detailed); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + ArrayOfObjects = New Array; + Filter = New Array; + + Filter.Add("mimeType = 'application/vnd.google-apps.folder'"); + + If ValueFilled(NameContains) Then + Filter.Add("name contains '" + NameContains + "'"); + EndIf; + + GetObjectsListRecursively(Headers, ArrayOfObjects, Detailed, Filter); + + If Detailed Then + BreakDownObjectsInDetail(Token, ArrayOfObjects); + EndIf; + + Return ArrayOfObjects; + +EndFunction + +// Get list of files +// Gets the list of files +// +// Parameters: +// Token - String - Token - token +// NameContains - String - Filter by name - querry +// Directory - String - Filter by parent directory ID - catalog +// +// Return value: +// Key-Value Pair - Array of file mappings +Function GetFilesList(Val Token, Val NameContains = "", Val Directory = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(NameContains); + OPI_TypeConversion.GetLine(Directory); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + ArrayOfObjects = New Array; + Filter = New Array; + + Filter.Add("mimeType != 'application/vnd.google-apps.folder'"); + + If ValueFilled(NameContains) Then + Filter.Add("name contains '" + NameContains + "'"); + EndIf; + + If ValueFilled(Directory) Then + Filter.Add("'" + Directory + "' in parents"); + EndIf; + + GetObjectsListRecursively(Headers, ArrayOfObjects, , Filter); + + Return ArrayOfObjects; + +EndFunction + +// Upload file +// Uploads a file to the drive +// +// Parameters: +// Token - String - Token - token +// File - BinaryData,String - File to be uploaded - file +// Description - Key-Value Pair - See GetFileDescription - props - JSON description or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function UploadFile(Val Token, Val File, Val Description) Export + Return FileManagement(Token, File, Description); +EndFunction + +// Create folder +// Creates an empty directory on the drive +// +// Parameters: +// Token - String - Token - token +// Name - String - Folder name - title +// Parent - String - Parent - catalog +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function CreateFolder(Val Token, Val Name, Val Parent = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetLine(Parent); + + Description = New Match; + Description.Insert("MIME" , "application/vnd.google-apps.folder"); + Description.Insert("Name" , Name); + Description.Insert("Description", ""); + Description.Insert("Parent", ?(ValueFilled(Parent), Parent, "root")); + + Return FileManagement(Token, , Description); + +EndFunction + +// Download file +// Gets file by ID +// +// Parameters: +// Token - String - Token - token +// Identifier - String - File identifier - object +// SavePath - String - File save path - out +// +// Return value: +// BinaryData,String - Binary data or file path when SavePath parameter is specified +Function DownloadFile(Val Token, Val Identifier, Val SavePath = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Identifier); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + Identifier; + + Parameters = New Match; + Parameters.Insert("alt", "media"); + + Response = OPI_Tools.Get(URL, Parameters , Headers, SavePath); + + Return Response; + +EndFunction + +// Copy object +// Copies file or directory +// +// Parameters: +// Token - String - Token - token +// Identifier - String - Object identifier - object +// NewName - String - New object name - title +// NewParent - String - New parent directory - catalog +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function CopyObject(Val Token, Val Identifier, Val NewName = "", Val NewParent = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(NewName); + OPI_TypeConversion.GetLine(Identifier); + OPI_TypeConversion.GetLine(NewParent); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + Identifier + "/copy"; + + Parameters = New Structure; + + If ValueFilled(NewName) Then + Parameters.Insert("name", NewName); + EndIf; + + If ValueFilled(NewParent) Then + + ArrayOfParents = New Array; + ArrayOfParents.Add(NewParent); + Parameters.Insert("parents", ArrayOfParents); + + EndIf; + + Response = OPI_Tools.Post(URL, Parameters , Headers, True); + + Return Response; + +EndFunction + +// Update file +// Updates file binary data +// +// Parameters: +// Token - String - Token - token +// Identifier - String - Identifier of the object to update - object +// File - BinaryData,String - File source for update - file +// NewName - String - Nоinое имя file (еwithли необхоdимо) - title +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function UpdateFile(Val Token, Val Identifier, Val File, Val NewName = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Identifier); + OPI_TypeConversion.GetLine(NewName); + OPI_TypeConversion.GetBinaryData(File); + + If ValueFilled(NewName) Then + Description = New Match; + Description.Insert("Name", NewName); + Else + Description = ""; + EndIf; + + Return FileManagement(Token, File, Description, Identifier); + +EndFunction + +// Delete object +// Deletes file or directory by ID +// +// Parameters: +// Token - String - Token - token +// Identifier - String - Identifier of the object to delete - object +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function DeleteObject(Val Token, Val Identifier) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Identifier); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + Identifier; + Response = OPI_Tools.Delete(URL, , Headers); + + Return Response; + +EndFunction + +// Get file description !NOCLI +// +// Return value: +// Key-Value Pair - File description +Function GetFileDescription() Export + + Description = New Match; + Description.Insert("MIME" , "image/jpeg"); // MIME-type uploading file + Description.Insert("Name" , "New file.jpg"); // File name with extension + Description.Insert("Description" , "This is a new file"); // File description + Description.Insert("Parent" , "root"); // ID directory upload or "root" for upload in root + + Return Description; + +EndFunction + +#EndRegion + +#Region CommentManagement + +// Create comment +// Creates a comment for a file or directory +// +// Parameters: +// Token - String - Token - token +// Identifier - String - Identifier of the object that needs a comment - object +// Comment - String - Comment text - text +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function CreateComment(Val Token, Val Identifier, Val Comment) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Identifier); + OPI_TypeConversion.GetLine(Comment); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + Identifier + "/comments?fields=*"; + + Parameters = New Structure; + Parameters.Insert("content", Comment); + + Response = OPI_Tools.POST(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get comment +// Gets comment by ID +// +// Parameters: +// Token - String - Token - token +// ObjectID - String - Identifier of the file or directory where the comment is located - object +// CommentID - String - Comment identifier - comment +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetComment(Val Token, Val ObjectID, Val CommentID) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ObjectID); + OPI_TypeConversion.GetLine(CommentID); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + ObjectID + "/comments/" + CommentID; + + Parameters = New Structure; + Parameters.Insert("fields", "*"); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get list of comments +// Gets the list of all comments of the object +// +// Parameters: +// Token - String - Token - token +// ObjectID - String - Object identifier - object +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetCommentList(Val Token, Val ObjectID) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ObjectID); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + ObjectID + "/comments"; + + Parameters = New Structure; + Parameters.Insert("fields", "*"); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Delete comment +// Deletes comment by ID +// +// Parameters: +// Token - String - Token - token +// ObjectID - String - Identifier of the file or directory where the comment is located - object +// CommentID - String - Comment identifier - comment +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function DeleteComment(Val Token, Val ObjectID, Val CommentID) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ObjectID); + OPI_TypeConversion.GetLine(CommentID); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://www.googleapis.com/drive/v3/files/" + ObjectID + "/comments/" + CommentID; + + Response = OPI_Tools.Delete(URL, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Procedure GetObjectsListRecursively(Val Headers, ArrayOfObjects, Detailed = False, Filter = "", Page = "") + + URL = "https://www.googleapis.com/drive/v3/files"; + Files = "files"; + NPT = "nextPageToken"; + Parameters = New Structure; + Parameters.Insert("fields", "*"); + + If ValueFilled(Page) Then + Parameters.Insert("pageToken", Page); + EndIf; + + If ValueFilled(Filter) And TypeValue(Filter) = Type("Array") Then + FilterString = StrJoin(Filter, " and "); + Parameters.Insert("q", FilterString); + EndIf; + + Result = OPI_Tools.Get(URL, Parameters, Headers); + + Objects = Result[Files]; + Page = Result[NPT]; + + For Each CurrentObject In Objects Do + ArrayOfObjects.Add(CurrentObject); + EndDo; + + If Objects.Quantity() > 0 And ValueFilled(Page) Then + GetObjectsListRecursively(Headers, ArrayOfObjects, Detailed, Filter, Page); + EndIf; + +EndProcedure + +Procedure BreakDownObjectsInDetail(Val Token, ArrayOfObjects) + + For Each CurrentObject In ArrayOfObjects Do + + ArrayOfFiles = New Array; + CurrentID = CurrentObject["id"]; + + Result = GetFilesList(Token, , CurrentID); + + For Each File In Result Do + ArrayOfFiles.Add(File); + EndDo; + + CurrentObject.Insert("files", ArrayOfFiles); + + EndDo; + +EndProcedure + +Procedure FormFileUploadParameters(Description) + + FormedDescription = New Match; + OPI_Tools.RemoveEmptyCollectionFields(Description); + + FieldMapping = New Match; + FieldMapping.Insert("MIME" , "mimeType"); + FieldMapping.Insert("Name" , "name"); + FieldMapping.Insert("Description" , "description"); + FieldMapping.Insert("Parent" , "parents"); + FieldMapping.Insert("Extension", "fileExtension"); + + For Each Element In Description Do + + If Element.Key = "Parent" Then + + CurrentValue = New Array; + CurrentValue.Add(Element.Value); + + Else + + CurrentValue = Element.Value; + + EndIf; + + FieldName = FieldMapping.Get(Element.Key); + FormedDescription.Insert(FieldName, CurrentValue); + + EndDo; + + Description = FormedDescription; + +EndProcedure + +Function FileManagement(Val Token, Val File = "", Val Description = "", Val Identifier = "") + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Identifier); + + If ValueFilled(Description) Then + OPI_TypeConversion.GetCollection(Description); + EndIf; + + MimeType = "mimeType"; + + If ValueFilled(Identifier) Then + MIME = GetObjectInformation(Token, Identifier)[MimeType]; + Else + MIME = Description["MIME"]; + EndIf; + + If Not ValueFilled(Description) Then + Description = New Match; + EndIf; + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + FormFileUploadParameters(Description); + JSONDescription = OPI_Tools.JSONString(Description); + + FileMapping = New Match; + + If ValueFilled(File) Then + + ChunkSize = 268435457; + Size = OPI_Tools.ConvertDataWithSizeRetrieval(File, ChunkSize); + + FileMapping.Insert(File, MIME); + + If Size < ChunkSize And TypeValue(File) = Type("BinaryData") Then + Response = UploadSmallFile(JSONDescription, FileMapping, Headers, Identifier); + Else + Response = UploadLargeFile(Description, FileMapping, Headers, Identifier); + EndIf; + + Else + Response = UploadSmallFile(JSONDescription, FileMapping, Headers, Identifier); + EndIf; + + Return Response; + +EndFunction + +Function UploadSmallFile(Val Description, Val FileMapping, Val Headers, Val Identifier = "") + + URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"; + + If ValueFilled(Identifier) Then + URL = StringReplace(URL, "/files", "/files/" + Identifier); + Response = OPI_Tools.PatchMultipartRelated(URL, Description, FileMapping, Headers); + Else + Response = OPI_Tools.PostMultipartRelated(URL, Description, FileMapping, Headers); + EndIf; + + Return Response; + +EndFunction + +Function UploadLargeFile(Val Description, Val FileMapping, Val Headers, Val Identifier = "") + + For Each File In FileMapping Do + Binary = File.Key; + Break; + EndDo; + + URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable"; + + If ValueFilled(Identifier) Then + URL = StringReplace(URL, "/files", "/files/" + Identifier); + Response = OPI_Tools.Patch(URL, Description, Headers, True, True); + Else + Response = OPI_Tools.Post(URL, Description, Headers, True, True); + EndIf; + + UploadURL = Response.Headers["Location"]; + + If Not ValueFilled(UploadURL) Then + OPI_Tools.ProcessResponse(Response); + Return Response; + EndIf; + + UploadResponse = UploadFileInParts(Binary, UploadURL); + Response = ?(ValueFilled(UploadResponse), UploadResponse, Response); + + OPI_Tools.ProcessResponse(Response); + Return Response; + +EndFunction + +Function UploadFileInParts(Val Binary, Val UploadURL) + + Response = ""; + ChunkSize = 268435456; + BytesRead = 0; + CurrentPosition = 0; + TotalSize = Binary.Size(); + StrTotalSize = OPI_Tools.NumberToString(TotalSize); + ReadingData = New ReadingData(Binary); + SourceStream = ReadingData.SourceStream(); + + WHile BytesRead < TotalSize Do + + BytesRead = SourceStream.CurrentPosition(); + Result = ReadingData.Read(ChunkSize); + Current data = Result.GetBinaryData(); + CurrentSize = Current data.Size(); + NextPosition = CurrentPosition + CurrentSize - 1; + + If Not ValueFilled(Current data) Then + Break; + EndIf; + + StreamHeader = "bytes " + + OPI_Tools.NumberToString(CurrentPosition) + + "-" + + OPI_Tools.NumberToString(NextPosition) + + "/" + + StrTotalSize; + + AdditionalHeaders = New Match; + AdditionalHeaders.Insert("Content-Length", OPI_Tools.NumberToString(CurrentSize)); + AdditionalHeaders.Insert("Content-Range" , StreamHeader); + AdditionalHeaders.Insert("Content-Type" , "application/octet-stream"); + + Response = OPI_Tools.Put(UploadURL, Current data, AdditionalHeaders, False, True); + + CheckResult = CheckPartUpload(Response, StrTotalSize, AdditionalHeaders, UploadURL, CurrentPosition); + + If ValueFilled(CheckResult) Then + Return CheckResult; + EndIf; + + // !OInt KBytes = 1024; + // !OInt MByte = KBytes * KBytes; + // !OInt Notify(OPI_Tools.ProgressInformation(CurrentPosition, TotalSize, "MB", MByte)); + + // !OInt PerformGarbageCollection(); + // !OInt ReleaseObject(Current data); + + EndDo; + + Return Response; + +EndFunction + +Function CheckPartUpload(Response, StrTotalSize, AdditionalHeaders, UploadURL, CurrentPosition) + + StartOfErrorCodes = 400; + EndOfFailureCodes = 600; + StartOfSuccessCodes = 200; + EndOfSuccessCodes = 300; + Redirection = 308; + + If Response.StatusCode >= StartOfErrorCodes And Response.StatusCode < EndOfFailureCodes Then + + StreamHeader = "bytes */" + StrTotalSize; + AdditionalHeaders.Insert("Content-Range" , StreamHeader); + + CheckResponse = OPI_Tools.Put(UploadURL, "", AdditionalHeaders, False, True); + + If CheckResponse.StatusCode >= StartOfSuccessCodes And CheckResponse.StatusCode < EndOfSuccessCodes Then + + OPI_Tools.ProcessResponse(CheckResponse); + Return CheckResponse; + + ElsIf CheckResponse.StatusCode = Redirection Then + + UploadedData = Response.Headers["Range"]; + + Else + + OPI_Tools.ProcessResponse(Response); + Return Response; + + EndIf; + + Else + UploadedData = Response.Headers["Range"]; + EndIf; + + If Not ValueFilled(UploadedData) Then + OPI_Tools.ProcessResponse(Response); + Return Response; + EndIf; + + UploadedData = StringReplace(UploadedData, "bytes=", ""); + ArrayOfInformation = StrSplit(UploadedData, "-", False); + PartsRequired = 2; + + If Not ArrayOfInformation.Quantity() = PartsRequired Then + OPI_Tools.ProcessResponse(Response); + Return Response; + EndIf; + + CurrentPosition = Number(ArrayOfInformation[1]) + 1; + + Return ""; + +EndFunction + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo new file mode 100644 index 0000000000..1cc27c5aac --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3bf39c90-a263-4300-b800-7fd85f7c6d40"> + <name>OPI_GoogleDrive</name> + <synonym> + <key></key> + <value>OPI google drive</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl new file mode 100644 index 0000000000..fe61a908f8 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl @@ -0,0 +1,409 @@ +// Location OS: ./OInt/core/Modules/OPI_GoogleSheets.os +// Library: Google Sheets +// CLI Command: 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 + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region BookWork + +// CreateBook +// Creates a new book +// +// Parameters: +// Token - String - Token - token +// Name - String - Name - title +// ArrayOfSheetNames - Array of Strings - Array of names to add new sheets to the book - sheets +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function CreateBook(Val Token, Val Name, Val ArrayOfSheetNames) Export + + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetCollection(ArrayOfSheetNames); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets"; + + Properties = New Structure("title" , Name); + Sheets = New Array; + + FillSheetArray(ArrayOfSheetNames, Sheets); + + Parameters = New Structure; + OPI_Tools.AddField("properties", Properties, "Collection", Parameters); + OPI_Tools.AddField("sheets" , Sheets , "Collection", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// GetBook +// Gets information about the book by ID +// +// Parameters: +// Token - String - Token - token +// Identifier - String - BookIdentifier - spreadsheet +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetBook(Val Token, Val Identifier) Export + + OPI_TypeConversion.GetLine(Identifier); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Identifier; + + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +// ChangeBookName +// Changes the name of the existing book +// +// Parameters: +// Token - String - Token - token +// Book - String - BookID - spreadsheet +// Name - String - New name - title +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function EditBookTitle(Val Token, Val Book, Val Name) Export + + OPI_TypeConversion.GetLine(Book); + OPI_TypeConversion.GetLine(Name); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate"; + + Change = New Structure("title", Name); + ChangeRequest = New Structure("properties,fields", Change, "title"); + Request = New Structure("updateSpreadsheetProperties", ChangeRequest); + + ArrayOfRequests = New Array; + ArrayOfRequests.Add(Request); + + Parameters = New Structure("requests", ArrayOfRequests); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region SheetWork + +// AddSheet +// Adds a new sheet to the book +// +// +// Parameters: +// Token - String - Token - token +// Book - String - BookIdentifier - spreadsheet +// Name - String - NewSheetName - title +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function AddSheet(Val Token, Val Book, Val Name) Export + + OPI_TypeConversion.GetLine(Book); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate"; + Sheet = CreateSheet(Name); + + Requests = New Array; + Change = New Structure("addSheet", Sheet); + Requests.Add(Change); + + Parameters = New Structure("requests", Requests); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// DeleteSheet +// Deletes a sheet from the book +// +// Parameters: +// Token - String - Token - token +// Book - String - BookIdentifier - spreadsheet +// Sheet - String - IdentifierOfSheetToDelete - sheet +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function DeleteSheet(Val Token, Val Book, Val Sheet) Export + + OPI_TypeConversion.GetLine(Book); + OPI_TypeConversion.GetLine(Sheet); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate"; + + Requests = New Array; + Sheet = New Structure("sheetId" , Sheet); + Change = New Structure("deleteSheet", Sheet); + Requests.Add(Change); + + Parameters = New Structure("requests", Requests); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// CopySheet +// Copies a sheet from one book to another +// +// Parameters: +// Token - String - Token - token +// From - String - SourceBookID - from +// To - String - DestinationBookID - to +// Sheet - String - CopiedSheetID - sheet +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function CopySheet(Val Token, Val From, Val To, Val Sheet) Export + + OPI_TypeConversion.GetLine(From); + OPI_TypeConversion.GetLine(To); + OPI_TypeConversion.GetLine(Sheet); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + + From + + "/sheets/" + + Sheet + + ":copyTo"; + + Parameters = New Structure("destinationSpreadsheetId", To); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region DataWork + +// SetCellValues +// Sets sheet cell values +// +// Parameters: +// Token - String - Token - token +// Book - String - BookID - spreadsheet +// ValueMapping - Key-Value Pair - Fill data where the key is the cell name like A1 - data +// Sheet - String - Name лиwithта (перinый лиwithт по умолчанию) - sheetname +// MajorDimension - String - Main dimension when filling the array range - dim +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function SetCellValues(Val Token + , Val Book + , Val ValueMapping + , Val Sheet = "" + , Val MajorDimension = "COLUMNS") Export + + OPI_TypeConversion.GetLine(Book); + OPI_TypeConversion.GetCollection(ValueMapping); + + If Not TypeValue(ValueMapping) = Type("Structure") + And Not TypeValue(ValueMapping) = Type("Match") Then + Return "Failed to convert the structure of values to a collection"; + EndIf; + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchUpdate"; + Data array = FormCellDataArray(ValueMapping, MajorDimension, Sheet); + + Parameters = New Structure("data,valueInputOption", Data array, "USER_ENTERED"); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Clear cells +// Clears the value in cells +// +// Parameters: +// Token - String - Token - token +// Book - String - BookID - spreadsheet +// Cell array - Array of Strings - Array of cells like A1 to be cleared - cells +// Sheet - String - Name лиwithта (перinый лиwithт по умолчанию) - sheetname +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function ClearCells(Val Token, Val Book, Val Cell array, Val Sheet = "") Export + + OPI_TypeConversion.GetLine(Book); + OPI_TypeConversion.GetCollection(Cell array); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchClear"; + + FormCellNameArray(Cell array, Sheet); + + Parameters = New Structure("ranges", Cell array); + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get cell values +// Gets cell values of the table +// +// Parameters: +// Token - String - Token - token +// Book - String - BookID - spreadsheet +// Cell array - Array of Strings - Array ячееto inиdа А1 for получения (inеwithь лиwithт, еwithли не заполнено) - cells +// Sheet - String - Name лиwithта (перinый лиwithт по умолчанию) - sheetname +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetCellValues(Val Token, Val Book, Val Cell array = "", Val Sheet = "") Export + + OPI_TypeConversion.GetLine(Book); + + Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token); + URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchGet"; + + If ValueFilled(Cell array) Then + OPI_TypeConversion.GetCollection(Cell array); + FormCellNameArray(Cell array, Sheet); + + First = True; + For Each Cell In Cell array Do + Delimiter = ?(First, "?", "&"); + URL = URL + Delimiter + "ranges=" + Cell; + First = False; + EndDo; + Else + URL = URL + "?ranges='" + Sheet + "'"; + EndIf; + + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Procedure FillSheetArray(Val ArrayOfNames, SheetArray) + + For Each SheetName In ArrayOfNames Do + + Sheet = CreateSheet(SheetName); + SheetArray.Add(Sheet); + + EndDo; + +EndProcedure + +Procedure AddSheetName(Cell, Val Sheet) + + If ValueFilled(Sheet) Then + Cell = "'" + Sheet + "'!" + Cell; + EndIf; + +EndProcedure + +Function CreateSheet(Val Name) + + OPI_TypeConversion.GetLine(Name); + + Sheet properties = New Structure("title" , Name); + Sheet = New Structure("properties", Sheet properties); + + Return Sheet; + +EndFunction + +Function FormCellDataArray(Val ValueStructure, Val MajorDimension, Val Sheet) + + OPI_TypeConversion.GetLine(Sheet); + + Data array = New Array; + + For Each CellData In ValueStructure Do + + CurrentValue = CellData.Value; + Current key = CellData.Key; + + AddSheetName(Current key, Sheet); + + OPI_TypeConversion.GetArray(CurrentValue); + + Current data = New Match; + Current array = New Array; + + Current array.Add(CurrentValue); + + OPI_Tools.AddField("range" , Current key , "String", Current data); + OPI_Tools.AddField("values" , Current array , "Array", Current data); + OPI_Tools.AddField("majorDimension", MajorDimension, "String", Current data); + + Data array.Add(Current data); + + EndDo; + + Return Data array; + +EndFunction + +Procedure FormCellNameArray(Val ArrayOfNames, Val Sheet) + + OPI_TypeConversion.GetLine(Sheet); + + For N = 0 For ArrayOfNames.WithinBoundary() Do + AddSheetName(ArrayOfNames[N], Sheet); + EndDo; + +EndProcedure + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo new file mode 100644 index 0000000000..cf32e69a19 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3890523a-552f-495c-ae7d-2991df8bb175"> + <name>OPI_GoogleSheets</name> + <synonym> + <key></key> + <value>OPI google sheets</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl rename to service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo new file mode 100644 index 0000000000..7f7001eaea --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e5bf1867-4c83-4724-91f2-931150325ea0"> + <name>OPI_GoogleWorkspace</name> + <synonym> + <key></key> + <value>OPI google workspace</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Notion/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Notion/Module.bsl new file mode 100644 index 0000000000..2e77d4863b --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Notion/Module.bsl @@ -0,0 +1,889 @@ +// Location OS: ./OInt/core/Modules/OPI_Notion.os +// Library: Notion +// CLI command: notion + +// 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:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +// @skip-check method-too-many-params + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region PageManagement + +// Create page +// Creates a child page above another parent page +// +// Parameters: +// Token - String - Token - token +// Parent - String - Parent ID - page +// Title - String - Page title - title +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function CreatePage(Val Token, Val Parent, Val Title) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Parent); + OPI_TypeConversion.GetLine(Title); + + Headers = CreateRequestHeaders(Token); + Properties = New Structure; + Parameters = New Structure; + + AddPageHeader(Title, Properties); + AddPageParent(Parent, False, Parameters); + + Parameters.Insert("properties", Properties); + + Response = OPI_Tools.Post("https://api.notion.com/v1/pages", Parameters, Headers); + + Return Response; + +EndFunction + +// Create page in database +// Creates a page in the parent database +// +// Parameters: +// Token - String - Token - token +// Parent - String - Parent database ID - base +// Data - Key-Value Pair - Properties match - data +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function CreatePageInDatabase(Val Token, Val Parent, Val Data) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Parent); + OPI_TypeConversion.GetCollection(Data); + + Headers = CreateRequestHeaders(Token); + Parameters = New Structure; + + AddPageParent(Parent, True, Parameters); + + Properties = FillDataBySchema(Parent, Data, Token); + Parameters.Insert("properties", Properties); + + Response = OPI_Tools.Post("https://api.notion.com/v1/pages", Parameters, Headers); + + Return Response; + +EndFunction + +// Get page +// Gets information about the page by ID +// +// Parameters: +// Token - String - Token - token +// Page - String - Page ID - page +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function GetPage(Val Token, Val Page) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Page); + + Headers = CreateRequestHeaders(Token); + ConvertID(Page); + + Response = OPI_Tools.Get("https://api.notion.com/v1/pages/" + Page, , Headers); + + Return Response; + +EndFunction + +// Edit page properties. +// +// Parameters: +// Token - String - Token - token +// Page - String - ID of the page being modified - page +// Data - Key-Value Pair - Matching of editable parameters - data +// Icon - String - URL of the page icon image - icon +// Cover - String - URL of the page cover image - cover +// Archived - Boolean - Archive page or нет (boolean) - archive +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function EditPageProperties(Val Token + , Val Page + , Val Data = "" + , Val Icon = "" + , Val Cover = "" + , Val Archived = False) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Page); + OPI_TypeConversion.GetLine(Icon); + OPI_TypeConversion.GetLine(Cover); + OPI_TypeConversion.GetBoolean(Archived); + OPI_TypeConversion.GetCollection(Data); + + Headers = CreateRequestHeaders(Token); + Parameters = New Structure; + Files = "files"; + + If ValueFilled(Data) + And (TypeValue(Data) = Type("Match") Or TypeValue(Data) = Type("Structure")) Then + Properties = FillDataBySchema(Page, Data, Token, False); + Else + Properties = New Match; + EndIf; + + If ValueFilled(Icon) Then + Icon match = New Match; + Icon match.Insert("Icon", Icon); + + Icon object = ConvertValueByType(Files, Icon match); + Icon object = Icon object[Files][0]; + Icon object.Delete("name"); + + Parameters.Insert("icon", Icon object); + EndIf; + + If ValueFilled(Cover) Then + Cover match = New Match; + Cover match.Insert("Cover", Cover); + + Cover object = ConvertValueByType(Files, Cover match); + Cover object = Cover object[Files][0]; + Cover object.Delete("name"); + + Parameters.Insert("cover", Cover object); + EndIf; + + Parameters.Insert("properties", Properties); + Parameters.Insert("archived" , Archived); + + ConvertID(Page); + + Response = OPI_Tools.Patch("https://api.notion.com/v1/pages/" + Page, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region DatabaseManagement + +// Create database +// Creates a database +// +// Parameters: +// Token - String - Token - token +// Parent - String - Parent page ID - page +// Title - String - Database title - title +// Properties - Structure Of String - Database properties - props +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function CreateDatabase(Val Token, Val Parent, Val Title, Val Properties = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Parent); + OPI_TypeConversion.GetLine(Title); + OPI_TypeConversion.GetCollection(Properties); + + // Example structure/property map + + // Name : title + // Description : rich_text + // In progress : checkbox + // Quantity : number + // Date : date + // Status : Map + // Active : green + // Inactive : red + // Archive : yellow + + // All pages created as children must have parent base properties + + If Not TypeValue(Properties) = Type("Structure") And Not TypeValue(Properties) = Type("Match") Then + Properties = New Structure("Name", "title"); + EndIf; + + Headers = CreateRequestHeaders(Token); + Parameters = New Structure; + + AddDatabaseParent(Parent, False, Parameters); + AddDatabaseHeader(Title, Parameters); + AddDatabaseProperties(Properties, Parameters); + + Response = OPI_Tools.Post("https://api.notion.com/v1/databases", Parameters, Headers); + + Return Response; + +EndFunction + +// Get database +// Get database information +// +// Parameters: +// Token - String - Token - token +// Base - String - Database ID - base +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function GetDatabase(Val Token, Val Base) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Base); + + Headers = CreateRequestHeaders(Token); + ConvertID(Base); + + Response = OPI_Tools.Get("https://api.notion.com/v1/databases/" + Base, , Headers); + + Return Response; + +EndFunction + +// Edit database properties +// Edits properties of an existing database +// +// Parameters: +// Token - String - Token - token +// Base - String - Target database ID - base +// Properties - Map from KeyAndValue - New or modified database properties - props +// Title - String - New database title - title +// Description - String - New database description - description +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function EditDatabaseProperties(Val Token, Val Base, Val Properties = "", Val Title = "", Val Description = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Base); + OPI_TypeConversion.GetLine(Title); + OPI_TypeConversion.GetLine(Description); + OPI_TypeConversion.GetCollection(Properties); + + Parameters = New Structure; + Headers = CreateRequestHeaders(Token); + ConvertID(Base); + + If ValueFilled(Title) Then + AddDatabaseHeader(Title, Parameters); + EndIf; + + If ValueFilled(Description) Then + AddDatabaseDescription(Description, Parameters); + EndIf; + + If TypeValue(Properties) = Type("Structure") Or TypeValue(Properties) = Type("Match") Then + AddDatabaseProperties(Properties, Parameters); + EndIf; + + Response = OPI_Tools.Patch("https://api.notion.com/v1/databases/" + Base, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region BlockWork + +// Create block +// Creates a new block based on an existing block +// +// Parameters: +// Token - String - Token - token +// Parent - String - Parent block or page ID - page +// Block - String, Map From KeyAndValue - Block ID or block sample itself - block +// InsertAfter - String - Block ID after which to insert the new one - prev +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function CreateBlock(Val Token, Val Parent, Val Block, Val InsertAfter = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Parent); + OPI_TypeConversion.GetLine(InsertAfter); + OPI_TypeConversion.GetCollection(Block); + + If TypeValue(Block) = Type("Array") Then + Block = Block[0]; + EndIf; + + Headers = CreateRequestHeaders(Token); + ConvertID(Parent); + + If TypeValue(Block) = Type("String") Then + ConvertID(Block); + Block = ReturnBlock(Token, Block); + EndIf; + + BlockArray = New Array; + BlockArray.Add(Block); + + Parameters = New Match; + Parameters.Insert("children", BlockArray); + + If ValueFilled(InsertAfter) Then + Parameters.Insert("after", InsertAfter); + EndIf; + + URL = "https://api.notion.com/v1/blocks/" + Parent + "/children"; + Response = OPI_Tools.Patch(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Inернуть блоto. +// +// Parameters: +// Token - String - Token - token +// BlockID - String - Block ID - block +// OnlyBase - Boolean - True > service fields are deleted, only the block itself remains - core +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function ReturnBlock(Val Token, Val BlockID, Val OnlyBase = True) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(BlockID); + OPI_TypeConversion.GetBoolean(OnlyBase); + + ConvertID(BlockID); + + Headers = CreateRequestHeaders(Token); + Response = OPI_Tools.Get("https://api.notion.com/v1/blocks/" + BlockID, , Headers); + + If OnlyBase Then + RemoveExtraBlockFields(Response); + EndIf; + + Return Response; + +EndFunction + +// Return child blocks +// Returns list of child blocks of parent block +// +// Parameters: +// Token - String - Token - token +// BlockID - String - Parent block ID - block +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function ReturnChildBlocks(Val Token, Val BlockID) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(BlockID); + + ConvertID(BlockID); + + Headers = CreateRequestHeaders(Token); + Response = OPI_Tools.Get("https://api.notion.com/v1/blocks/" + BlockID + "/children", , Headers); + + Return Response; + +EndFunction + +// Delete block +// Deletes block by ID +// +// Parameters: +// Token - String - Token - token +// BlockID - String - Block ID - block +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function DeleteBlock(Val Token, Val BlockID) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(BlockID); + + ConvertID(BlockID); + + Headers = CreateRequestHeaders(Token); + Response = OPI_Tools.Delete("https://api.notion.com/v1/blocks/" + BlockID, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region Users + +// User list +// Returns a list of workspace users +// +// Parameters: +// Token - String - Token - token +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function UserList(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + Headers = CreateRequestHeaders(Token); + Response = OPI_Tools.Get("https://api.notion.com/v1/users", , Headers); + + Return Response; + +EndFunction + +// Get user data +// Gets user data by ID +// +// Parameters: +// Token - String - Token - token +// UserID - String - Target user ID - user +// +// Return value: +// Key-Value Pair - Serialized JSON response from Notion +Function GetUserData(Val Token, Val UserID) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(UserID); + + ConvertID(UserID); + + Headers = CreateRequestHeaders(Token); + Response = OPI_Tools.Get("https://api.notion.com/v1/users/" + UserID, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function CreateRequestHeaders(Val Token) + + OPI_TypeConversion.GetLine(Token); + + Headers = New Match; + Headers.Insert("Authorization" , "Bearer " + Token); + Headers.Insert("Notion-Version", "2022-06-28"); + + Return Headers; + +EndFunction + +Procedure ConvertID(Identifier) + + OPI_TypeConversion.GetLine(Identifier); + + Identifier = StringReplace(Identifier, "-", ""); + +EndProcedure + +Procedure AddPageParent(Val Parent, Val ParentBase, MainStructure) + + OPI_TypeConversion.GetLine(ParentBase); + + ConvertID(Parent); + + IdentifierField = ?(ParentBase, "database_id", "page_id"); + ParentStructure = New Structure(IdentifierField, Parent); + + MainStructure.Insert("parent", ParentStructure); + +EndProcedure + +Procedure AddDatabaseParent(Val Parent, Val ParentBase, MainStructure) + + OPI_TypeConversion.GetLine(ParentBase); + + ConvertID(Parent); + + IdentifierField = ?(ParentBase, "database_id", "page_id"); + + ParentStructure = New Structure(); + ParentStructure.Insert("type" , IdentifierField); + ParentStructure.Insert(IdentifierField, Parent); + + MainStructure.Insert("parent", ParentStructure); + +EndProcedure + +Procedure AddPageHeader(Val Title, MainStructure) + + OPI_TypeConversion.GetLine(Title); + + SubordinateStructure = New Structure; + DataStructure = New Structure; + TextStructure = New Structure; + Data array = New Array; + Title = "title"; + + TextStructure.Insert("content", Title); + TextStructure.Insert("link" , Undefined); + + DataStructure.Insert("text", TextStructure); + DataStructure.Insert("type", "text"); + + Data array.Add(DataStructure); + + SubordinateStructure.Insert("id" , Title); + SubordinateStructure.Insert("type" , Title); + SubordinateStructure.Insert(Title , Data array); + + MainStructure.Insert(Title, SubordinateStructure); + +EndProcedure + +Procedure AddDatabaseHeader(Val Title, MainStructure) + + OPI_TypeConversion.GetLine(Title); + + Title = ConvertHeader(Title); + MainStructure.Insert("title", Title["title"]); + +EndProcedure + +Procedure AddDatabaseDescription(Val Description, MainStructure) + + OPI_TypeConversion.GetLine(Description); + + Title = ConvertHeader(Description); + MainStructure.Insert("description", Title["title"]); + +EndProcedure + +Procedure AddDatabaseProperties(Val Properties, MainStructure) + + If Properties.Quantity() = 0 Then + MainStructure.Insert("properties", New Structure); + Return; + EndIf; + + ParameterMap = New Match; + + For Each Property In Properties Do + + If TypeValue(Property.Value) = Type("String") Then + + ParameterMap.Insert(Property.Key, New Structure(Property.Value, New Structure)); + + ElsIf TypeValue(Property.Value) = Type("Structure") + Or TypeValue(Property.Value) = Type("Match") Then + + ValueSelection = FormSelectionValues(Property.Value); + ParameterMap.Insert(Property.Key, New Structure("select", ValueSelection)); + + Else + + ParameterMap.Insert(Property.Key, Property.Value); + + EndIf; + + EndDo; + + MainStructure.Insert("properties", ParameterMap); + +EndProcedure + +Function FormSelectionValues(Val VariantStructure) + + OptionArray = New Array; + + For Each Option In VariantStructure Do + + OptionMap = New Match; + OptionMap.Insert("name" , Option.Key); + OptionMap.Insert("color", Option.Value); + + OptionArray.Add(OptionMap); + + EndDo; + + Return New Structure("options", OptionArray); + +EndFunction + +Function FillDataBySchema(Val Scheme, Val Data, Val Token, Val ThisIsBase = True) + + If ThisIsBase Then + SchemaData = GetDatabase(Token, Scheme); + Else + SchemaData = GetPage(Token, Scheme); + EndIf; + + BaseFields = SchemaData["properties"]; + Properties = New Match; + + If ValueFilled(BaseFields) Then + + For Each Field In BaseFields Do + + FieldData = Field.Value; + FieldType = FieldData["type"]; + + FillableData = Data.Get(Field.Key); + + If FillableData = Undefined Then + Continue; + EndIf; + + ConvertedData = ConvertValueByType(FieldType, FillableData); + + If ConvertedData = Undefined Then + Continue; + EndIf; + + Properties.Insert(FieldData["id"], ConvertedData); + + EndDo; + + EndIf; + + Return Properties; + +EndFunction + +Procedure RemoveExtraBlockFields(Val Block) + + ExtraArray = New Array; + ExtraArray.Add("request_id"); + ExtraArray.Add("archived"); + ExtraArray.Add("created_by"); + ExtraArray.Add("last_edited_time"); + ExtraArray.Add("created_time"); + ExtraArray.Add("has_children"); + ExtraArray.Add("parrent"); + ExtraArray.Add("last_edited_by"); + ExtraArray.Add("id"); + + For Each Field In ExtraArray Do + + If Not Block.Get(Field) = Undefined Then + Block.Delete(Field); + EndIf; + + EndDo; + +EndProcedure + +#Region TypeConversion + +Function ConvertValueByType(Val Type, Val Value) + + If Type = "title" Then + Return ConvertHeader(Value); + ElsIf Type = "rich_text" Then + Return ConvertText(Value); + ElsIf Type = "number" Then + Return ConvertNumber(Value); + ElsIf Type = "select" Then + Return ConvertSelectionOption(Value); + ElsIf Type = "multi_select" Then + Return ConvertMultipleChoice(Value); + ElsIf Type = "status" Then + Return ConvertStatus(Value); + ElsIf Type = "date" Then + Return ConvertDate(Value); + ElsIf Type = "relation" Then + Return ConvertLink(Value); + ElsIf Type = "people" Then + Return ConvertUsers(Value); + ElsIf Type = "files" Then + Return ConvertFiles(Value); + ElsIf Type = "checkbox" Then + Return ConvertBoolean(Value); + ElsIf Type = "url" Then + Return ConvertLink(Value); + ElsIf Type = "email" Then + Return ConvertEmail(Value); + ElsIf Type = "phone_number" Then + Return ConvertPhone(Value); + Else + Return Undefined; + EndIf; + +EndFunction + +Function ConvertHeader(Val Title) + + DataStructure = New Structure; + TextStructure = New Structure; + Data array = New Array; + + TextStructure.Insert("content", Title); + TextStructure.Insert("link" , Undefined); + + DataStructure.Insert("type", "text"); + DataStructure.Insert("text", TextStructure); + + Data array.Add(DataStructure); + + Return New Structure("title", Data array); + +EndFunction + +Function ConvertText(Val Text) + + TextArray = New Array; + TextStructure = New Structure; + + TextStructure.Insert("type", "text"); + TextStructure.Insert("text", New Structure("content", Text)); + + TextArray.Add(TextStructure); + + Return New Structure("rich_text", TextArray); + +EndFunction + +Function ConvertNumber(Val Number) + Return New Structure("number", Number); +EndFunction + +Function ConvertSelectionOption(Val Option) + + ChoiceStructure = New Structure; + ChoiceStructure.Insert("select", New Structure("name", Option)); + + Return ChoiceStructure; + +EndFunction + +Function ConvertStatus(Val Status) + + StatusStructure = New Structure; + StatusStructure.Insert("status", New Structure("name", Status)); + + Return StatusStructure; + +EndFunction + +Function ConvertMultipleChoice(Val OptionArray) + + ChoiceOptionArray = New Array; + + For Each Option In OptionArray Do + ChoiceOptionArray.Add(New Structure("name", Option)); + EndDo; + + Return New Structure("multi_select", ChoiceOptionArray); + +EndFunction + +Function ConvertDate(Val Date) + + DateStructure = New Structure; + + If Date = StartOfDay(Date) Then + DateFormat = "DF=yyyy-MM-dd"; + Else + DateFormat = "ISO8601Datetime"; + EndIf; + + Date = Format(Date, DateFormat); + DateStructure.Insert("start", Date); + + Return New Structure("date", DateStructure); + +EndFunction + +Function ConvertLink(Val Identifier) + + LinkArray = New Array; + LinkArray.Add(New Structure("id", Identifier)); + + Return New Structure("relation", LinkArray); + +EndFunction + +Function ConvertUsers(Val IDArray) + + If Not TypeValue(IDArray) = Type("Array") Then + ArrayID_ = New Array; + ArrayID_.Add(IDArray); + IDArray = ArrayID_; + EndIf; + + ArrayOfUsers = New Array; + + For Each Identifier In IDArray Do + + UserStructure = New Structure; + UserStructure.Insert("object", "user"); + UserStructure.Insert("id" , Identifier); + ArrayOfUsers.Add(UserStructure); + + EndDo; + + Return New Structure("people", ArrayOfUsers); + +EndFunction + +Function ConvertFiles(Val FileMapping) + + ArrayOfFiles = New Array; + + For Each File In FileMapping Do + + FileStructure = New Structure; + FileStructure.Insert("type" , "external"); + FileStructure.Insert("name" , File.Key); + FileStructure.Insert("external", New Structure("url", File.Value)); + + ArrayOfFiles.Add(FileStructure); + + EndDo; + + Return New Structure("files", ArrayOfFiles); + +EndFunction + +Function ConvertBoolean(Val Boolean) + Return New Structure("checkbox", Boolean); +EndFunction + +Function ConvertLink(Val URL) + Return New Structure("url", URL); +EndFunction + +Function ConvertEmail(Val Email) + Return New Structure("email", Email); +EndFunction + +Function ConvertPhone(Val Phone) + Return New Structure("phone_number", Phone); +EndFunction + +#EndRegion + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo new file mode 100644 index 0000000000..159dbf1812 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1bef723b-a2a4-4547-b29f-63cf9c78d813"> + <name>OPI_Notion</name> + <synonym> + <key>ru</key> + <value>Methodы work with Notion (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Slack/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Slack/Module.bsl new file mode 100644 index 0000000000..52f0a4464e --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Slack/Module.bsl @@ -0,0 +1,1055 @@ +// Location OS: ./OInt/core/Modules/OPI_Slack.os +// Library: Slack +// CLI command: slack + +// 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:IncorrectLineBreak-off +// BSLLS:Typo-off + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region ManagementAndSettings + +// Get bot information +// Gets basic information about the bot +// +// Parameters: +// Token - String - Bot token - token +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetBotInformation(Val Token) Export + + URL = "https://slack.com/api/auth.test"; + Headers = GetAuthorizationHeader(Token); + + Response = OPI_Tools.Get(URL, , Headers); + + Return Response; + +EndFunction + +// Get workspace list +// Gets a list of workspaces where the bot is connected +// +// Parameters: +// Token - String - Bot token - token +// Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetWorkspaceList(Val Token, Val Cursor = "") Export + + URL = "https://slack.com/api/auth.teams.list"; + Response = GeneralDataRetrieval(Token, URL, Cursor); + + Return Response; + +EndFunction + +// Get user list +// Gets a list of users in the workspace +// +// Parameters: +// Token - String - Bot token - token +// Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetUserList(Val Token, Val Cursor = "") Export + + URL = "https://slack.com/api/users.list"; + Response = GeneralDataRetrieval(Token, URL, Cursor); + + Return Response; + +EndFunction + +#EndRegion + +#Region MessageManagement + +// Send message +// Sends a message at a selected hour +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Text - String - Message text - text +// Sending date - Date - Sending date for delayed message - date +// Blocks - Array of Structures - Array of block descriptions - blocks - JSON array of block descriptions +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function SendMessage(Val Token, Val Channel, Val Text = "", Val Sending date = "", Val Blocks = "") Export + + String_ = "String"; + HasDate = ValueFilled(Sending date); + Headers = GetAuthorizationHeader(Token); + + If ValueFilled(Blocks) And TypeValue(Blocks) = Type(String_) Then + OPI_TypeConversion.GetCollection(Blocks); + + If TypeValue(Blocks) = Type("Array") Then + + For N = 0 For Blocks.WithinBoundary() Do + OPI_TypeConversion.GetCollection(Blocks[N]); + EndDo; + + EndIf; + + EndIf; + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel, String_ , Parameters); + OPI_Tools.AddField("text" , Text, String_ , Parameters); + OPI_Tools.AddField("blocks" , Blocks, "Array" , Parameters); + + If HasDate Then + + URL = "https://slack.com/api/chat.scheduleMessage"; + OPI_Tools.AddField("post_at", Sending date, "Date", Parameters); + + Else + + URL = "https://slack.com/api/chat.postMessage"; + + EndIf; + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Send ephemeral message +// Sends a message that arrives in the channel but is visible +// only to a specific user +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Text - String - Message text - text +// User - String - User ID - user +// Blocks - Array of Structures - Array of block descriptions - blocks - JSON array of block descriptions +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function SendEphemeralMessage(Val Token + , Val Channel + , Val Text = "" + , Val User = "" + , Val Blocks = "") Export + + String_ = "String"; + + If ValueFilled(Blocks) And Not TypeValue(Blocks) = Type(String_) Then + OPI_TypeConversion.GetArray(Blocks); + EndIf; + + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , String_ , Parameters); + OPI_Tools.AddField("text" , Text , String_ , Parameters); + OPI_Tools.AddField("user" , User, String_ , Parameters); + OPI_Tools.AddField("blocks" , Blocks , "Collection", Parameters); + + URL = "https://slack.com/api/chat.postEphemeral"; + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Edit message +// Edits the content of an existing message +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Timestamp - String - Message timestamp - stamp +// Text - String - New message text - text +// BlockArray - Array of Structures - Array of block descriptions - blocks - JSON array of block descriptions +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function EditMessage(Val Token, Val Channel, Val Timestamp, Val Text = "", Val BlockArray = "") Export + + String_ = "String"; + URL = "https://slack.com/api/chat.update"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , String_ , Parameters); + OPI_Tools.AddField("text" , Text , String_ , Parameters); + OPI_Tools.AddField("ts" , Timestamp , String_ , Parameters); + OPI_Tools.AddField("blocks" , BlockArray, "Collection", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Delete message +// Deletes a channel message by timestamp +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Timestamp - String - Timestamp or message ID - stamp +// IsDelayed - Boolean - Indicator of deleting a delayed message - issheduled +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function DeleteMessage(Val Token, Val Channel, Val Timestamp, Val IsDelayed = False) Export + + OPI_TypeConversion.GetBoolean(IsDelayed); + + Headers = GetAuthorizationHeader(Token); + + If IsDelayed Then + URL = "https://slack.com/api/chat.deleteScheduledMessage"; + TimestampField = "scheduled_message_id"; + Else + URL = "https://slack.com/api/chat.delete"; + TimestampField = "ts"; + EndIf; + + Parameters = New Structure; + OPI_Tools.AddField("channel" , Channel , "String", Parameters); + OPI_Tools.AddField(TimestampField, Timestamp, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get list of delayed messages +// Gets a list of delayed channel messages +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetDelayedMessageList(Val Token, Val Channel, Val Cursor = "") Export + + URL = "https://slack.com/api/chat.scheduledMessages.list"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("cursor" , Cursor, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get message link +// Gets a permanent URL to the channel message +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Timestamp - String - Timestamp or message ID - stamp +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetMessageLink(Val Token, Val Channel, Val Timestamp) Export + + URL = "https://slack.com/api/chat.getPermalink"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel" , Channel , "String", Parameters); + OPI_Tools.AddField("message_ts", Timestamp, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get list of message replies +// Gets an array of messages that are replies to the specified +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Timestamp - String - Timestamp or message ID - stamp +// Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetMessageReplyList(Val Token, Val Channel, Val Timestamp, Val Cursor = "") Export + + String_ = "String"; + URL = "https://slack.com/api/conversations.replies"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , String_, Parameters); + OPI_Tools.AddField("cursor" , Cursor , String_, Parameters); + OPI_Tools.AddField("ts" , Timestamp, String_, Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region ChannelManagement + +// Get channel list +// Gets a list of available channels +// +// Parameters: +// Token - String - Bot token - token +// ExcludeArchived - Boolean - Indicator of excluding archived channels - notarchived +// Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetChannelList(Val Token, Val ExcludeArchived = False, Val Cursor = "") Export + + URL = "https://slack.com/api/conversations.list"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("exclude_archived", ExcludeArchived, "Boolean", Parameters); + OPI_Tools.AddField("cursor" , Cursor , "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get channel user list +// Gets a list of users in the specified channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetChannelUserList(Val Token, Val Channel, Val Cursor = "") Export + + URL = "https://slack.com/api/conversations.members"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("cursor" , Cursor, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Create channel +// Creates a new channel +// +// Parameters: +// Token - String - Bot token - token +// Name - String - Channel name - title +// Private - Boolean - Create channel as private - private +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function CreateChannel(Val Token, Val Name, Val Private = False) Export + + URL = "https://slack.com/api/conversations.create"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("name" , Name , "String", Parameters); + OPI_Tools.AddField("is_private", Private, "Boolean", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Archive channel +// Archives an active channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function ArchiveChannel(Val Token, Val Channel) Export + + URL = "https://slack.com/api/conversations.archive"; + Response = DialogManagement(Token, Channel, URL); + Return Response; + +EndFunction + +// Get channel +// Gets information about the channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetChannel(Val Token, Val Channel) Export + + URL = "https://slack.com/api/conversations.info"; + Response = DialogManagement(Token, Channel, URL, "GET"); + Return Response; + +EndFunction + +// Get channel history +// Gets information about channel events +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetChannelHistory(Val Token, Val Channel) Export + + URL = "https://slack.com/api/conversations.history"; + Response = DialogManagement(Token, Channel, URL, "GET"); + Return Response; + +EndFunction + +// Invite users to channel +// Adds specified users to the channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// ArrayOfUsers - Array Of String - User ID Array - users +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function InviteUsersToChannel(Val Token, Val Channel, Val ArrayOfUsers) Export + + URL = "https://slack.com/api/conversations.invite"; + Headers = GetAuthorizationHeader(Token); + + OPI_TypeConversion.GetCollection(ArrayOfUsers); + ArrayOfUsers = StrJoin(ArrayOfUsers, ","); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("users" , ArrayOfUsers, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Kick user from channel +// Removes specified user from channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// User - String - User ID - user +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function KickUserFromChannel(Val Token, Val Channel, Val User) Export + + URL = "https://slack.com/api/conversations.kick"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("user" , User, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Join channel +// Adds the current bot to the channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function JoinChannel(Val Token, Val Channel) Export + + URL = "https://slack.com/api/conversations.join"; + Response = DialogManagement(Token, Channel, URL); + Return Response; + +EndFunction + +// Leave channel +// Removes the current bot from the channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function LeaveChannel(Val Token, Val Channel) Export + + URL = "https://slack.com/api/conversations.leave"; + Response = DialogManagement(Token, Channel, URL); + Return Response; + +EndFunction + +// Set channel topic +// Sets the channel topic +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Topic - String - Channel topic - theme +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function SetChannelTopic(Val Token, Val Channel, Val Topic) Export + + URL = "https://slack.com/api/conversations.setTopic"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("topic" , Topic , "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Set channel purpose +// Sets the channel purpose (description) +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Purpose - String - Channel purpose - purpose +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function SetChannelGoal(Val Token, Val Channel, Val Purpose) Export + + URL = "https://slack.com/api/conversations.setPurpose"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("purpose", Purpose , "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Rename channel +// Changes the name of the channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel ID - channel +// Name - String - New channel name - title +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function RenameChannel(Val Token, Val Channel, Val Name) Export + + URL = "https://slack.com/api/conversations.rename"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("name" , Name, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion + +#Region DialogManagement + +// Open dialog +// Opens a new dialog with one or more users +// +// Parameters: +// Token - String - Bot token - token +// ArrayOfUsers - Array of Strings - User ID Array - users +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function OpenDialog(Val Token, Val ArrayOfUsers) Export + + URL = "https://slack.com/api/conversations.open"; + Headers = GetAuthorizationHeader(Token); + + OPI_TypeConversion.GetCollection(ArrayOfUsers); + ArrayOfUsers = StrJoin(ArrayOfUsers, ","); + + Parameters = New Structure; + OPI_Tools.AddField("users", ArrayOfUsers, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Close dialog +// Closes an existing dialog +// +// Parameters: +// Token - String - Bot token - token +// Dialog - String - Dialog ID - conv +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function CloseDialog(Val Token, Val Dialog) Export + + URL = "https://slack.com/api/conversations.close"; + Response = DialogManagement(Token, Dialog, URL); + Return Response; + +EndFunction + +#EndRegion + +#Region FileWork + +// Get list of files +// Gets a list of files of the bot or channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel for selection - channel +// PageNumber - Number, String - Page number - page +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetFilesList(Val Token, Val Channel = "", Val PageNumber = 1) Export + + URL = "https://slack.com/api/files.list"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("page" , PageNumber, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Upload file +// Uploads a file to Slack servers +// +// Parameters: +// Token - String - Bot token - token +// File - String, BinaryData - File for upload - file +// FileName - String - File name with extension - filename +// Title - String - File name in Slack - title +// Channel - String - Channel ID - channel +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function UploadFile(Val Token, Val File, Val FileName, Val Title, Val Channel = "") Export + + OPI_TypeConversion.GetBinaryData(File); + OPI_TypeConversion.GetLine(FileName); + OPI_TypeConversion.GetLine(Title); + + String_ = "String"; + Upload_url = "upload_url"; + File_id = "file_id"; + URL = "https://slack.com/api/files.getUploadURLExternal"; + Headers = GetAuthorizationHeader(Token); + Size = File.Size(); + + Parameters = New Structure; + OPI_Tools.AddField("filename", FileName, String_, Parameters); + OPI_Tools.AddField("length" , Size , String_, Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + URL = Response[Upload_url]; + Identifier = Response[File_id]; + + If Not ValueFilled(URL) Or Not ValueFilled(Identifier) Then + Return Response; + EndIf; + + Files = New Match; + Files.Insert(FileName, File); + + Response = OPI_Tools.PostMultipart(URL, , Files, , Headers); + URL = "https://slack.com/api/files.completeUploadExternal"; + SlackFile = New Structure("id, title", Identifier, Title); + + Parameters = New Structure; + OPI_Tools.AddField("filename" , FileName, String_, Parameters); + OPI_Tools.AddField("channel_id", Channel , String_, Parameters); + OPI_Tools.AddField("files" , SlackFile, "Array", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get file data +// Gets information about the file +// +// Parameters: +// Token - String - Bot token - token +// FileID - String - File identifier - fileid +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetFileData(Val Token, Val FileID) Export + + URL = "https://slack.com/api/files.info"; + Response = FileManagement(Token, FileID, URL, "GET"); + + Return Response; + +EndFunction + +// Delete file +// Deletes a file on Slack +// +// Parameters: +// Token - String - Bot token - token +// FileID - String - File identifier - fileid +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function DeleteFile(Val Token, Val FileID) Export + + URL = "https://slack.com/api/files.delete"; + Response = FileManagement(Token, FileID, URL); + + Return Response; + +EndFunction + +// Make file public +// Creates a public URL for the file. Requires user token +// +// Parameters: +// Token - String - User token - token +// FileID - String - File identifier - fileid +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function MakeFilePublic(Val Token, Val FileID) Export + + URL = "https://slack.com/api/files.sharedPublicURL"; + Response = FileManagement(Token, FileID, URL); + + Return Response; + +EndFunction + +// Make file private +// Removes the public URL from the file. Requires user token +// +// Parameters: +// Token - String - User token - token +// FileID - String - File identifier - fileid +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function MakeFilePrivate(Val Token, Val FileID) Export + + URL = "https://slack.com/api/files.revokePublicURL"; + Response = FileManagement(Token, FileID, URL); + + Return Response; + +EndFunction + +#EndRegion + +#Region DeletedFilesManagement + +// Get list of external files +// Gets a list of external files of a user or channel +// +// Parameters: +// Token - String - Bot token - token +// Channel - String - Channel for selection - channel +// Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetExternalFileList(Val Token, Val Channel = "", Val Cursor = "") Export + + URL = "https://slack.com/api/files.remote.list"; + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel , "String", Parameters); + OPI_Tools.AddField("cursor" , Cursor, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Get external file +// Gets information about the external file +// +// Parameters: +// Token - String - Bot token - token +// FileID - String - File identifier - fileid +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function GetExternalFile(Val Token, Val FileID) Export + + URL = "https://slack.com/api/files.remote.info"; + Response = ExternalFileManagement(Token, FileID, URL); + + Return Response; + +EndFunction + +// Add external file +// Adds a new external file +// +// Parameters: +// Token - String - Bot token - token +// URL - String - URL to external file - url +// Title - String - File title for Slack - title +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function AddExternalFile(Val Token, Val URL, Val Title) Export + + String_ = "String"; + URL = "https://slack.com/api/files.remote.add"; + Headers = GetAuthorizationHeader(Token); + UID = String(New UniqueIdentifier()); + + Parameters = New Structure; + OPI_Tools.AddField("external_url", URL , String_, Parameters); + OPI_Tools.AddField("external_id" , UID , String_, Parameters); + OPI_Tools.AddField("title" , Title , String_, Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Send external file +// Sends an external file to a list of channels +// +// Parameters: +// Token - String - Bot token - token +// FileID - String - File identifier - fileid +// ChannelArray - Array Of String - Array of channels for sending - channels +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function SendExternalFile(Val Token, Val FileID, Val ChannelArray) Export + + URL = "https://slack.com/api/files.remote.share"; + Headers = GetAuthorizationHeader(Token); + + OPI_TypeConversion.GetCollection(ChannelArray); + ChannelArray = StrJoin(ChannelArray, ","); + + Parameters = New Structure; + OPI_Tools.AddField("file" , FileID , "String", Parameters); + OPI_Tools.AddField("channels", ChannelArray , "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +// Delete external file +// Deletes an external file from Slack +// +// Parameters: +// Token - String - Bot token - token +// FileID - String - File identifier - fileid +// +// Return value: +// Key-Value Pair - Serialized JSON response from Slack +Function DeleteExternalFile(Val Token, Val FileID) Export + + URL = "https://slack.com/api/files.remote.remove"; + Response = ExternalFileManagement(Token, FileID, URL); + + Return Response; + +EndFunction + +#EndRegion + +#Region BlockFormation + +// Generate image block +// Generates a block with an image to add to the message block array +// +// Parameters: +// URL - String - Image URL - picture +// AlternateText - String - Alternate text of the image - alt +// +// Return value: +// Key-Value Pair - Image block +Function GenerateImageBlock(Val URL, Val AlternateText = "") Export + + String_ = "String"; + + Block = New Match; + OPI_Tools.AddField("type" , "image" , String_, Block); + OPI_Tools.AddField("image_url", URL , String_, Block); + OPI_Tools.AddField("alt_text" , AlternateText , String_, Block); + + Return Block; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function GetAuthorizationHeader(Val Token) + + OPI_TypeConversion.GetLine(Token); + + Headers = New Match; + Headers.Insert("Authorization", "Bearer " + Token); + Return Headers; + +EndFunction + +Function DialogManagement(Val Token, Val Channel, Val URL, Val RequestType = "POST") + + Headers = GetAuthorizationHeader(Token); + RequestType = inReg(RequestType); + + Parameters = New Structure; + OPI_Tools.AddField("channel", Channel, "String", Parameters); + + If RequestType = "POST" Then + Response = OPI_Tools.Post(URL, Parameters, Headers); + Else + Response = OPI_Tools.Get(URL, Parameters, Headers); + EndIf; + + Return Response; + +EndFunction + +Function FileManagement(Val Token, Val FileID, Val URL, Val RequestType = "POST") + + Headers = GetAuthorizationHeader(Token); + RequestType = inReg(RequestType); + + Parameters = New Structure; + OPI_Tools.AddField("file", FileID , "String", Parameters); + + If RequestType = "POST" Then + Response = OPI_Tools.Post(URL, Parameters, Headers); + Else + Response = OPI_Tools.Get(URL, Parameters, Headers); + EndIf; + + Return Response; + +EndFunction + +Function GeneralDataRetrieval(Val Token, Val URL, Val Cursor) + + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("cursor", Cursor, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +Function ExternalFileManagement(Val Token, Val FileID, Val URL) + + Headers = GetAuthorizationHeader(Token); + + Parameters = New Structure; + OPI_Tools.AddField("file", FileID , "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters, Headers); + + Return Response; + +EndFunction + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo new file mode 100644 index 0000000000..c81e3953ae --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="21b89e7a-e792-4a4c-9d01-c630225fe48a"> + <name>OPI_Slack</name> + <synonym> + <key>ru</key> + <value>Slack</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl new file mode 100644 index 0000000000..bdf1fc4a16 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl @@ -0,0 +1,1253 @@ +// Location OS: ./OInt/core/Modules/OPI_Telegram.os +// Library: Telegram +// CLI command: telegram + +// 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:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnreachableCode-off +// BSLLS:CommentedCode-off + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region DataRetrievalAndSettings + +// Get bot information +// Inыполняет запроwith /getMe, inозinращающий базоinую информацию о боте: имя, id, inозможноwithть dобаinлять бота in группы и т.d. +// +// Parameters: +// Token - String - Bot token - token +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function GetBotInformation(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/getMe"; + Response = OPI_Tools.Get(URL); + + Return Response; + +EndFunction + +// Get updates +// Executes a request /getUpdates, returning information about bot events. Used in polling mode +// +// Parameters: +// Token - String - Bot token - token +// Timeout - String, Number - Waiting time for new events - timeout +// Offset - String, Number - Offset in the list of received messages - offset +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function GetUpdates(Val Token, Val Timeout = 0, Val Offset = "") Export + + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/getUpdates"; + + Parameters = New Structure; + OPI_Tools.AddField("timeout", Timeout , "String", Parameters); + OPI_Tools.AddField("offset" , Offset, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + Return Response; + +EndFunction + +// Set Webhook +// Set webhook URL for bot event handling in webhook mode +// +// Parameters: +// Token - String - Bot token - token +// URL - String - Address processing запроwithоin от Telegram (with https:) - url +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SetWebhook(Val Token, Val URL) Export + + OPI_TypeConversion.GetLine(Token); + + Parameters = New Structure; + OPI_Tools.AddField("url", URL, "String", Parameters); + + URL = "api.telegram.org/bot" + Token + "/setWebHook"; + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Delete webhook +// Deletes the bot event handler URL for webhook operation +// +// Parameters: +// Token - String - Bot token - token +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function DeleteWebhook(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/deleteWebHook"; + Response = OPI_Tools.Get(URL); + + Return Response; + +EndFunction + +// Download file +// Download file from Telegram servers +// +// Parameters: +// Token - String - Token - token +// FileID - String - File ID for downloading - fileid +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function DownloadFile(Val Token, Val FileID) Export + + Result = "result"; + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(FileID); + + Parameters = New Structure("file_id", FileID); + + URL = "api.telegram.org/bot" + Token + "/getFile"; + Response = OPI_Tools.Get(URL, Parameters); + + Path = Response[Result]["file_path"]; + + If Not ValueFilled(Path) Then + Return Response; + EndIf; + + URL = "api.telegram.org/file/bot" + Token + "/" + Path; + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Process Telegram Mini App data +// Processes TMA data and determines its validity +// +// Parameters: +// DataString - String - Query from Telegram.WebApp.initData +// Token - String - Bot token +// +// Return value: +// Map from String - Map of data with the result of verification in the passed field +Function ProcessTMAData(Val DataString, Val Token) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(DataString); + + DataString = DecodeString(DataString, StringEncodingMethod.URLencoding); + DataStructure = OPI_Tools.RequestParametersToMatch(DataString); + Key = "WebAppData"; + Hash = ""; + BinaryKey = GetBinaryDataFromString(Key); + + Result = OPI_Cryptography.HMACSHA256(BinaryKey, GetBinaryDataFromString(Token)); + + TValue = New ValueTable; + TValue.Columns.Add("Key"); + TValue.Columns.Add("Value"); + + For Each Data In DataStructure Do + + NewLine = TValue.Add(); + NewLine.Key = Data.Key; + NewLine.Value = Data.Value; + + EndDo; + + TValue.Sort("Key"); + + ReturnMapping = New Match; + DCS = ""; + + For Each DataString In TValue Do + + If DataString.Key <> "hash" Then + DCS = DCS + DataString.Key + "=" + DataString.Value + Symbols.PS; + ReturnMapping.Insert(DataString.Key, DataString.Value); + Else + Hash = DataString.Value; + EndIf; + + EndDo; + + DCS = Left(DCS, StrLength(DCS) - 1); + Signature = OPI_Cryptography.HMACSHA256(Result, GetBinaryDataFromString(DCS)); + + Final = GetHexStringFromBinaryData(Signature); + + If Final = inReg(Hash) Then + Response = True; + Else + Response = False; + EndIf; + + ReturnMapping.Insert("passed", Response); + + Return ReturnMapping; + +EndFunction + +#EndRegion + +#Region DataSending + +// Send text message +// Sends a text message to a chat or channel +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Text - String - Message text - text +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// Markup - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendTextMessage(Val Token + , Val ChatID + , Val Text + , Val Keyboard = "" + , Val Markup = "Markdown") Export + + OPI_TypeConversion.GetLine(Token); + OPI_Tools.ReplaceSpecialCharacters(Text, Markup); + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode" , Markup , "String" , Parameters); + OPI_Tools.AddField("text" , Text , "String" , Parameters); + OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters); + + AddChatIdentifier(ChatID, Parameters); + + URL = "api.telegram.org/bot" + Token + "/sendMessage"; + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Send image +// Sends an image to a chat or channel +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Text - String - Message text - text +// Image - BinaryData,String - Image file - picture +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// Markup - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendImage(Val Token + , Val ChatID + , Val Text + , Val Image + , Val Keyboard = "" + , Val Markup = "Markdown") Export + + Return SendFile(Token, ChatID, Text, Image, "photo", Keyboard, Markup); + +EndFunction + +// Send video +// Sends a video to a chat or channel +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Text - String - Message text - text +// Video - BinaryData,String - Video file - video +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// Markup - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendVideo(Val Token + , Val ChatID + , Val Text + , Val Video + , Val Keyboard = "" + , Val Markup = "Markdown") Export + + Return SendFile(Token, ChatID, Text, Video, "video", Keyboard, Markup); + +EndFunction + +// Send audio +// Sends an audio file to a chat or channel +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Text - String - Message text - text +// Audio - BinaryData,String - Audio file - audio +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// Markup - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendAudio(Val Token + , Val ChatID + , Val Text + , Val Audio + , Val Keyboard = "" + , Val Markup = "Markdown") Export + + Return SendFile(Token, ChatID, Text, Audio, "audio", Keyboard, Markup); + +EndFunction + +// Send document +// Sends a document to a chat or channel +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Text - String - Message text - text +// Document - BinaryData,String - Document file - doc +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// Markup - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendDocument(Val Token + , Val ChatID + , Val Text + , Val Document + , Val Keyboard = "" + , Val Markup = "Markdown") Export + + Return SendFile(Token, ChatID, Text, Document, "document", Keyboard, Markup); + +EndFunction + +// Send GIF +// Sends a GIF to a chat or channel +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Text - String - Message text - text +// GIF - BinaryData,String - GIF file - gif +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// Markup - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendGif(Val Token + , Val ChatID + , Val Text + , Val GIF + , Val Keyboard = "" + , Val Markup = "Markdown") Export + + Return SendFile(Token, ChatID, Text, GIF, "animation", Keyboard, Markup); + +EndFunction + +// Send media group +// Sends a set of files to a chat or channel. Media types: audio, document, photo, video +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Text - String - Message text - text +// FileMapping - Map from String - File collection - media - File JSON or path to .json +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// Markup - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendMediaGroup(Val Token + , Val ChatID + , Val Text + , Val FileMapping + , Val Keyboard = "" + , Val Markup = "Markdown") Export + + // FileMapping + // Key - File, Value - Type + // Types: audio, document, photo, video + // Different types cannot be mixed! + + String_ = "String"; + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ChatID); + OPI_TypeConversion.GetCollection(FileMapping); + + OPI_Tools.ReplaceSpecialCharacters(Text, Markup); + + URL = "api.telegram.org/bot" + Token + "/sendMediaGroup"; + FileStructure = New Structure; + Media = New Array; + Parameters = New Structure; + + AddChatIdentifier(ChatID, Parameters); + FormMediaArray(FileMapping, Text, FileStructure, Media); + + OPI_Tools.AddField("parse_mode" , Markup , String_ , Parameters); + OPI_Tools.AddField("caption" , Text , String_ , Parameters); + OPI_Tools.AddField("media" , Media , String_ , Parameters); + OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters); + + Response = OPI_Tools.PostMultipart(URL, Parameters, FileStructure, "mixed"); + + Return Response; + +EndFunction + +// Send location +// Sends location by geographic latitude and longitude to a chat or channel +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Latitude - String, Number - Geographic latitude - lat +// Longitude - String, Number - Geographic longitude - long +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendLocation(Val Token, Val ChatID, Val Latitude, Val Longitude, Val Keyboard = "") Export + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ChatID); + + URL = "api.telegram.org/bot" + Token + "/sendLocation"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode" , "Markdown" , String_ , Parameters); + OPI_Tools.AddField("latitude" , Latitude , String_ , Parameters); + OPI_Tools.AddField("longitude" , Longitude , String_ , Parameters); + OPI_Tools.AddField("reply_markup", Keyboard , "FileString", Parameters); + + AddChatIdentifier(ChatID, Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Send contact +// Sends a contact with name and phone number +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Name - String - Contact name - name +// Last name - String - Contact last name - surname +// Phone - String - Contact phone number - phone +// Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendContact(Val Token, Val ChatID, Val Name, Val Last name, Val Phone, Val Keyboard = "") Export + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ChatID); + + URL = "api.telegram.org/bot" + Token + "/sendContact"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode" , "Markdown", String_ , Parameters); + OPI_Tools.AddField("first_name" , Name , String_ , Parameters); + OPI_Tools.AddField("last_name" , Last name , String_ , Parameters); + OPI_Tools.AddField("phone_number", Phone , String_ , Parameters); + OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters); + + AddChatIdentifier(ChatID, Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Send poll +// Sends a poll with answer options +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Question - String - Poll question - question +// AnswersArray - Array of Strings - Array of answer options - options +// Anonymous - Boolean - Poll anonymity - anonymous +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function SendPoll(Val Token, Val ChatID, Val Question, Val AnswersArray, Val Anonymous = True) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ChatID); + OPI_TypeConversion.GetCollection(AnswersArray); + + OPI_TypeConversion.GetBoolean(Anonymous); + + URL = "api.telegram.org/bot" + Token + "/sendPoll"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode", "Markdown" , "String" , Parameters); + OPI_Tools.AddField("question" , Question , "String" , Parameters); + OPI_Tools.AddField("options" , AnswersArray, "FileString", Parameters); + + Parameters.Insert("is_anonymous", ?(Anonymous, 1, 0)); + AddChatIdentifier(ChatID, Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Forward message +// Forwards a message between chats or within a chat +// +// Parameters: +// Token - String - Bot token - token +// OriginalID - String, Number - Original message ID - message +// FromID - String, Number - Chat ID of the original message - from +// ToID - String, Number - Target chat ID or ChatID*TopicID - to +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function ForwardMessage(Val Token, Val OriginalID, Val FromID, Val ToID) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(OriginalID); + OPI_TypeConversion.GetLine(FromID); + OPI_TypeConversion.GetLine(ToID); + + URL = "api.telegram.org/bot" + Token + "/forwardMessage"; + + Parameters = New Structure; + OPI_Tools.AddField("from_chat_id", FromID , "String", Parameters); + OPI_Tools.AddField("message_id" , OriginalID, "String", Parameters); + + AddChatIdentifier(ToID, Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Generate keyboard from array of buttons +// Generates a simple JSON keyboard from an array of buttons for a message or bottom panel +// +// Parameters: +// ButtonArray - Array of Strings - Array of buttons - buttons +// UnderMessage - Boolean - Keyboard under the message or on the bottom panel - under +// OneByOne - Boolean - True > buttons are displayed in a column, False > in a row - column +// +// Return value: +// String - Keyboard JSON +Function FormKeyboardFromButtonArray(Val ButtonArray + , Val UnderMessage = False + , Val OneByOne = True) Export + + OPI_TypeConversion.GetBoolean(UnderMessage); + OPI_TypeConversion.GetBoolean(OneByOne); + OPI_TypeConversion.GetCollection(ButtonArray); + + If OneByOne Then + Strings = CreateTallKeyboard(ButtonArray); + Else + Strings = CreateLongKeyboard(ButtonArray); + EndIf; + + If UnderMessage Then + ParameterStructure = New Structure("inline_keyboard,rows", Strings, 1); + Else + ParameterStructure = New Structure("keyboard,resize_keyboard", Strings, True); + EndIf; + + Keyboard = OPI_Tools.JSONString(ParameterStructure); + + Return Keyboard; + +EndFunction + +#EndRegion + +#Region Administration + +// Ban +// Bans a user in the selected chat +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// UserID - String, Number - Target user ID - user +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function Ban(Val Token, Val ChatID, Val UserID) Export + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/banChatMember"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode", "Markdown" , String_, Parameters); + OPI_Tools.AddField("chat_id" , ChatID , String_, Parameters); + OPI_Tools.AddField("user_id" , UserID, String_, Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Unban +// Unbans a previously banned user +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// UserID - String, Number - Target user ID - user +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function Unban(Val Token, Val ChatID, Val UserID) Export + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/unbanChatMember"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode" , "Markdown" , String_ , Parameters); + OPI_Tools.AddField("chat_id" , ChatID , String_ , Parameters); + OPI_Tools.AddField("user_id" , UserID, String_ , Parameters); + OPI_Tools.AddField("only_if_banned", False , "Boolean", Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Create invitation link +// Creates a link for joining a closed chat +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID or ChatID*TopicID - chat +// Title - String - Invitation title - title +// ExpirationDate - Date - Date of end жfromни withwithылtoи (withoutwithрочно, еwithли не уtoазано) - expire +// UserLimit - Number - Limit пользоinателей (беwithtoонечно, еwithли не уtoазано) - limit +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function CreateInvitationLink(Val Token + , Val ChatID + , Val Title = "" + , Val ExpirationDate = "" + , Val UserLimit = 0) Export + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/createChatInviteLink"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode" , "Markdown" , String_ , Parameters); + OPI_Tools.AddField("chat_id" , ChatID , String_ , Parameters); + OPI_Tools.AddField("name" , Title , String_ , Parameters); + OPI_Tools.AddField("member_limit" , UserLimit, String_ , Parameters); + OPI_Tools.AddField("expire_date" , ExpirationDate , "Date" , Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Pin message +// Pins a message in the chat header +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Target chat ID - chat +// MessageID - String, Number - Target message ID - message +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function PinMessage(Val Token, Val ChatID, Val MessageID) Export + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/pinChatMessage"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode" , "Markdown" , String_ , Parameters); + OPI_Tools.AddField("chat_id" , ChatID , String_ , Parameters); + OPI_Tools.AddField("message_id" , MessageID, String_ , Parameters); + OPI_Tools.AddField("disable_notification", False , "Boolean", Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Unpin message +// Unpins a message in the chat header +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID - chat +// MessageID - String, Number - Target message ID - message +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function UnpinMessage(Val Token, Val ChatID, Val MessageID) Export + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/unpinChatMessage"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode", "Markdown" , String_, Parameters); + OPI_Tools.AddField("chat_id" , ChatID , String_, Parameters); + OPI_Tools.AddField("message_id", MessageID, String_, Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Get participant count +// Gets the total number of chat participants +// +// Parameters: +// Token - String - Bot token - token +// ChatID - String, Number - Target chat ID - chat +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function GetParticipantCount(Val Token, Val ChatID) Export + + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/getChatMemberCount"; + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode", "Markdown" , "String", Parameters); + OPI_Tools.AddField("chat_id" , ChatID , "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +#EndRegion + +#Region ForumTopicManagement + +// Get avatar icon list +// Gets the mapping of Emoji IDs for setting as forum theme icons +// +// Parameters: +// Token - String - Token - token +// +// Return value: +// Key-Value Pair - Key > ID, Value > Emoji +Function GetAvatarIconList(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + Result = "result"; + URL = "api.telegram.org/bot" + Token + "/getForumTopicIconStickers"; + Response = OPI_Tools.Get(URL); + Icons = Response[Result]; + + If Not ValueFilled(Icons) Then + Return Response; + EndIf; + + Collection = New Match; + + For Each Icon In Icons Do + Collection.Insert(Icon["custom_emoji_id"], Icon["emoji"]); + EndDo; + + Return Collection; + +EndFunction + +// Create forum thread +// Creates a new thread in the group with theme functionality enabled +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread creation chat ID - forum +// Title - String - Thread title - title +// IconID - String - See GetAvatarIconList - icon +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function CreateForumThread(Val Token, Val ChatID, Val Title, Val IconID = "") Export + Return ForumTopicManagement(Token, ChatID, Title, IconID); +EndFunction + +// Edit forum thread +// Creates a new thread in the group with theme functionality enabled +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread creation chat ID - forum +// ThreadID - String, Number - Thread ID - topic +// Title - String - New title - title +// IconID - String - See GetAvatarIconList - icon +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function EditForumTopic(Val Token + , Val ChatID + , Val ThreadID + , Val Title = Undefined + , Val IconID = Undefined) Export + + Return ForumTopicManagement(Token, ChatID, Title, IconID, ThreadID); +EndFunction + +// Close forum thread +// Closes the thread for new messages +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread chat ID - forum +// ThreadID - String, Number - Thread ID - topic +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function CloseForumThread(Val Token, Val ChatID, Val ThreadID = "") Export + Return ManageForumThreadState(Token, ChatID, 2, ThreadID); +EndFunction + +// Open forum thread +// Reopens a previously closed forum thread +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread chat ID - forum +// ThreadID - String, Number - Thread ID - topic +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function OpenForumThread(Val Token, Val ChatID, Val ThreadID = "") Export + Return ManageForumThreadState(Token, ChatID, 1, ThreadID); +EndFunction + +// Delete forum thread +// Deletes a forum thread +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread chat ID - forum +// ThreadID - String, Number - Thread ID - topic +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function DeleteForumTopic(Val Token, Val ChatID, Val ThreadID) Export + Return ManageForumThreadState(Token, ChatID, 3, ThreadID); +EndFunction + +// Hide main forum thread +// Hides the main forum thread +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread chat ID - forum +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function HideMainForumTopic(Val Token, Val ChatID) Export + Return ManageMainTopicVisibility(Token, ChatID, True); +EndFunction + +// Show main forum thread +// Shows a previously hidden main forum thread +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread chat ID - forum +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function ShowMainForumTopic(Val Token, Val ChatID) Export + Return ManageMainTopicVisibility(Token, ChatID, False); +EndFunction + +// Edit main forum thread name +// Edits the name of the main forum thread +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread chat ID - forum +// Title - String - New main thread name - title +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function EditMainForumTopicName(Val Token, Val ChatID, Val Title) Export + + OPI_TypeConversion.GetLine(Token); + + URL = "api.telegram.org/bot" + Token + "/editGeneralForumTopic"; + + Parameters = New Structure; + OPI_Tools.AddField("chat_id", ChatID , "String", Parameters); + OPI_Tools.AddField("name" , Title, "String", Parameters); + + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +// Clear thread's pinned messages list +// Clears the list of pinned messages in the forum thread +// +// Parameters: +// Token - String - Token - token +// ChatID - String, Number - Thread chat ID - forum +// ThreadID - String, Number - Thread ID. Main if not filled - topic +// +// Return value: +// Key-Value Pair - Serialized JSON response from Telegram +Function ClearThreadPinnedMessagesList(Val Token, Val ChatID, Val ThreadID = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ChatID); + OPI_TypeConversion.GetLine(ThreadID); + + Parameters = New Structure; + OPI_Tools.AddField("chat_id" , ChatID, "String", Parameters); + OPI_Tools.AddField("message_thread_id", ThreadID, "String", Parameters); + + If ValueFilled(ThreadID) Then + Method = "/unpinAllForumTopicMessages"; + Else + Method = "/unpinAllGeneralForumTopicMessages"; + EndIf; + + URL = "api.telegram.org/bot" + Token + Method; + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function SendFile(Val Token, Val ChatID, Val Text, Val File, Val View, Val Keyboard, Val Markup) + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(ChatID); + OPI_TypeConversion.GetLine(View); + + Extension = ""; + Method = ""; + + DetermineSendMethod(View, Method, Extension); + ConvertFileData(File, Extension, View); + OPI_Tools.ReplaceSpecialCharacters(Text, Markup); + + Parameters = New Structure; + OPI_Tools.AddField("parse_mode" , Markup , "String" , Parameters); + OPI_Tools.AddField("caption" , Text , "String" , Parameters); + OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters); + + AddChatIdentifier(ChatID, Parameters); + + FileStructure = New Structure; + FileStructure.Insert(View + Extension, File); + + URL = "api.telegram.org/bot" + Token + Method; + Response = OPI_Tools.PostMultipart(URL, Parameters, FileStructure, "mixed"); + + Return Response; + +EndFunction + +Function ForumTopicManagement(Val Token + , Val ChatID + , Val Title = Undefined + , Val IconID = Undefined + , Val ThreadID = "") + + String_ = "String"; + OPI_TypeConversion.GetLine(Token); + + Parameters = New Structure; + OPI_Tools.AddField("name" , Title, String_, Parameters); + OPI_Tools.AddField("chat_id" , ChatID , String_, Parameters); + OPI_Tools.AddField("icon_custom_emoji_id", IconID , String_, Parameters); + OPI_Tools.AddField("message_thread_id" , ThreadID , String_, Parameters); + + If ValueFilled(ThreadID) Then + Method = "/editForumTopic"; + Else + Method = "/createForumTopic"; + EndIf; + + OPI_Tools.RemoveEmptyCollectionFields(Parameters); + Response = OPI_Tools.Get("api.telegram.org/bot" + Token + Method, Parameters); + + Return Response; + +EndFunction + +Function ManageForumThreadState(Val Token, Val ChatID, Val Status, Val ThreadID = "") + + OPI_TypeConversion.GetLine(Token); + + If ValueFilled(ThreadID) Then + Forum = "Forum"; + Else + Forum = "GeneralForum"; + EndIf; + + Method = DetermineForumManagementMethod(Status, Forum); + + Parameters = New Structure; + OPI_Tools.AddField("chat_id" , ChatID, "String", Parameters); + OPI_Tools.AddField("message_thread_id", ThreadID, "String", Parameters); + + URL = "api.telegram.org/bot" + Token + Method; + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +Function ManageMainTopicVisibility(Val Token, Val ChatID, Val Hide) + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetBoolean(Hide); + + If Hide Then + Method = "/hideGeneralForumTopic"; + Else + Method = "/unhideGeneralForumTopic"; + EndIf; + + Parameters = New Structure; + OPI_Tools.AddField("chat_id", ChatID, "String", Parameters); + + URL = "api.telegram.org/bot" + Token + Method; + Response = OPI_Tools.Get(URL, Parameters); + + Return Response; + +EndFunction + +Function DetermineForumManagementMethod(Val Status, Val Forum) + + Open = 1; + Close = 2; + Delete = 3; + + If Status = Open Then + Method = "/reopen" + Forum + "Topic"; + ElsIf Status = Close Then + Method = "/close" + Forum + "Topic"; + ElsIf Status = Delete Then + Method = "/deleteForumTopic"; + Else + Raise "Incorrect forum management status"; + EndIf; + + Return Method; + +EndFunction + +Function CreateTallKeyboard(Val ButtonArray) + + Strings = New Array; + + For Each Button In ButtonArray Do + Buttons = New Array; + Button = OPI_Tools.NumberToString(Button); + Buttons.Add(New Structure("text,callback_data", Button, Button)); + Strings.Add(Buttons); + EndDo; + + Return Strings; + +EndFunction + +Function CreateLongKeyboard(Val ButtonArray) + + Strings = New Array; + Buttons = New Array; + + For Each Button In ButtonArray Do + Button = OPI_Tools.NumberToString(Button); + Buttons.Add(New Structure("text,callback_data", Button, Button)); + EndDo; + + Strings.Add(Buttons); + + Return Strings; + +EndFunction + +Procedure FormMediaArray(Val FileMapping, Val Text, FileStructure, Media) + + Counter = 0; + + OPI_TypeConversion.GetCollection(FileMapping); + OPI_TypeConversion.GetLine(Text); + + If TypeValue(FileMapping) <> Type("Match") Then + // !OInt Raise("Failed to Retrieve Information from JSON media!"); + Return; + EndIf; + + For Each CurrentFile In FileMapping Do + + If Not TypeValue(CurrentFile.Key) = Type("BinaryData") Then + + Binary = CurrentFile.Key; + OPI_TypeConversion.GetBinaryData(Binary); + + ThisFile = New File(CurrentFile.Key); + MediaName = CurrentFile.Value + + String(Counter) + + ?(CurrentFile.Value = "document", ThisFile.Extension, ""); + + FullMediaName = StringReplace(MediaName, ".", "___"); + + Else + Binary = CurrentFile.Key; + MediaName = CurrentFile.Value + String(Counter); + FullMediaName = MediaName; + EndIf; + + FileStructure.Insert(FullMediaName, Binary); + + MediaStructure = New Structure; + MediaStructure.Insert("type" , CurrentFile.Value); + MediaStructure.Insert("media", "attach://" + MediaName); + + If Counter = 0 Then + MediaStructure.Insert("caption", Text); + EndIf; + + Media.Add(MediaStructure); + + Counter = Counter + 1; + + EndDo; + + Media = OPI_Tools.JSONString(Media); + +EndProcedure + +Procedure AddChatIdentifier(Val ChatID, Parameters) + + ChatID = OPI_Tools.NumberToString(ChatID); + ChatArray = StrSplit(ChatID, "*", False); + + If ChatArray.Quantity() > 1 Then + + ChatID = ChatArray[0]; + ThreadID = ChatArray[1]; + + Parameters.Insert("message_thread_id", ThreadID); + + EndIf; + + Parameters.Insert("chat_id", ChatID); + +EndProcedure + +Procedure DetermineSendMethod(Val View, Method, Extension) + + If View = "photo" Then + Method = "/sendPhoto"; + ElsIf View = "video" Then + Method = "/sendVideo"; + ElsIf View = "audio" Then + Method = "/sendAudio"; + ElsIf View = "document" Then + Method = "/sendDocument"; + ElsIf View = "animation" Then + Method = "/sendAnimation"; + Extension = ".gif"; + Else + Raise "Incorrect sending view"; + EndIf; + +EndProcedure + +Procedure ConvertFileData(File, Extension, View) + + If Not TypeValue(File) = Type("BinaryData") Then + + CurrentFile = New File(File); + Extension = ?(View = "document", CurrentFile.Extension, Extension); + OPI_TypeConversion.GetBinaryData(File); + + EndIf; + + Extension = StringReplace(Extension, ".", "___"); + +EndProcedure + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo new file mode 100644 index 0000000000..51643d7cc5 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="fe603e76-e34a-40fd-977d-ee3c2dbc6620"> + <name>OPI_Telegram</name> + <synonym> + <key>ru</key> + <value>Methodы интеграции with Telegram (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl new file mode 100644 index 0000000000..c60177beed --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl @@ -0,0 +1,682 @@ +// Location OS: ./OInt/core/Modules/OPI_Twitter.os +// Library: Twitter +// CLI Command: twitter + +// 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 +// If in не зtoете with чего toчать, то withтоит toйти метоd GetStandardParameters() +// and read comments + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +//@skip-check method-too-many-params + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region DataAndSettings + +// Get authorization link +// Forms a link for authorization via the browser +// +// Parameters: +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// String - URL for browser transition +Function GetAuthorizationLink(Parameters = "") Export + + Parameters_ = GetStandardParameters(Parameters); + + URLParameters = New Structure; + + URLParameters.Insert("response_type" , "code"); + URLParameters.Insert("client_id" , Parameters_["client_id"]); + URLParameters.Insert("redirect_uri" , Parameters_["redirect_uri"]); + URLParameters.Insert("scope" , Parameters_["scope"]); + URLParameters.Insert("state" , "state"); + URLParameters.Insert("code_challenge" , "challenge"); + URLParameters.Insert("code_challenge_method", "plain"); + + URLParameters = OPI_Tools.RequestParametersToString(URLParameters); + Link = "https://twitter.com/i/oauth2/authorize" + URLParameters; + + Return Link; + +EndFunction + +// Get token +// Gets the token by the code obtained during authorization via the link from GetAuthorizationLink +// +// Parameters: +// Code - String - Code obtained from authorization See GetAuthorizationLink - code +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function GetToken(Val Code, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Code); + + Parameters_ = GetStandardParameters(Parameters); + + RequestParameters = New Structure; + RequestParameters.Insert("code" , Code); + RequestParameters.Insert("grant_type" , "authorization_code"); + RequestParameters.Insert("client_id" , Parameters_["client_id"]); + RequestParameters.Insert("redirect_uri" , Parameters_["redirect_uri"]); + RequestParameters.Insert("code_verifier", "challenge"); + + Response = OPI_Tools.Post("https://api.twitter.com/2/oauth2/token" + , RequestParameters, , False); + + Return Response; + +EndFunction + +// Refresh token +// Updates the v2 token using the refresh_token +// +// Parameters: +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function RefreshToken(Val Parameters = "") Export + + Parameters_ = GetStandardParameters(Parameters); + Refresh = "refresh_token"; + + RequestParameters = New Structure; + RequestParameters.Insert(Refresh , Parameters_[Refresh]); + RequestParameters.Insert("grant_type" , Refresh); + RequestParameters.Insert("client_id" , Parameters_["client_id"]); + + Response = OPI_Tools.Post("https://api.twitter.com/2/oauth2/token" + , RequestParameters, , False); + + Return Response; + +EndFunction + +// !NOCLI +// Method for insertion into an http service, the address of which is specified in redirect_uri +// Calls the token acquisition method, as for obtaining a token from the code received +// on redirect_uri after authorization via the browser is only 30 seconds +// +// Parameters: +// Request - HTTPServiceRequest - Request coming to the http service +// +// Return value: +// HTTPResponse, Arbitrary, BinaryData - Result of reading the JSON response from the server +Function HandleIncomingRequestAfterAuthorization(Request) Export + + Code = Request.RequestParameters["code"]; + TokenResponse = GetToken(Code); + + // BSLLS:CommentedCode-off + // Preferred token storage + // Constants.TwitterRefresh.Уwithтаноinить(TokenResponse["refresh_token"]); + // Constants.TwitterToken.Уwithтаноinить(TokenResponse["access_token"]); + // BSLLS:CommentedCode-on + + Return TokenResponse; + +EndFunction + +#EndRegion + +#Region Tweets + +// !NOCLI +// Create custom tweet +// +// Parameters: +// Text - String - Tweet text +// MediaArray - Array from String, BinaryData - Array of binary data or file paths +// PollOptionsArray - Array of Strings - Array of poll options, if necessary +// PollDuration - String, Number - Poll duration, еwithли необхоdимо (опроwith without dлительноwithти не withозdаетwithя) +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function CreateCustomTweet(Val Text = "" + , Val MediaArray = "" + , Val PollOptionsArray = "" + , Val PollDuration = "" + , Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Text); + OPI_TypeConversion.GetLine(PollDuration); + + If ValueFilled(MediaArray) Then + OPI_TypeConversion.GetCollection(MediaArray); + EndIf; + + If ValueFilled(PollOptionsArray) Then + OPI_TypeConversion.GetCollection(PollOptionsArray); + EndIf; + + Parameters_ = GetStandardParameters(Parameters); + URL = "https://api.twitter.com/2/tweets"; + Array = "Array"; + Fields = New Match; + + If ValueFilled(Text) Then + Fields.Insert("text", Text); + EndIf; + + If TypeValue(PollOptionsArray) = Type(Array) And ValueFilled(PollDuration) Then + + PollDuration = Number(PollDuration); + + If PollOptionsArray.Quantity() > 0 Then + + OptionStructure = New Structure("options,duration_minutes", PollOptionsArray, PollDuration); + Fields.Insert("poll", OptionStructure); + + EndIf; + + EndIf; + + If TypeValue(MediaArray) = Type(Array) Then + If MediaArray.Quantity() > 0 Then + Fields.Insert("media", New Structure("media_ids", MediaArray)); + EndIf; + EndIf; + + Authorization = CreateAuthorizationHeaderV2(Parameters_); + Response = OPI_Tools.Post(URL, Fields, Authorization); + + Return Response; + +EndFunction + +// Create text tweet +// Creates a tweet without attachments +// +// Parameters: +// Text - String - Tweet text - text +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function CreateTextTweet(Val Text, Val Parameters = "") Export + Return CreateCustomTweet(Text, , , , Parameters); +EndFunction + +// Create image tweet +// Creates a tweet with an image attachment +// +// Parameters: +// Text - String - Tweet text - text +// ImageArray - Array from String, BinaryData - Image files array - pictures +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function Create image tweet(Val Text, Val ImageArray, Val Parameters = "") Export + + MediaArray = Upload attachments array(ImageArray, "tweet_image", Parameters); + Return CreateCustomTweet(Text, MediaArray, , , Parameters); + +EndFunction + +// Create gif tweet +// Creates a tweet with a gif attachment +// +// Parameters: +// Text - String - Tweet text - text +// Gif array - Array from String, BinaryData - Gif files array - gifs +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function CreateGifTweet(Val Text, Val Gif array, Val Parameters = "") Export + + MediaArray = Upload attachments array(Gif array, "tweet_gif", Parameters); + Return CreateCustomTweet(Text, MediaArray, , , Parameters); + +EndFunction + +// Create video tweet +// Creates a tweet with a video attachment +// +// Parameters: +// Text - String - Tweet text - text +// Video array - Array from String, BinaryData - Video files array - videos +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function CreateVideoTweet(Val Text, Val Video array, Val Parameters = "") Export + + MediaArray = Upload attachments array(Video array, "tweet_video", Parameters); + Return CreateCustomTweet(Text, MediaArray, , , Parameters); + +EndFunction + +// Create poll tweet +// Creates a tweet with a poll +// +// Parameters: +// Text - String - Tweet text - text +// OptionArray - Array of Strings - Poll options array - options +// Duration - String, Number - Poll duration - duration +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - serialized JSON response from Twitter +Function CreatePollTweet(Val Text, Val OptionArray, Val Duration, Val Parameters = "") Export + Return CreateCustomTweet(Text, , OptionArray, Duration, Parameters); +EndFunction + +// Upload attachments array !NOCLI +// Uploads files to the server and returns their IDs +// +// Parameters: +// ArrayOfFiles - Array from String, BinaryData - Files array +// AttachmentsType - String - Attachments type +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Array Of String - Media ID array +Function Upload attachments array(Val ArrayOfFiles, Val AttachmentsType, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(AttachmentsType); + OPI_TypeConversion.GetCollection(ArrayOfFiles); + + MediaArray = New Array; + Parameters_ = GetStandardParameters(Parameters); + MIS = "media_id_string"; + + If ValueFilled(ArrayOfFiles) Then + + For Each SendingFile In ArrayOfFiles Do + + OPI_TypeConversion.GetBinaryData(SendingFile); + + Response = UploadMediaFile(SendingFile, AttachmentsType, Parameters_); + MediaID = Response[MIS]; + + If Not ValueFilled(MediaID) Then + Return Response; + EndIf; + + MediaArray.Add(MediaID); + + EndDo; + + EndIf; + + Return MediaArray; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function UploadMediaFile(Val File, Val Type, Val Parameters) + + OPI_TypeConversion.GetBinaryData(File); + + RequestType = "POST"; + Parameters_ = GetStandardParameters(Parameters); + URL = "https://upload.twitter.com/1.1/media/upload.json"; + + If Type = "tweet_image" Then + + Fields = New Structure; + Fields.Insert("media_data" , Base64String(File)); + Fields.Insert("media_category", Type); + + Authorization = CreateAuthorizationHeaderV1(Parameters_, Fields, RequestType, URL); + Response = OPI_Tools.Post(URL, Fields, Authorization, False); + + Else + + Response = UploadMediaInParts(File, Type, RequestType, URL, Parameters_); + + EndIf; + + Return Response; + +EndFunction + +Function UploadMediaInParts(Val File, Val Type, Val RequestType, Val URL, Parameters) + + Unit = 1024; + Quantity = 4; + MediaKey = "media_key"; + MIS = "media_id_string"; + Command = "command"; + Size = File.Size(); + + MIMETypeMapping = New Match; + MIMETypeMapping.Insert("tweet_image", "image/jpeg"); + MIMETypeMapping.Insert("tweet_video", "video/mp4"); + MIMETypeMapping.Insert("tweet_gif" , "image/gif"); + + ChunkSize = Quantity * Unit * Unit; + ArrayReading = SplitBinaryData(File, ChunkSize); + + Fields = New Structure; + Fields.Insert(Command , "INIT"); + Fields.Insert("total_bytes" , OPI_Tools.NumberToString(Size)); + Fields.Insert("media_type" , MIMETypeMapping.Get(Type)); + Fields.Insert("media_category" , Type); + + Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, RequestType, URL); + + InitializationResponse = OPI_Tools.Post(URL, Fields, Authorization, False); + InitializationKey = InitializationResponse[MediaKey]; + InitializationID = InitializationResponse[MIS]; + + If Not ValueFilled(InitializationKey) Or Not ValueFilled(InitializationID) Then + Return InitializationResponse; + EndIf; + + Counter = 0; + + For Each Part In ArrayReading Do + + Fields = New Structure; + Fields.Insert(Command , "APPEND"); + Fields.Insert("media_key" , InitializationKey); + Fields.Insert("segment_index" , OPI_Tools.NumberToString(Counter)); + Fields.Insert("media" , Part); + + Authorization = CreateAuthorizationHeaderV1(Parameters, New Structure, RequestType, URL); + + OPI_Tools.PostMultipart(URL, Fields, , , Authorization); + + Counter = Counter + 1; + + EndDo; + + Fields = New Structure; + Fields.Insert(Command , "FINALIZE"); + Fields.Insert("media_id", InitializationID); + + ProcessingStatus = GetProcessingStatus(Parameters, Fields, URL); + + If Not TypeValue(ProcessingStatus) = Type("String") Then + Return ProcessingStatus; + EndIf; + + Response = WaitForProcessingCompletion(ProcessingStatus, InitializationID, URL, Parameters); + + Return Response; + +EndFunction + +Function WaitForProcessingCompletion(Val ProcessingStatus, Val InitializationID, Val URL, Val Parameters) + + ProcessingInfo = "processing_info"; + Command = "command"; + Fields = New Structure; + + Fields.Insert(Command , "STATUS"); + Fields.Insert("media_id", InitializationID); + + WHile String(ProcessingStatus) = "pending" Or String(ProcessingStatus) = "in_progress" Do + + Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, "GET", URL); + Response = OPI_Tools.Get(URL, Fields, Authorization); + Information = Response[ProcessingInfo]; + + If Not ValueFilled(Information) Then + Return Response; + EndIf; + + ProcessingStatus = Information["state"]; + + If Not ValueFilled(ProcessingStatus) Then + Return Response; + EndIf; + + EndDo; + + If ProcessingStatus = "failed" Then + Raise "Twitter could not process the video you uploaded"; + EndIf; + + Return Response; + +EndFunction + +Function GetStandardParameters(Val Parameters = "") + + // Зdеwithь withобрано опреdеление data, необхоdимых for work. + // For Twitter this dоinольно зtoчительный toбор, which is due to the presence of two at once API, + // toоторые, при thisм, withозdаны не for разныз заdач, но проwithто яinляютwithя inерwithиями dруг dруга. + // Аtoтуальной inерwithией API яinляетwithя v2 и оto требует получения inременных тоtoеноin. Notwithмотря to то, + // that Twitter insists on using this latest version, they somehow managed not to transfer + // file upload mechanism and some others from the old version - v1.1. Therefore, something needs to be done + // to inерwithии 1.1, and something on 2: up to the point that they removed the ability to post tweets from v1.1, + // but only through it you can add a picture to the tweet. At the same time, their authentication methods and tokens are different + + // Мироinая гигоtoорпорация Andлоto Маwithtoа, towithтати, toпомиtoю ;) + + // P.S Далее чаwithто упомиtoетwithя "withтраница towithтроеto Twitter Developer" - this + // https://developer.twitter.com/en/portal/dashboard и inыбор toонtoретного проеtoта from withпиwithtoа (зtoчеto c toлючем) + + Parameters_ = New Match; + Permissions = "tweet.read tweet.write tweet.moderate.write users.read " + + "follows.read follows.write offline.access space.read mute.read " + + "mute.write like.read like.write list.read list.write block.read " + + "block.write bookmark.read bookmark.write"; + + // Data for API v2 + + // redirect_uri - URL of your http service (or other request handler) for authorization + // scope - a set of permissions for the received key. Can be any, but offline.access is mandatory + // client_id - From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer + // client_secret - From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer + // access_token - GetAuthorizationLink() -> Браузер -> code приdет to redirect_uri -> GetToken(code) + // refresh_token - Comes together with access_token and is used to refresh it (access_token lifetime - 2 ч) + // Обноinление проиwithхоdит метоdом RefreshToken with ноinыми access_token и refresh_token. + // For the next update, you need to use a new refresh_token, so hardcode + // не получитwithя (access_token тоже не получитwithя) + + // |--> RefreshToken() ->| access_token --> Used in the interval of 2 hours for requests + // | |refresh_token --| + // |--------[after 2 hrs.]-------------------| + + // Data for API v1.1 + + // oauth_token - From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer + // oauth_token_secret - From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer + // oauth_consumer_key - From Consumer Keys -> Access Token and Secret settings page of Twitter Developer + // oauth_consumer_secret - From Consumer Keys -> Access Token and Secret settings page of Twitter Developer + + // These tokens do not need to be updated + + Parameters_.Insert("redirect_uri" , ""); + Parameters_.Insert("scope" , Permissions); + Parameters_.Insert("client_id" , ""); + Parameters_.Insert("client_secret" , ""); + Parameters_.Insert("access_token" , ""); // Should be something like Constants.TwitterToken.Get() + Parameters_.Insert("refresh_token" , ""); // Should be something like Constants.TwitterRefresh.Get() + Parameters_.Insert("oauth_token" , ""); + Parameters_.Insert("oauth_token_secret" , ""); + Parameters_.Insert("oauth_consumer_key" , ""); + Parameters_.Insert("oauth_consumer_secret", ""); + + OPI_TypeConversion.GetCollection(Parameters); + + If TypeValue(Parameters) = Type("Structure") Or TypeValue(Parameters) = Type("Match") Then + For Each PassedParameter In Parameters Do + Parameters_.Insert(PassedParameter.Key, OPI_Tools.NumberToString(PassedParameter.Value)); + EndDo; + EndIf; + + Return Parameters_; + +EndFunction + +Function CreateAuthorizationHeaderV1(Val Parameters, Val Fields, Val RequestType, Val URL) + + CurrentDate = OPI_Tools.GetCurrentDate(); + AuthorizationHeader = ""; + HashingMethod = "HMAC-SHA1"; + APIVersion = "1.0"; + SignatureString = ""; + Signature = ""; + OCK = "oauth_consumer_key"; + OTK = "oauth_token"; + CurrentUNIXDate = OPI_Tools.UNIXTime(CurrentDate); + CurrentUNIXDate = OPI_Tools.NumberToString(CurrentUNIXDate); + ParametersTable = New ValueTable; + ParametersTable.Columns.Add("Key"); + ParametersTable.Columns.Add("Value"); + + For Each Field In Fields Do + + NewLine = ParametersTable.Add(); + NewLine.Key = Field.Key; + NewLine.Value = Field.Value; + + EndDo; + + NewLine = ParametersTable.Add(); + NewLine.Key = OCK; + NewLine.Value = Parameters[OCK]; + + NewLine = ParametersTable.Add(); + NewLine.Key = OTK; + NewLine.Value = Parameters[OTK]; + + NewLine = ParametersTable.Add(); + NewLine.Key = "oauth_version"; + NewLine.Value = APIVersion; + + NewLine = ParametersTable.Add(); + NewLine.Key = "oauth_signature_method"; + NewLine.Value = HashingMethod; + + NewLine = ParametersTable.Add(); + NewLine.Key = "oauth_timestamp"; + NewLine.Value = CurrentUNIXDate; + + NewLine = ParametersTable.Add(); + NewLine.Key = "oauth_nonce"; + NewLine.Value = CurrentUNIXDate; + + For Each TableRow In ParametersTable Do + + TableRow.Key = EncodeString(TableRow.Key, StringEncodingMethod.URLencoding); + TableRow.Value = EncodeString(TableRow.Value, StringEncodingMethod.URLencoding); + + EndDo; + + ParametersTable.Sort("Key"); + + For Each TableRow In ParametersTable Do + + SignatureString = SignatureString + + TableRow.Key + + "=" + + TableRow.Value + + "&"; + + EndDo; + + SignatureString = Left(SignatureString, StrLength(SignatureString) - 1); + SignatureString = inReg(RequestType) + + "&" + + EncodeString(URL, StringEncodingMethod.URLencoding) + + "&" + + EncodeString(SignatureString, StringEncodingMethod.URLencoding); + + Signature = EncodeString(Parameters["oauth_consumer_secret"], StringEncodingMethod.URLencoding) + + "&" + + EncodeString(Parameters["oauth_token_secret"], StringEncodingMethod.URLencoding); + + Signature = OPI_Cryptography.HMAC(GetBinaryDataFromString(Signature) + , GetBinaryDataFromString(SignatureString) + , HashFunction.SHA1 + , 64); + + Signature = EncodeString(Base64String(Signature), StringEncodingMethod.URLencoding); + + Delimiter = ""","; + AuthorizationHeader = AuthorizationHeader + + "OAuth " + + "oauth_consumer_key=""" + Parameters[OCK] + Delimiter + + "oauth_token=""" + Parameters[OTK] + Delimiter + + "oauth_signature_method=""" + HashingMethod + Delimiter + + "oauth_timestamp=""" + CurrentUNIXDate + Delimiter + + "oauth_nonce=""" + CurrentUNIXDate + Delimiter + + "oauth_version=""" + APIVersion + Delimiter + + "oauth_signature=""" + Signature; + + HeaderMapping = New Match; + HeaderMapping.Insert("authorization", AuthorizationHeader); + + Return HeaderMapping; + +EndFunction + +Function CreateAuthorizationHeaderV2(Val Parameters) + + ReturnMapping = New Match; + ReturnMapping.Insert("Authorization", "Bearer " + Parameters["access_token"]); + + Return ReturnMapping; + +EndFunction + +Function GetProcessingStatus(Val Parameters, Val Fields, Val URL) + + ProcessingInfo = "processing_info"; + Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, "POST", URL); + + Response = OPI_Tools.Post(URL, Fields, Authorization, False); + Information = Response[ProcessingInfo]; + + If Not ValueFilled(Information) Then + Return Response; + EndIf; + + ProcessingStatus = Information["state"]; + + If Not ValueFilled(ProcessingStatus) Then + Return Response; + Else + Return ProcessingStatus; + EndIf; + +EndFunction + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo new file mode 100644 index 0000000000..c6382a73c3 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="748f90c6-8251-482b-a249-b0372df0c72e"> + <name>OPI_Twitter</name> + <synonym> + <key>ru</key> + <value>Methodы work with Twitter (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_VK/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_VK/Module.bsl new file mode 100644 index 0000000000..4881808620 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_VK/Module.bsl @@ -0,0 +1,2190 @@ +// Location OS: ./OInt/core/Modules/OPI_VK.os +// Library: VK +// CLI Command: vk + +// 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 +// If in не зtoете with чего toчать, то withтоит toйти метоd GetStandardParameters() +// and read comments + +// BSLLS:NumberOfOptionalParams-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off +// BSLLS:UnusedLocalVariable-off + +//@skip-check method-too-many-params +//@skip-check wrong-string-literal-content + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region TokenRetrieval + +// Create token retrieval link +// Getting a link for interactive token retrieval (access_token), which is necessary +// for further actions +// +// Parameters: +// app_id - String, Number - app_id from application settings - app +// +// Return value: +// String - URL to go to in the browser +Function CreateTokenRetrievalLink(Val App_id) Export + + OPI_TypeConversion.GetLine(App_id); + + // access_token will need to be taken from the parameter in the browser address bar + Return "https://oauth.vk.com/authorize?client_id=" + App_id + + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video" + + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html"; + +EndFunction + +#EndRegion + +#Region GroupWork + +// Create post +// Creates a post with images +// +// Parameters: +// Text - String - Post text - text +// ImageArray - Array from String, BinaryData - Array of images - pictures +// Advertisement - Boolean - Indication ""Это реtoлама"" - ad +// LinkUnderPost - String - Link (URL) under the post - url +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreatePost(Val Text + , Val ImageArray + , Val Advertisement = False + , Val LinkUnderPost = "" + , Val Parameters = "") Export + + OPI_TypeConversion.GetCollection(ImageArray); + + Parameters_ = GetStandardParameters(Parameters); + AttachmentsArray = New Array; + + For Each PostImage In ImageArray Do + + Parameters_ = GetStandardParameters(Parameters); + ResponseCorrespondence = GetImageCorrespondence(PostImage, Parameters_, "Post"); + + OwnerId = ResponseCorrespondence.Get("owner_id"); + ObjectId = ResponseCorrespondence.Get("id"); + + If Not ValueFilled(OwnerId) Or Not ValueFilled(ObjectId) Then + Return ResponseCorrespondence; + EndIf; + + OwnerId = OPI_Tools.NumberToString(OwnerId); + ObjectId = OPI_Tools.NumberToString(ObjectId); + + PhotoID = "photo" + OwnerId + "_" + ObjectId; + + AttachmentsArray.Add(PhotoID); + + EndDo; + + Response = CreateCompositePost(Text, AttachmentsArray, Advertisement, LinkUnderPost, Parameters); + + Return Response; + +EndFunction + +// Create composite post +// Созdает поwithт to mainоinе маwithwithиinа иdетифиtoатороin объеtoтоin (toартиноto, inиdео и dр.) +// +// Parameters: +// Text - String - Post text - text +// Objects - Array of Strings - Array of identifiers like photo123_123 - objects +// Advertisement - Boolean - Indication ""Это реtoлама"" - ad +// LinkUnderPost - String - Link (URL) under the post - url +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateCompositePost(Val Text + , Val Objects + , Val Advertisement = False + , Val LinkUnderPost = "" + , Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Text); + OPI_TypeConversion.GetLine(LinkUnderPost); + OPI_TypeConversion.GetBoolean(Advertisement); + + Parameters = GetStandardParameters(Parameters); + AttachmentsString = StrJoin(Objects, ","); + AttachmentsString = AttachmentsString + LinkUnderPost; + + Parameters.Insert("message" , Text); + Parameters.Insert("attachments" , AttachmentsString); + Parameters.Insert("mark_as_ads" , ?(Advertisement, 1, 0)); + Parameters.Insert("close_comments" , ?(Advertisement, 1, 0)); + + Response = OPI_Tools.Get("api.vk.com/method/wall.post", Parameters); + + Return Response; + +EndFunction + +// Delete post +// Deletes a post by ID +// +// Parameters: +// PostID - String, Number - Post ID - post +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function DeletePost(Val PostID, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(PostID); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("post_id", PostID); + + Response = OPI_Tools.Get("api.vk.com/method/wall.delete", Parameters_); + + Return Response; + +EndFunction + +// Create poll +// Creates a poll with answer options +// +// Parameters: +// Question - String - Poll question - question +// AnswersArray - Array of Strings - Array of answer options - options +// Image - String, BinaryData - Poll image - picture +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreatePoll(Val Question, Val AnswersArray, Val Image = "", Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Question); + OPI_TypeConversion.GetCollection(AnswersArray); + + Parameters_ = GetStandardParameters(Parameters); + Response = "response"; + + If ValueFilled(Image) Then + + Response = UploadPhotoToServer(Image, Parameters_, "Poll"); + + Photo = Response.Get(Response); + + If ValueFilled(Photo) Then + + PhotoID = Photo["id"]; + + If Not ValueFilled(PhotoID) Then + Return Response; + EndIf; + + Else + Return Response; + EndIf; + + EndIf; + + Parameters_.Insert("is_anonymous", 1); + Parameters_.Insert("is_multiple" , 0); + + Answers = StrJoin(AnswersArray, ""","""); + Answers = "[""" + Answers + """]"; + + Parameters_.Insert("add_answers", Answers); + Parameters_.Insert("photo_id" , OPI_Tools.NumberToString(PhotoID)); + Parameters_.Insert("question" , Question); + + Poll = OPI_Tools.Get("api.vk.com/method/polls.create", Parameters_); + PollCorrespondence = Poll.Get(Response); + + If Not ValueFilled(PollCorrespondence) Then + Return Poll; + EndIf; + + OwnerId = PollCorrespondence.Get("owner_id"); + ObjectId = PollCorrespondence.Get("id"); + + If Not ValueFilled(OwnerId) Or Not ValueFilled(ObjectId) Then + Return Poll; + EndIf; + + PollID = "poll" + + OPI_Tools.NumberToString(OwnerId) + + "_" + + OPI_Tools.NumberToString(ObjectId); + + Parameters_.Insert("attachments", PollID); + + Response = OPI_Tools.Get("api.vk.com/method/wall.post", Parameters_); + + Return Response; + +EndFunction + +// Create album +// Creates an album to store images +// +// Parameters: +// Name - String - Album name - title +// Description - String - Album description - description +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateAlbum(Val Name, Val Description = "", Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetLine(Description); + + Parameters_ = GetStandardParameters(Parameters); + + Parameters_.Insert("title" , Name); + Parameters_.Insert("description" , Description); + Parameters_.Insert("upload_by_admins_only", 1); + + Response = OPI_Tools.Get("api.vk.com/method/photos.createAlbum", Parameters_); + + Return Response; + +EndFunction + +// Delete album +// Deletes a previously created album +// +// Parameters: +// AlbumID - String, Number - Album ID - album +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function DeleteAlbum(Val AlbumID, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(AlbumID); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("album_id", OPI_Tools.NumberToString(AlbumID)); + + Response = OPI_Tools.Get("api.vk.com/method/photos.deleteAlbum", Parameters_); + + Return Response; + +EndFunction + +// Create story +// Creates a story from an image +// +// Parameters: +// Image - String, BinaryData - Story background - picture +// URL - String - URL for button under the story - url +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateStory(Val Image, Val URL = "", Val Parameters = "") Export + + OPI_TypeConversion.GetLine(URL); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("link_text" , "more"); + Parameters_.Insert("link_url" , URL); + Parameters_.Insert("add_to_news", "1"); + + Response = UploadPhotoToServer(Image, Parameters_, "Story"); + Return Response; + +EndFunction + +// Save image to album +// Saves an image to the community album +// +// Parameters: +// AlbumID - String, Number - Album ID - album +// Image - BinaryData,String - Image file - picture +// Description - String - Image description - description +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function SaveImageToAlbum(Val AlbumID, Val Image, Val Description = "", Val Parameters = "") Export + + OPI_TypeConversion.GetLine(AlbumID); + OPI_TypeConversion.GetLine(Description); + + Parameters_ = GetStandardParameters(Parameters); + + Parameters_.Insert("album_id", AlbumID); + Parameters_.Insert("caption" , Description); + + Return UploadPhotoToServer(Image, Parameters_, "Album"); + +EndFunction + +// Delete image +// Deletes an image from the album +// +// Parameters: +// ImageID - String, Number - Image ID - pictureid +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function DeleteImage(Val ImageID, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(ImageID); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("photo_id", ImageID); + + Response = OPI_Tools.Get("api.vk.com/method/photos.delete", Parameters_); + + Return Response; + +EndFunction + +// Upload video to server +// Uploads video to the group for further use +// +// Parameters: +// Video - String, BinaryData - Video file - file +// Name - String - Video name - title +// Description - String - Video description - description +// Album - String - Album ID, if necessary - album +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function UploadVideoToServer(Val Video + , Val Name + , Val Description = "" + , Val Album = "" + , Val Parameters = "") Export + + String_ = "String"; + Parameters = GetStandardParameters(Parameters); + + OPI_Tools.AddField("name" , Name, String_, Parameters); + OPI_Tools.AddField("description", Description , String_, Parameters); + OPI_Tools.AddField("album_id" , Album , String_, Parameters); + + Response = OPI_Tools.Get("api.vk.com/method/video.save", Parameters); + + Result = Response["response"]; + + If Not ValueFilled(Result) Then + Return Response; + EndIf; + + URL = Result["upload_url"]; + + If Not ValueFilled(URL) Then + Return Response; + EndIf; + + FileMapping = New Match; + OPI_Tools.AddField("video_file.mp4", Video, "BinaryData", FileMapping); + + DataSize = FileMapping["video_file.mp4"].Size(); + DataSize = OPI_Tools.NumberToString(DataSize); + + Response = OPI_Tools.PostMultipart(URL, , FileMapping, "video/mp4"); + + Return Response; + +EndFunction + +// Upload photo to server +// Uploads photo to server for further use +// +// Parameters: +// Image - String, BinaryData - Image file - file +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// View - String - View upload (Post, Product, Story, Poll, Miscellaneous) - type +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function UploadPhotoToServer(Val Image, Val Parameters = "", Val View = "Post") Export + + Parameters = GetStandardParameters(Parameters); + Method = DetermineImageUploadMethod(View); + Files = New Match; + + Response = "response"; + URL = "api.vk.com/method/"; + Upload = URL + Method["Upload"]; + Save = URL + Method["Save"]; + + If TypeValue(Image) = Type("String") Then + ImageKey = StringReplace(Image, ".", "___"); + OPI_TypeConversion.GetBinaryData(Image); + Else + ImageKey = "image___jpeg"; + EndIf; + + Files.Insert(ImageKey, Image); + + For N = 1 For 5 Do + + Response = OPI_Tools.Get(Upload, Parameters); + Result = Response[Response]; + + If ValueFilled(Result) Then + + URL = Result["upload_url"]; + + If Not ValueFilled(URL) Then + Return Response; + EndIf; + + Else + Return Response; + EndIf; + + Parameters.Insert("upload_url", URL); + Response = OPI_Tools.PostMultipart(URL, Parameters, Files); + + If TypeValue(Response) = Type("Match") Then + Break; + EndIf; + + EndDo; + + If TypeValue(Response) <> Type("Match") Then + Return GetStringFromBinaryData(Response); + EndIf; + + FillPhotoUploadParameters(Method, Response, Parameters); + + Response = OPI_Tools.Get(Save, Parameters); + + Return Response; + +EndFunction + +#EndRegion + +#Region DiscussionManagement + +// Create discussion +// Creates a new discussion +// +// Parameters: +// Name - String - Discussion name - title +// Text of the first message - String - Text of the first message - text +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateDiscussion(Val Name, Val Text of the first message, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetLine(Text of the first message); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("title", Name); + Parameters_.Insert("text" , Text of the first message); + + Response = OPI_Tools.Get("api.vk.com/method/board.addTopic", Parameters_); + + Return Response; + +EndFunction + +// Close discussion +// Close or delete discussion +// +// Parameters: +// DiscussionID - String, Number - Discussion ID - topic +// Delete completely - Boolean - Delete completely (True) or close - remove +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CloseDiscussion(Val DiscussionID, Val Delete completely = False, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(DiscussionID); + OPI_TypeConversion.GetBoolean(Delete completely); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("topic_id", DiscussionID); + + Method = ?(Delete completely, "deleteTopic", "closeTopic"); + Response = OPI_Tools.Get("api.vk.com/method/board." + Method, Parameters_); + + Return Response; + +EndFunction + +// Open discussion +// Opens a previously closed discussion +// +// Parameters: +// DiscussionID - String, Number - Discussion ID - topic +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function OpenDiscussion(Val DiscussionID, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(DiscussionID); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("topic_id", DiscussionID); + + Response = OPI_Tools.Get("api.vk.com/method/board.openTopic", Parameters_); + + Return Response; + +EndFunction + +// Write in discussion +// Adds a message to the discussion on behalf of the group +// +// Parameters: +// DiscussionID - String, Number - Discussion ID - topic +// Text - String - Message text - text +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function WriteInDiscussion(Val DiscussionID, Val Text, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(DiscussionID); + OPI_TypeConversion.GetLine(Text); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("topic_id", DiscussionID); + Parameters_.Insert("message" , Text); + + Response = OPI_Tools.Get("api.vk.com/method/board.createComment", Parameters_); + + Return Response; + +EndFunction + +#EndRegion + +#Region InteractiveActions + +// Like +// Likes a post +// +// Parameters: +// PostID - String, Number - Post ID - post +// WallID - String, Number - ID of the wall where the post is located - wall +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function LikePost(Val PostID, Val WallID = "", Val Parameters = "") Export + + OPI_TypeConversion.GetLine(PostID); + OPI_TypeConversion.GetLine(WallID); + + Parameters_ = GetStandardParameters(Parameters); + WallID = ?(ValueFilled(WallID), WallID, Parameters_["owner_id"]); + VKObject = "wall" + WallID + "_" + OPI_Tools.NumberToString(PostID); + + Parameters_.Insert("type" , "post"); + Parameters_.Insert("object" , VKObject); + Parameters_.Insert("item_id" , OPI_Tools.NumberToString(PostID)); + Parameters_.Insert("owner_id" , OPI_Tools.NumberToString(WallID)); + Parameters_.Insert("from_group" , 0); + + Response = OPI_Tools.Get("api.vk.com/method/likes.add", Parameters_); + + Return Response; + +EndFunction + +// Make repost +// Reposts the record +// +// Parameters: +// PostID - String, Number - Post ID - post +// WallID - String, Number - ID of the wall where the post is located - from +// Target wall - String, Number - ID of the target wall or group - to +// Advertising - Boolean - Sign of an advertising post - ad +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function MakeRepost(Val PostID + , Val WallID = "" + , Val Target wall = "" + , Val Advertising = False + , Val Parameters = "") Export + + Parameters_ = GetStandardParameters(Parameters); + GroupId = Parameters_["group_id"]; + + OPI_TypeConversion.GetLine(GroupId); + OPI_TypeConversion.GetLine(PostID); + OPI_TypeConversion.GetLine(WallID); + OPI_TypeConversion.GetLine(Target wall); + OPI_TypeConversion.GetBoolean(Advertising); + + Source = ?(ValueFilled(WallID), WallID, GroupId); + Receiver = ?(ValueFilled(Target wall), Target wall, GroupId); + + Parameters_.Insert("object" , "wall" + Source + "_" + OPI_Tools.NumberToString(PostID)); + Parameters_.Insert("group_id" , StringReplace(Receiver, "-", "")); + Parameters_.Insert("mark_as_ads" , ?(Advertising, 1, 0)); + + Response = OPI_Tools.Get("api.vk.com/method/wall.repost", Parameters_); + + Return Response; + +EndFunction + +// Write a message +// Write a message to a user in the community's dialog +// +// Parameters: +// Text - String - Message text - text +// UserID - String - Recipient user ID - user +// Communitytoken - String - Community chat bot token, which can be obtained in the settings - ct +// Keyboard - String - JSON keyboard. See FormKeyboard - keyboard +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function WriteMessage(Val Text + , Val UserID + , Val Communitytoken + , Val Keyboard = "" + , Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Text); + OPI_TypeConversion.GetLine(UserID); + OPI_TypeConversion.GetLine(Communitytoken); + OPI_TypeConversion.GetLine(Keyboard); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("access_token", Communitytoken); + + Parameters_.Insert("user_id" , UserID); + Parameters_.Insert("peer_id" , UserID); + Parameters_.Insert("parse_mode" , "Markdown"); + Parameters_.Insert("random_id" , 0); + Parameters_.Insert("message" , Text); + + If ValueFilled(Keyboard) Then + Parameters_.Insert("keyboard", Keyboard); + EndIf; + + Response = OPI_Tools.Get("api.vk.com/method/messages.send", Parameters_); + + Return Response; + +EndFunction + +// Write a comment +// Creates a comment under the selected record +// +// Parameters: +// PostID - String, Number - ID of the target post - post +// WallID - String, Number - ID of the wall where the post is located - wall +// Text - String - Comment text - text +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function WriteComment(Val PostID, Val WallID, Val Text, Val Parameters = "") Export + + Parameters_ = GetStandardParameters(Parameters); + GroupId = Parameters_["group_id"]; + + OPI_TypeConversion.GetLine(GroupId); + OPI_TypeConversion.GetLine(PostID); + OPI_TypeConversion.GetLine(WallID); + OPI_TypeConversion.GetLine(Text); + + Parameters_.Insert("owner_id" , WallID); + Parameters_.Insert("from_group" , GroupId); + Parameters_.Insert("post_id" , PostID); + Parameters_.Insert("message" , Text); + + Parameters_.Delete("group_id"); + + Response = OPI_Tools.Get("api.vk.com/method/wall.createComment", Parameters_); + + Return Response; + +EndFunction + +// Shorten link +// Creates a shortened URL from a regular one +// +// Parameters: +// URL - String - URL for shortening - url +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// String - Shortened URL +Function ShortenLink(Val URL, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(URL); + + Response = "response"; + Parameters_ = New Structure; + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("url", URL); + + Response = OPI_Tools.Get("https://api.vk.com/method/utils.getShortLink", Parameters_); + Result = Response[Response]; + + If ValueFilled(Result) Then + + URL = Result["short_url"]; + + If ValueFilled(URL) Then + Return URL; + Else + Return Response; + EndIf; + + Else + Return Response; + EndIf; + +EndFunction + +#EndRegion + +#Region Statistics + +// Get statistics +// Gets the overall community statistics for a period +// +// Parameters: +// StartDate - Date - Start date of the period - datefrom +// EndDate - Date - End date of the period - dateto +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function GetStatistics(Val StartDate, Val EndDate, Val Parameters = "") Export + + OPI_TypeConversion.GetDate(StartDate); + OPI_TypeConversion.GetDate(EndDate); + + Parameters_ = GetStandardParameters(Parameters); + + StartDate = OPI_Tools.UNIXTime(StartDate); + EndDate = OPI_Tools.UNIXTime(EndDate); + + Parameters_.Insert("timestamp_from", StartDate); + Parameters_.Insert("timestamp_to" , EndDate); + Parameters_.Insert("stats_groups" , "visitors, reach, activity"); + + Response = OPI_Tools.Get("api.vk.com/method/stats.get", Parameters_); + + Return Response; + +EndFunction + +// Get post statistics +// Gets statistics in terms of posts +// +// Parameters: +// Array of post IDs - Array of String,Number - Array of post IDs - posts +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Array of Arbitrary - Array of post statistics data +Function GetPostStatistics(Val Array of post IDs, Val Parameters = "") Export + + OPI_TypeConversion.GetCollection(Array of post IDs); + + Parameters_ = GetStandardParameters(Parameters); + AnswersArray = New Array; + Array of Sets = New Array; + MaximumPosts = 30; + Response = "response"; + + For Each Post In Array of post IDs Do + + Array of Sets.Add(OPI_Tools.NumberToString(Post)); + + If Array of Sets.Quantity() = MaximumPosts Then + + NumbersString = StrJoin(Array of Sets, ","); + Parameters_.Insert("post_ids", NumbersString); + + Statistics = OPI_Tools.Get("api.vk.com/method/stats.getPostReach", Parameters_); + Array of Statistics = Statistics[Response]; + + For Each StatisticsItem In Array of Statistics Do + AnswersArray.Add(StatisticsItem); + EndDo; + + Array of Sets = New Array; + + EndIf; + + EndDo; + + NumbersString = StrJoin(Array of Sets, ","); + Parameters_.Insert("post_ids", NumbersString); + + Statistics = OPI_Tools.Get("api.vk.com/method/stats.getPostReach", Parameters_); + Array of Statistics = Statistics[Response]; + + If TypeValue(Array of Statistics) = Type("Array") Then + For Each StatisticsItem In Array of Statistics Do + AnswersArray.Add(StatisticsItem); + EndDo; + EndIf; + + Return AnswersArray; + +EndFunction + +#EndRegion + +#Region AdAccountManagement + +// Create advertising campaign +// Creates a campaign in the selected advertising account +// +// Parameters: +// AccountID - String, Number - Advertising account ID - cabinet +// Name - String - Campaign name - title +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateAdvertisingCampaign(Val AccountID, Val Name, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(AccountID); + OPI_TypeConversion.GetLine(Name); + + CurrentDate = OPI_Tools.GetCurrentDate(); + EndDate = AddMonth(CurrentDate, 24); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("account_id", AccountID); + + Array of Structures = New Array; + StartDate = OPI_Tools.UNIXTime(CurrentDate); + EndDate = OPI_Tools.UNIXTime(EndDate); + + CampaignStructure = New Structure; + CampaignStructure.Insert("type" , "promoted_posts"); + CampaignStructure.Insert("name" , Name); + CampaignStructure.Insert("day_limit" , 0); + CampaignStructure.Insert("all_limit" , 0); + CampaignStructure.Insert("start_time" , StartDate); + CampaignStructure.Insert("stop_time" , EndDate); + CampaignStructure.Insert("status" , 1); + + Array of Structures.Add(CampaignStructure); + + JSONDate = OPI_Tools.JSONString(Array of Structures); + + Parameters_.Insert("data", JSONDate); + + Response = OPI_Tools.Get("api.vk.com/method/ads.createCampaigns", Parameters_); + + Return Response; + +EndFunction + +// Create advertising post +// Creates an advertising post based on a post +// +// Parameters: +// CampaignNumber - String, Number - Advertising campaign ID - campaign +// DailyLimit - String, Number - Daily limit in rubles - limit +// CategoryNumber - String, Number - Advertising category number - category +// PostID - String, Number - ID of the post used for advertising - post +// AccountID - String, Number - Advertising account ID - cabinet +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateAd(Val CampaignNumber + , Val DailyLimit + , Val CategoryNumber + , Val PostID + , Val AccountID + , Val Parameters = "") Export + + Parameters_ = GetStandardParameters(Parameters); + GroupId = Parameters_["group_id"]; + + OPI_TypeConversion.GetLine(GroupId); + OPI_TypeConversion.GetLine(CampaignNumber); + OPI_TypeConversion.GetLine(DailyLimit); + OPI_TypeConversion.GetLine(CategoryNumber); + OPI_TypeConversion.GetLine(PostID); + OPI_TypeConversion.GetLine(AccountID); + + Link = "https://vk.com/wall-" + GroupId + "_" + PostID; + + Array of Structures = New Array; + CampaignStructure = New Structure; + CampaignStructure.Insert("campaign_id" , CampaignNumber); + CampaignStructure.Insert("ad_format" , 9); + CampaignStructure.Insert("conversion_event_id" , 1); + CampaignStructure.Insert("autobidding" , 1); + CampaignStructure.Insert("cost_type" , 3); + CampaignStructure.Insert("goal_type" , 2); + CampaignStructure.Insert("ad_platform" , "all"); + CampaignStructure.Insert("publisher_platforms" , "vk"); + CampaignStructure.Insert("publisher_platforms_auto" , "1"); + CampaignStructure.Insert("day_limit" , DailyLimit); + CampaignStructure.Insert("all_limit" , "0"); + CampaignStructure.Insert("category1_id" , CategoryNumber); + CampaignStructure.Insert("age_restriction" , 0); + CampaignStructure.Insert("status" , 1); + CampaignStructure.Insert("name" , "Ad"); + CampaignStructure.Insert("link_url" , Link); + + Array of Structures.Add(CampaignStructure); + + OPI_TypeConversion.GetLine(Array of Structures, True); + + Parameters_.Insert("data" , Array of Structures); + Parameters_.Insert("account_id" , AccountID); + + Response = OPI_Tools.Get("api.vk.com/method/ads.createAds", Parameters_); + + Return Response; + +EndFunction + +// Pause advertising post +// Pauses the display of the advertising post +// +// Parameters: +// AccountID - String, Number - Advertising account ID - cabinet +// AdID - String, Number - Ad ID - adv +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function PauseAdvertisingAd(Val AccountID, Val AdID, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(AccountID); + OPI_TypeConversion.GetLine(AdID); + + Parameters_ = GetStandardParameters(Parameters); + + Parameters_.Insert("account_id", AccountID); + + Array of Structures = New Array; + CampaignStructure = New Structure; + + CampaignStructure.Insert("ad_id" , AdID); + CampaignStructure.Insert("status" , 0); + + Array of Structures.Add(CampaignStructure); + + OPI_TypeConversion.GetLine(Array of Structures, True); + + Parameters_.Insert("data", Array of Structures); + + Response = OPI_Tools.Get("api.vk.com/method/ads.updateAds", Parameters_); + + Return Response; + +EndFunction + +// Get a list of advertising categories +// Gets a list of advertising category IDs for creating an advertising post +// +// Parameters: +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function GetAdvertisingCategoryList(Val Parameters = "") Export + + Parameters_ = GetStandardParameters(Parameters); + Response = OPI_Tools.Get("api.vk.com/method/ads.getCategories", Parameters_); + + Return Response; + +EndFunction + +#EndRegion + +#Region ProductManagement + +// Get a list of product categories +// Gets a list of product category IDs to specify when creating a product +// +// Parameters: +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Compliance From String - Key - ID, Value - Name +Function GetProductCategoryList(Val Parameters = "") Export + + Response = "response"; + Parameters_ = GetStandardParameters(Parameters); + Response = OPI_Tools.Get("api.vk.com/method/market.getCategories", Parameters_); + Result = Response[Response]; + + If ValueFilled(Result) Then + + Quantity = Result["count"]; + + If Not ValueFilled(Quantity) Then + Return Response; + EndIf; + + Else + Return Response; + EndIf; + + Parameters_.Insert("count", Quantity); + Response = OPI_Tools.Get("api.vk.com/method/market.getCategories", Parameters_); + Result = Response[Response]; + + If ValueFilled(Result) Then + + Categories = Result["items"]; + + If Not ValueFilled(Categories) Then + Return Response; + EndIf; + + Else + Return Response; + EndIf; + + CategoryCorrespondence = New Match; + + For Each Category In Categories Do + CategoryCorrespondence.Insert(Category["id"], Category["name"]); + EndDo; + + Return CategoryCorrespondence; + +EndFunction + +// Get product list +// Gets the community's product list +// +// Parameters: +// Selection - String, Number - Selection ID, if filtering is needed - sel +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Array of product matches +Function GetProductList(Val Selection = "", Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Selection); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("count" , 200); + Parameters_.Insert("extended" , 1); + Parameters_.Insert("with_disabled", 1); + + If ValueFilled(Selection) Then + Parameters_.Insert("album_id", Selection); + EndIf; + + Array of products = New Array; + GetProductListRecursively(Array of products, Parameters_); + + Return Array of products; + +EndFunction + +// Get products by ID +// Gets information about products by array of IDs +// +// Parameters: +// Products - String, Array of Strings - Array of product IDs - items +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function GetProductsByID(Val Products, Val Parameters = "") Export + + OPI_TypeConversion.GetCollection(Products); + + Parameters_ = GetStandardParameters(Parameters); + ProductsString = ""; + Owner = "owner_id"; + + For Each Product In Products Do + CurrentProduct = Parameters_[Owner] + "_" + Product; + CurrentProduct = OPI_Tools.NumberToString(CurrentProduct); + ProductsString = ProductsString + CurrentProduct + ","; + EndDo; + + ProductsString = Left(ProductsString, StrLength(ProductsString) - 1); + Parameters_.Insert("item_ids", ProductsString); + Parameters_.Insert("extended", 1); + + Response = OPI_Tools.Get("api.vk.com/method/market.getById", Parameters_); + + Return Response; + +EndFunction + +// Add product +// Adds a new product to the community's catalog +// +// Parameters: +// ProductDescription - Key-Value Pair - See GetProductDescription - product - JSON description of the product or path +// Selection - String - Selection ID for placing the product, if needed - sel +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function AddProduct(Val ProductDescription, Val Selection = "", Val Parameters = "") Export + Return ProductManagement(ProductDescription, , Selection, Parameters); +EndFunction + +// Edit product +// Edits a previously created product +// +// Parameters: +// Product - Number, String - Identifier of the product being edited - item +// ProductDescription - Key-Value Pair - See GetProductDescription - product - JSON description of the product or path +// Selection - String - Identifier of the new selection, if needed - sel +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function EditProduct(Val Product, Val ProductDescription, Val Selection = "", Val Parameters = "") Export + Return ProductManagement(ProductDescription, Product, Selection, Parameters); +EndFunction + +// Delete product +// Deletes a previously created product +// +// Parameters: +// Product - String, Number - Product ID - item +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function DeleteProduct(Val Product, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Product); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("item_id", Product); + + Response = OPI_Tools.Get("api.vk.com/method/market.delete", Parameters_); + + Return Response; + +EndFunction + +// Group products +// Groups products based on similar sets of properties +// +// Parameters: +// Array of products - Array Of String - Array of product IDs - items +// ExistingGroup - String - ID of the existing group, if needed - sellgroup +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function GroupProducts(Val Array of products, Val ExistingGroup = "", Val Parameters = "") Export + + OPI_TypeConversion.GetLine(ExistingGroup); + OPI_TypeConversion.GetCollection(Array of products); + + Parameters_ = GetStandardParameters(Parameters); + Array_of_Products = New Array; + + For Each Product In Array of products Do + Array_of_Products.Add(OPI_Tools.NumberToString(Product)); + EndDo; + + Products = StrJoin(Array_of_Products, ","); + + Parameters_.Insert("item_ids", Products); + + If ValueFilled(ExistingGroup) Then + Parameters_.Insert("item_group_id", ExistingGroup); + EndIf; + + Response = OPI_Tools.Get("api.vk.com/method/market.groupItems", Parameters_); + + Return Response; + +EndFunction + +// Get product description. !NOCLI +// +// Return value: +// Key-Value Pair - Empty product description: +// *Name - String - Product name +// *Description - String - Product description +// *Category - String - See GetProductCategoryList +// *Price - Number - Product price +// *OldPrice - Number - For displaying discount/changing price +// *MainPhoto - String, BinaryData - Binary data or path to photo +// *URL - String - Link to the store's website page +// *AdditionalPhotos - Array Of String - Binary Data or Photo Paths +// *PropertyValues - Array Of String - See AddPropertyVariant +// *MainInGroup - Boolean - Main in the group, if exists in the group +// *Width - Number - Width product in мм. +// *Height - Number - Height product in мм. +// *Depth - Number - Depth product in мм. +// *Weight - Number - Weight in гр. +// *SKU - String - SKU +// *AvailableBalance - Number - Balance. -1 - unlimited +Function GetProductDescription() Export + + Product = New Match(); + Product.Insert("Name" , "New product"); // Product name + Product.Insert("Description" , "Product description"); // Product description + Product.Insert("Category" , "20173"); // See GetProductCategoryList() + Product.Insert("Price" , 1); // Price. + Product.Insert("OldPrice" , Undefined); // For reflection change price + Product.Insert("MainPhoto" , Undefined); // BD or path to main. photo + Product.Insert("URL" , Undefined); // Link to page store + Product.Insert("AdditionalPhotos" , New Array); // Array paths or BD for add. photo + Product.Insert("PropertyValues" , New Array); // Values properties (variants). Maximum 2 + Product.Insert("MainInGroup" , False); // Make main in of its group + Product.Insert("Width" , Undefined); // In millimeters + Product.Insert("Height" , Undefined); // In millimeters + Product.Insert("Depth" , Undefined); // In millimeters + Product.Insert("Weight" , Undefined); // In grams + Product.Insert("SKU" , Undefined); // SKU + Product.Insert("AvailableBalance" , 1); + + Return Product; + +EndFunction + +#EndRegion + +#Region ProductSelectionManagement + +// Get selection list +// Gets the list of product selections +// +// Parameters: +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Array of selection matches +Function GetSelectionList(Val Parameters = "") Export + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("count", 100); + + ArrayOfAlbums = New Array; + GetAlbumListRecursively(ArrayOfAlbums, Parameters_); + + Return ArrayOfAlbums; + +EndFunction + +// Get selections by ID +// Gets the list of selections by array of IDs +// +// Parameters: +// Selections - String, Array of Strings - Selection IDs - sels +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function GetSelectionsByID(Val Selections, Val Parameters = "") Export + + OPI_TypeConversion.GetCollection(Selections); + + Parameters_ = GetStandardParameters(Parameters); + Selections_ = New Array; + SelectionsString = ""; + + For Each Selection In Selections Do + Selections_.Add(OPI_Tools.NumberToString(Selection)); + EndDo; + + SelectionsString = StrJoin(Selections_, ","); + + Parameters_.Insert("album_ids", SelectionsString); + + Response = OPI_Tools.Get("api.vk.com/method/market.getAlbumById", Parameters_); + + Return Response; + +EndFunction + +// Create product selection +// Creates an empty product selection +// +// Parameters: +// Name - String - Selection name - title +// Image - String, BinaryData - Image file - picture +// Main - Boolean - Main - main +// Hidden - Boolean - Hidden - hidden +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateProductCollection(Val Name + , Val Image + , Val Main = False + , Val Hidden = False + , Val Parameters = "") Export + + Return SelectionManagement(Name, Image, , Main, Hidden, Parameters); + +EndFunction + +// Edit product selection +// Edits the properties of a product selection +// +// Parameters: +// Name - String - New selection name - title +// Selection - String - Selection ID - sel +// Image - String, BinaryData - New selection image - picture +// Main - Boolean - Main - main +// Hidden - Boolean - Hidden - hidden +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function EditProductCollection(Val Name + , Val Selection + , Val Image = "" + , Val Main = False + , Val Hidden = False + , Val Parameters = "") Export + + Return SelectionManagement(Name, Image, Selection, Main, Hidden, Parameters); + +EndFunction + +// Add product to selection +// Adds a product to the selection +// +// Parameters: +// Array of products - Array of string, number - Array of products or product - items +// Selection - String - Selection ID - sel +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function AddProductToSelection(Val Array of products, Val Selection, Val Parameters = "") Export + + OPI_TypeConversion.GetCollection(Array of products); + OPI_TypeConversion.GetLine(Selection); + + Parameters_ = GetStandardParameters(Parameters); + Array_of_Products = New Array; + + For Each Product In Array of products Do + Array_of_Products.Add(OPI_Tools.NumberToString(Product)); + EndDo; + + ProductList = StrJoin(Array_of_Products, ","); + + Parameters_.Insert("item_ids" , ProductList); + Parameters_.Insert("album_ids", Selection); + + Response = OPI_Tools.Get("api.vk.com/method/market.addToAlbum", Parameters_); + + Return Response; + +EndFunction + +// Remove product from selection +// Removes a previously added product from the selection +// +// Parameters: +// Product - String - Product ID - item +// Selection - String - Selection ID - sel +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function RemoveProductFromSelection(Val Product, Val Selection, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Product); + OPI_TypeConversion.GetLine(Selection); + + Parameters_ = GetStandardParameters(Parameters); + + Parameters_.Insert("item_id" , Product); + Parameters_.Insert("album_ids", Selection); + + Response = OPI_Tools.Get("api.vk.com/method/market.removeFromAlbum", Parameters_); + + Return Response; + +EndFunction + +// DeleteSelection +// Deletes the selection by ID +// +// Parameters: +// Selection - String - Selection ID - sel +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function DeleteSelection(Val Selection, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Selection); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("album_id", Selection); + + Response = OPI_Tools.Get("api.vk.com/method/market.deleteAlbum", Parameters_); + + Return Response; + +EndFunction + +#EndRegion + +#Region ProductPropertiesManagement + +// Get property list +// Gets the list of properties of group products +// +// Parameters: +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function GetPropertyList(Val Parameters = "") Export + + Response = "response"; + Parameters_ = GetStandardParameters(Parameters); + + Response = OPI_Tools.Get("api.vk.com/method/market.getProperties", Parameters_); + Properties = Response[Response]["items"]; + + Return Properties; + +EndFunction + +// Create product property +// Creates a new property for use in products +// +// Parameters: +// Name - String - Property name - title +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function CreateProductProperty(Val Name, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Name); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("title", Name); + + Response = OPI_Tools.Get("api.vk.com/method/market.addProperty", Parameters_); + + Return Response; + +EndFunction + +// Edit product property +// Edits the existing product property +// +// Parameters: +// Name - String - New name - title +// Property - String, Number - Property ID - prop +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function EditProductProperty(Val Name, Val Property, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetLine(Property); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("title" , Name); + Parameters_.Insert("property_id", Property); + Parameters_.Insert("type" , "text"); + + Response = OPI_Tools.Get("api.vk.com/method/market.editProperty", Parameters_); + + Return Response; + +EndFunction + +// Delete product property +// Deletes the existing product property +// +// Parameters: +// Property - String, Number - Property ID - prop +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function DeleteProductProperty(Val Property, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Property); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("property_id", Property); + + Response = OPI_Tools.Get("api.vk.com/method/market.deleteProperty", Parameters_); + + Return Response; + +EndFunction + +// Add product property variant +// Adds a variant for an existing property +// +// Parameters: +// Value - String - Property value - value +// Property - String, Number - Property ID where the variant is added - prop +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function AddProductPropertyVariant(Val Value, Val Property, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Property); + OPI_TypeConversion.GetLine(Value); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("property_id", Property); + Parameters_.Insert("title" , Value); + + Response = OPI_Tools.Get("api.vk.com/method/market.addPropertyVariant", Parameters_); + + Return Response; + +EndFunction + +// Edit product property variant +// Edits the value of an existing product property variant +// +// Parameters: +// Value - String - New property value - value +// Property - String, Number - Property ID - prop +// Option - String, Number - Variant ID - option +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function EditProductPropertyVariant(Val Value, Val Property, Val Option, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Value); + OPI_TypeConversion.GetLine(Property); + OPI_TypeConversion.GetLine(Option); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("property_id", Property); + Parameters_.Insert("variant_id" , Option); + Parameters_.Insert("title" , Value); + + Response = OPI_Tools.Get("api.vk.com/method/market.editPropertyVariant", Parameters_); + + Return Response; + +EndFunction + +// Delete product property variant +// Deletes the previously created product property variant +// +// Parameters: +// Option - String, Number - Variant ID - option +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function DeleteProductPropertyVariant(Val Option, Val Parameters = "") Export + + OPI_TypeConversion.GetLine(Option); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("variant_id", Option); + + Response = OPI_Tools.Get("api.vk.com/method/market.deletePropertyVariant", Parameters_); + + Return Response; + +EndFunction + +#EndRegion + +#Region OrderManagement + +// Get order list +// Returns the community's order list +// +// Parameters: +// Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json +// +// Return value: +// Key-Value Pair - Serialized JSON response from VK +Function GetOrderList(Val Parameters = "") Export + + Parameters = GetStandardParameters(Parameters); + Parameters.Insert("count", 50); + + ArrayOfOrders = New Array; + GetOrderListRecursively(ArrayOfOrders, Parameters); + + Return ArrayOfOrders; + +EndFunction + +#EndRegion + +#Region Others + +// Create keyboard +// Forms a keyboard from an array of buttons +// +// Parameters: +// ButtonArray - Array of Strings - Array of button titles - buttons +// +// Return value: +// String - Keyboard JSON +Function FormKeyboard(Val ButtonArray) Export + + OPI_TypeConversion.GetCollection(ButtonArray); + + Keyboard = New Structure; + KeyboardArray = New Array; + ArrayBlock = New Array; + + For Each Action In ButtonArray Do + + Button = New Structure; + Expression = New Structure; + + Expression.Insert("type" , "text"); + Expression.Insert("label", Action); + + Button.Insert("action", Expression); + ArrayBlock.Add(Button); + + EndDo; + + KeyboardArray.Add(ArrayBlock); + + Keyboard.Insert("buttons" , KeyboardArray); + Keyboard.Insert("one_time", False); + + Return OPI_Tools.JSONString(Keyboard); + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function GetStandardParameters(Val Parameters = "") + + // Here is a collection of data definitions for working with the VK API + // You can override them by passing them as a parameter + // Matching fields will be overwritten with the parameter of the function + + Parameters_ = New Structure; + + // access_token - можно получить in браузере по URL from фунtoции CreateTokenRetrievalLink() + // from_group - actions will be performed on behalf of the group + // owner_id - group ID with "-" at the beginning. Can be found in the settings of the VK group or in its URL if not set + // set your + // app_id - application ID that needs to be created in the profile on the developer page + // group_id - owner_id, но without "-" + + Parameters_.Insert("access_token" , ""); + Parameters_.Insert("from_group" , "1"); + Parameters_.Insert("owner_id" , ""); + Parameters_.Insert("v" , "5.131"); + Parameters_.Insert("app_id" , ""); + Parameters_.Insert("group_id" , ""); + + OPI_TypeConversion.GetCollection(Parameters); + + If TypeValue(Parameters) = Type("Structure") Or TypeValue(Parameters) = Type("Match") Then + For Each PassedParameter In Parameters Do + Parameters_.Insert(PassedParameter.Key, OPI_Tools.NumberToString(PassedParameter.Value)); + EndDo; + EndIf; + + Return Parameters_; + +EndFunction + +Function GetImageID(Val Image, Val Parameters, Val View) + + Response = "response"; + Response = UploadPhotoToServer(Image, Parameters, View); + Result = Response[Response]; + + If ValueFilled(Result) Then + PhotoID = Result["photo_id"]; + + If Not ValueFilled(PhotoID) Then + Return Response; + EndIf; + + Else + Return Response; + EndIf; + + PhotoID = OPI_Tools.NumberToString(PhotoID); + Return PhotoID; + +EndFunction + +Function GetImageCorrespondence(Val Image, Val Parameters, Val View) + + Response = UploadPhotoToServer(Image, Parameters, View); + ResponseArray = Response.Get("response"); + + If Not ValueFilled(ResponseArray) Or Not TypeValue(ResponseArray) = Type("Array") Then + Return Response; + Else + If ResponseArray.Quantity() = 0 Then + Return Response; + Else + ResponseCorrespondence = ResponseArray[0]; + EndIf; + EndIf; + + Return ResponseCorrespondence; + +EndFunction + +Function GetSelectionArray(Val Selections, Val Parameters = "") + + Response = "response"; + Selections = GetSelectionsByID(Selections, Parameters); + Result = Selections[Response]; + + If ValueFilled(Result) Then + + SelectionArray = Result["items"]; + + If Not ValueFilled(SelectionArray) Then + Return Selections; + EndIf; + + Else + Return Selections; + EndIf; + + Return SelectionArray; + +EndFunction + +Function DetermineImageUploadMethod(Val View) + + MethodCorrespondence = New Match; + Upload = "Upload"; + Save = "Save"; + Method = "Method"; + Photo = "Photo"; + + If View = "Post" Then + + MethodCorrespondence.Insert(Upload , "photos.getWallUploadServer"); + MethodCorrespondence.Insert(Save, "photos.saveWallPhoto"); + MethodCorrespondence.Insert(Photo , "photo"); + MethodCorrespondence.Insert(Method , 1); + + ElsIf View = "Product" Then + + MethodCorrespondence.Insert(Upload , "market.getProductPhotoUploadServer"); + MethodCorrespondence.Insert(Save, "market.saveProductPhoto"); + MethodCorrespondence.Insert(Method , 2); + + ElsIf View = "Story" Then + + MethodCorrespondence.Insert(Upload , "stories.getPhotoUploadServer"); + MethodCorrespondence.Insert(Save, "stories.save"); + MethodCorrespondence.Insert(Method , 3); + + ElsIf View = "Poll" Then + + MethodCorrespondence.Insert(Upload , "polls.getPhotoUploadServer"); + MethodCorrespondence.Insert(Save, "polls.savePhoto"); + MethodCorrespondence.Insert(Photo , "photo"); + MethodCorrespondence.Insert(Method , 1); + + Else + + MethodCorrespondence.Insert(Upload , "photos.getUploadServer"); + MethodCorrespondence.Insert(Save, "photos.save"); + MethodCorrespondence.Insert(Photo , "photos_list"); + MethodCorrespondence.Insert(Method , 1); + + EndIf; + + Return MethodCorrespondence; + +EndFunction + +Function GetProductParameterMapping() + + Fields = New Match(); + Fields.Insert("Name" , "name"); + Fields.Insert("Description" , "description"); + Fields.Insert("Category" , "category_id"); + Fields.Insert("Price" , "price"); + Fields.Insert("OldPrice" , "old_price"); + Fields.Insert("URL" , "url"); + Fields.Insert("MainInGroup" , "is_main_variant"); + Fields.Insert("Width" , "dimension_width"); + Fields.Insert("Height" , "dimension_height"); + Fields.Insert("Depth" , "dimension_length"); + Fields.Insert("Weight" , "weight"); + Fields.Insert("SKU" , "sku"); + Fields.Insert("AvailableBalance" , "stock_amount"); + + Return Fields; + +EndFunction + +Function ProductManagement(Val ProductDescription, Val ProductID = "", Val Selection = "", Val Parameters = "") + + OPI_TypeConversion.GetLine(ProductID); + OPI_TypeConversion.GetLine(Selection); + OPI_TypeConversion.GetCollection(ProductDescription); + + Parameters_ = GetStandardParameters(Parameters); + Parameters_.Insert("v", "5.199"); + + Response = "response"; + + FillProductRequestFields(ProductDescription, Parameters_); + + If ValueFilled(ProductID) Then + Parameters_.Insert("item_id", ProductID); + Method = "edit"; + Else + Method = "add"; + EndIf; + + Response = OPI_Tools.Get("api.vk.com/method/market." + Method, Parameters_); + Result = Response[Response]; + + If Not ValueFilled(ProductID) And ValueFilled(Result) Then + + ProductID = Result["market_item_id"]; + + If Not ValueFilled(ProductID) Then + Return Response; + EndIf; + + Else + Return Response; + EndIf; + + If ValueFilled(Selection) And ValueFilled(ProductID) Then + AddProductToSelection(ProductID, Selection, Parameters_); + EndIf; + + Return Response; + +EndFunction + +Function SelectionManagement(Val Name + , Val Image = "" + , Val SelectionID = "" + , Val Main = False + , Val Hidden = False + , Val Parameters = "") + + OPI_TypeConversion.GetLine(Name); + OPI_TypeConversion.GetLine(SelectionID); + OPI_TypeConversion.GetBoolean(Main); + OPI_TypeConversion.GetBoolean(Hidden); + + Parameters_ = GetStandardParameters(Parameters); + Response = AddImageParameter(Image, SelectionID, Parameters_); + + If ValueFilled(Response) Then + Return Response; + EndIf; + + Parameters_.Insert("title" , Name); + Parameters_.Insert("main_album" , ?(Main, 1, 0)); + Parameters_.Insert("is_hidden" , ?(Hidden, 1, 0)); + + If ValueFilled(SelectionID) Then + Parameters_.Insert("album_id", SelectionID); + Method = "editAlbum"; + Else + Method = "addAlbum"; + EndIf; + + Response = OPI_Tools.Get("api.vk.com/method/market." + Method, Parameters_); + + Return Response; + +EndFunction + +Function AddImageParameter(Val Image, Val SelectionID, Parameters) + + PhotoID = "photo_id"; + + If ValueFilled(Image) Then + + PhotoID = GetImageID(Image, Parameters, "Product"); + + If Not TypeValue(PhotoID) = Type("String") Then + Return PhotoID; + EndIf; + + Parameters.Insert(PhotoID, PhotoID); + + Else + + If ValueFilled(SelectionID) Then + + Selections = GetSelectionArray(SelectionID, Parameters); + + If Not TypeValue(Selections) = Type("Array") Then + Return Selections; + EndIf; + + If Not Selections.Quantity() = 0 Then + PhotoID = Selections[0]["photo"]["id"]; + OPI_TypeConversion.GetLine(PhotoID); + Parameters.Insert(PhotoID, PhotoID); + EndIf; + + EndIf; + + EndIf; + + Return ""; + +EndFunction + +Procedure FillPhotoUploadParameters(Val Method, Val Response, Parameters) + + Response = "response"; + Method = Method["Method"]; + StandardMethod = 1; + NewMethod = 2; + + If Method = StandardMethod Then + + Hash = "hash"; + Serv = "server"; + Aid = "aid"; + Photo = Method["Photo"]; + + Parameters.Insert(Hash, Response[Hash]); + Parameters.Insert(Photo, Response[Photo]); + + PhotoServer = Response.Get(Serv); + + If ValueFilled(PhotoServer) Then + PhotoServer = OPI_Tools.NumberToString(PhotoServer); + Parameters.Insert(Serv, PhotoServer); + EndIf; + + Identifier = Response.Get(Aid); + + If ValueFilled(Identifier) Then + Identifier = OPI_Tools.NumberToString(Identifier); + Parameters.Insert(Aid , Identifier); + EndIf; + + ElsIf Method = NewMethod Then + + ResponseString = OPI_Tools.JSONString(Response); + Parameters.Insert("upload_response", ResponseString); + + Else + + Parameters.Insert("upload_results", Response[Response]["upload_result"]); + + EndIf; + +EndProcedure + +Procedure FillProductRequestFields(Val ProductDescription, Parameters) + + Response = "response"; + MainPhoto = ProductDescription["MainPhoto"]; + AdditionalPhoto = ProductDescription["AdditionalPhotos"]; + Properties = ProductDescription["PropertyValues"]; + + If ValueFilled(MainPhoto) Then + + Response = UploadPhotoToServer(MainPhoto, Parameters, "Product"); + Result = Response[Response]; + + If ValueFilled(Result) Then + PhotoID = Result["photo_id"]; + + If Not ValueFilled(PhotoID) Then + Return; + EndIf; + + Else + Return; + EndIf; + + PhotoID = OPI_Tools.NumberToString(PhotoID); + Parameters.Insert("main_photo_id", PhotoID); + + EndIf; + + If TypeValue(Properties) = Type("Array") Then + + Properties_ = New Array; + + For Each Property In Properties Do + Properties_.Add(OPI_Tools.NumberToString(Property)); + EndDo; + + Properties = StrJoin(Properties_, ","); + + EndIf; + + If ValueFilled(Properties) Then + Parameters.Insert("variant_ids", OPI_Tools.NumberToString(Properties)); + EndIf; + + AddAdditionalProductPhotos(AdditionalPhoto, Parameters); + + For Each Field In GetProductParameterMapping() Do + + Value = ProductDescription[Field.Key]; + + If Value <> Undefined Then + Parameters.Insert(Field.Value, ProductDescription[Field.Key]); + EndIf; + + EndDo; + +EndProcedure + +Procedure AddAdditionalProductPhotos(Val PhotoArray, Parameters) + + If TypeValue(PhotoArray) = Type("Array") Then + If PhotoArray.Quantity() > 0 Then + + PhotoString = ""; + + For Each Photo In PhotoArray Do + + PhotoID = GetImageID(Photo, Parameters, "Product"); + + If Not TypeValue(PhotoID) = Type("String") Then + Return; + EndIf; + + PhotoString = PhotoString + PhotoID + ","; + + EndDo; + + PhotoString = Left(PhotoString, StrLength(PhotoString) - 1); + Parameters.Insert("photo_ids", PhotoString); + EndIf; + EndIf; + +EndProcedure + +Procedure GetProductListRecursively(Array of products, Parameters, Shift = 0) + + Response = "response"; + MaxInRequest = 200; + Response = OPI_Tools.Get("api.vk.com/method/market.get", Parameters); + Products = Response[Response]["items"]; + + If Products.Quantity() = 0 Then + Return; + EndIf; + + For Each Product In Products Do + Array of products.Add(Product); + EndDo; + + Shift = Shift + MaxInRequest; + Parameters.Insert("offset", Shift); + GetProductListRecursively(Array of products, Parameters, Shift); + +EndProcedure + +Procedure GetAlbumListRecursively(ArrayOfAlbums, Parameters, Shift = 0) + + Response = "response"; + MaxInRequest = 100; + Response = OPI_Tools.Get("api.vk.com/method/market.getAlbums", Parameters); + Albums = Response[Response]["items"]; + + If Albums.Quantity() = 0 Then + Return; + EndIf; + + For Each Album In Albums Do + ArrayOfAlbums.Add(Album); + EndDo; + + Shift = Shift + MaxInRequest; + Parameters.Insert("offset", Shift); + GetAlbumListRecursively(ArrayOfAlbums, Parameters, Shift); + +EndProcedure + +Procedure GetOrderListRecursively(ArrayOfOrders, Parameters, Shift = 0) + + Response = "response"; + MaxInRequest = 50; + Response = OPI_Tools.Get("api.vk.com/method/market.getGroupOrders", Parameters); + Orders = Response[Response]["items"]; + + If Orders.Quantity() = 0 Then + Return; + EndIf; + + For Each Order In Orders Do + ArrayOfOrders.Add(Order); + EndDo; + + Shift = Shift + MaxInRequest; + Parameters.Insert("offset", Shift); + GetOrderListRecursively(ArrayOfOrders, Parameters, Shift); + +EndProcedure + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo b/service/interim/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo new file mode 100644 index 0000000000..c7eca11ad8 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1ab0a76a-246d-4037-97c3-212d680aa589"> + <name>OPI_VK</name> + <synonym> + <key>ru</key> + <value>Methodы интеграции with VK (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Viber/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Viber/Module.bsl new file mode 100644 index 0000000000..2bcd2a9418 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Viber/Module.bsl @@ -0,0 +1,414 @@ +// Location OS: ./OInt/core/Modules/OPI_Viber.os +// Library: Viber +// CLI Command: 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 + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region SettingsAndInformation + +// Set Webhook +// InАЖNО: Уwithтаноintoа Webhook обязательto по праinилам Viber. For thisго todо иметь withinобоdный URL, +// which will return 200 and a genuine SSL certificate. If there is a certificate and the database is published +// on the server - you can use an HTTP service. Information about new messages will also be sent there +// Viber periodically knocks on the Webhook address, so if it is inactive, everything will stop working +// +// Parameters: +// Token - String - Viber Token - token +// URL - String - URL for setting up Webhook - url +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function SetWebhook(Val Token, Val URL) Export + + Parameters = New Structure; + OPI_Tools.AddField("url" , URL , "String", Parameters); + OPI_Tools.AddField("auth_token" , Token, "String", Parameters); + + Return OPI_Tools.Post("https://chatapi.viber.com/pa/set_webhook", Parameters); + +EndFunction + +// Get channel information +// Here you can get the channel's user IDs. Bot IDs need to be obtained from the Webhook arrivals +// The user ID from channel information is not suitable for sending messages through the bot - they are different +// +// Parameters: +// Token - String - Token - token +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function GetChannelInformation(Val Token) Export + + URL = "https://chatapi.viber.com/pa/get_account_info"; + Return OPI_Tools.Get(URL, , TokenInHeaders(Token)); + +EndFunction + +// Get user data +// Gets user information by ID +// +// Parameters: +// Token - String - Token - token +// UserID - String, Number - Viber User ID - user +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function GetUserData(Val Token, Val UserID) Export + + URL = "https://chatapi.viber.com/pa/get_user_details"; + + Parameters = New Structure; + OPI_Tools.AddField("id", UserID, "String", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, TokenInHeaders(Token)); + + Return Response; + +EndFunction + +// Get online users +// Gets the status of a user or several users by ID +// +// Parameters: +// Token - String - Viber Token - token +// UserIDs - String,Number,Array of String,Number - Viber User(s) ID - users +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function GetOnlineUsers(Val Token, Val UserIDs) Export + + URL = "https://chatapi.viber.com/pa/get_online"; + + Parameters = New Structure; + OPI_Tools.AddField("ids", UserIDs, "Collection", Parameters); + + Response = OPI_Tools.Post(URL, Parameters, TokenInHeaders(Token)); + + Return Response; + +EndFunction + +#EndRegion + +#Region MessageSending + +// Send text message +// Sends a text message to a chat or channel +// +// Parameters: +// Token - String - Token - token +// Text - String - Message text - text +// UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user +// SendingToChannel - Boolean - Sending to channel or bot chat - ischannel +// Keyboard - Structure Of String - See CreateKeyboardFromArrayButton - keyboard +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function SendTextMessage(Val Token + , Val Text + , Val UserID + , Val SendingToChannel + , Val Keyboard = "") Export + + Return SendMessage(Token, "text", UserID, SendingToChannel, , Text, Keyboard); + +EndFunction + +// Send image +// Sends an image to a chat or channel +// +// Parameters: +// Token - String - Token - token +// URL - String - Image URL - picture +// UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user +// SendingToChannel - boolean - Sending to channel or bot chat - ischannel +// Description - String - Image annotation - description +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function SendImage(Val Token, Val URL, Val UserID, Val SendingToChannel, Val Description = "") Export + + Return SendMessage(Token, "picture", UserID, SendingToChannel, URL, Description); + +EndFunction + +// SendFile +// Sends a file (document) to a chat or channel +// +// Parameters: +// Token - String - Token - token +// URL - String - File URL - file +// UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user +// SendingToChannel - Boolean - Sending to channel or bot chat - ischannel +// Extension - String - File extension - ext +// Size - Number - File size. If not filled in > determined automatically by downloading the file - size +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function SendFile(Val Token + , Val URL + , Val UserID + , Val SendingToChannel + , Val Extension + , Val Size = "") Export + + If Not ValueFilled(Size) Then + + Response = OPI_Tools.Get(URL); + Size = Response.Size(); + + EndIf; + + String_ = "String"; + Extension = StringReplace(Extension, ".", ""); + + Parameters = New Structure; + OPI_Tools.AddField("URL" , URL , String_, Parameters); + OPI_Tools.AddField("Size" , Size , String_, Parameters); + OPI_Tools.AddField("Extension", Extension, String_, Parameters); + + Return SendMessage(Token, "file", UserID, SendingToChannel, Parameters); + +EndFunction + +// Send contact +// Sends a contact with a phone number to a chat or channel +// +// Parameters: +// Token - String - Token - token +// ContactName - String - Contact name - name +// PhoneNumber - String - Phone number - phone +// UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user +// SendingToChannel - Boolean - Sending to channel or bot chat - ischannel +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function SendContact(Val Token + , Val ContactName + , Val PhoneNumber + , Val UserID + , Val SendingToChannel) Export + + Parameters = New Structure; + OPI_Tools.AddField("name" , ContactName , "String", Parameters); + OPI_Tools.AddField("phone_number", PhoneNumber, "String", Parameters); + + Return SendMessage(Token, "contact", UserID, SendingToChannel, Parameters); + +EndFunction + +// SendLocation +// Sends geographic coordinates to a chat or channel +// +// Parameters: +// Token - String - Token - token +// Latitude - String, Number - Geographic latitude - lat +// Longitude - String, Number - Geographic longitude - long +// UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user +// SendingToChannel - Boolean - Sending to channel or bot chat - ischannel +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function SendLocation(Val Token, Val Latitude, Val Longitude, Val UserID, Val SendingToChannel) Export + + Parameters = New Structure; + OPI_Tools.AddField("lat", Latitude , "String", Parameters); + OPI_Tools.AddField("lon", Longitude, "String", Parameters); + + Return SendMessage(Token, "location", UserID, SendingToChannel, Parameters); + +EndFunction + +// SendLink +// Sends a URL with a preview to a chat or channel +// +// Parameters: +// Token - String - Token - token +// URL - String - SentLink - url +// UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user +// SendingToChannel - Boolean - Sending to channel or bot chat - ischannel +// +// Return value: +// Key-Value Pair - serialized JSON response from Viber +Function SendLink(Val Token, Val URL, Val UserID, Val SendingToChannel) Export + + Return SendMessage(Token, "url", UserID, SendingToChannel, URL); + +EndFunction + +// Create a keyboard from an array of buttons +// Returns a keyboard structure for messages +// +// Parameters: +// ButtonArray - Array of Strings - Array of buttons - buttons +// ButtonColor - String - HEX color of buttons with # at the beginning - color +// +// Return value: +// Structure - Create a keyboard from an array of buttons: +// * Buttons - Array of Structure - Array of formed buttons +// * Type - String - KeyboardType +Function CreateKeyboardFromArrayButton(Val ButtonArray, Val ButtonColor = "#2db9b9") Export + + OPI_TypeConversion.GetLine(ButtonColor); + OPI_TypeConversion.GetCollection(ButtonArray); + + ArrayOfButtonStructures = New Array; + KeyboardStructure = New Structure; + + For Each ButtonText In ButtonArray Do + + ButtonStructure = New Structure; + ButtonStructure.Insert("ActionType", "reply"); + ButtonStructure.Insert("ActionBody", ButtonText); + ButtonStructure.Insert("Text" , ButtonText); + ButtonStructure.Insert("BgColor" , ButtonColor); + ButtonStructure.Insert("Coloumns" , 3); + + ArrayOfButtonStructures.Add(ButtonStructure); + + EndDo; + + KeyboardStructure.Insert("Buttons", ArrayOfButtonStructures); + KeyboardStructure.Insert("Type" , "keyboard"); + + Return KeyboardStructure; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +// Send message. +// +// Parameters: +// Token - String - Token +// Type - String - TypeOfSentMessage +// UserID - String, Number - Viber User ID +// IsChannel - Boolean - Sending to channel or bot chat +// Value - String, Structure - Value: +// * URL - String - When sending URL +// * Size - Number, String - File size in case of sending +// * Extension - String - File extension in case of sending +// Text - String - Message text +// Keyboard - Structure Of String - Keyboard, if needed, see CreateKeyboardFromArrayButton +// +// Return value: +// Arbitrary, HTTP Response - Send message +Function SendMessage(Val Token + , Val Type + , Val UserID + , Val IsChannel + , Val Value = "" + , Val Text = "" + , Val Keyboard = "") + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Type); + OPI_TypeConversion.GetLine(UserID); + OPI_TypeConversion.GetLine(Text); + OPI_TypeConversion.GetBoolean(IsChannel); + OPI_TypeConversion.GetCollection(Keyboard); + + ParametersStructure = ReturnStandardParameters(); + ParametersStructure.Insert("type", Type); + + If (Type = "text" Or Type = "picture") And ValueFilled(Text) Then + ParametersStructure.Insert("text", Text); + EndIf; + + If TypeValue(Keyboard) = Type("Structure") Then + ParametersStructure.Insert("keyboard", Keyboard); + EndIf; + + If ValueFilled(Value) Then + + If Type = "file" Then + ParametersStructure.Insert("media" , Value["URL"]); + ParametersStructure.Insert("size" , Value["Size"]); + ParametersStructure.Insert("file_name", "File." + Value["Extension"]); + ElsIf Type = "contact" Then + ParametersStructure.Insert("contact" , Value); + ElsIf Type = "location" Then + ParametersStructure.Insert("location" , Value); + Else + ParametersStructure.Insert("media" , Value); + EndIf; + + EndIf; + + If IsChannel Then + ParametersStructure.Insert("from", UserID); + URL = "https://chatapi.viber.com/pa/post"; + Else + ParametersStructure.Insert("receiver", UserID); + URL = "https://chatapi.viber.com/pa/send_message"; + EndIf; + + Response = OPI_Tools.Post(URL, ParametersStructure, TokenInHeaders(Token)); + + Try + Return OPI_Tools.JsonToStructure(Response.GetBodyAsBinaryData()); + Except + Return Response; + EndTry; + +EndFunction + +Function ReturnStandardParameters() + + SenderStructure = New Structure; + SenderStructure.Insert("name" , "Bot"); + SenderStructure.Insert("avatar", ""); + + ParametersStructure = New Structure; + ParametersStructure.Insert("sender", SenderStructure); + ParametersStructure.Insert("min_api_version", 1); + + Return ParametersStructure; + +EndFunction + +Function TokenInHeaders(Val Token) + + OPI_TypeConversion.GetLine(Token); + + HeadersStructure = New Match; + HeadersStructure.Insert("X-Viber-Auth-Token", Token); + Return HeadersStructure; + +EndFunction + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo new file mode 100644 index 0000000000..ec0d881730 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ece78a60-71c0-4443-a6e4-63dd8a7b10d0"> + <name>OPI_Viber</name> + <synonym> + <key>ru</key> + <value>Methodы интеграции with Viber (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl new file mode 100644 index 0000000000..a22b6dc525 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl @@ -0,0 +1,635 @@ +// OS Location: ./OInt/core/Modules/OPI_YandexDisk.os +// Library: Yandex Disk +// CLI command: yadisk + +// 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:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +//@skip-check method-too-many-params + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +#Region FileAndFolderManagement + +// Get disk information +// Gets information about the current disk +// +// Parameters: +// Token - String - Token - token +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetDiskInformation(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + Headers = AuthorizationHeader(Token); + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk", , Headers); + + Return Response; + +EndFunction + +// Create folder +// Creates a directory on the disk +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the created folder - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function CreateFolder(Val Token, Val Path) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Path); + + Headers = AuthorizationHeader(Token); + URL = "https://cloud-api.yandex.net/v1/disk/resources"; + Href = "href"; + + Parameters = New Structure; + Parameters.Insert("path", Path); + + Parameters = OPI_Tools.RequestParametersToString(Parameters); + Response = OPI_Tools.Put(URL + Parameters, , Headers, False); + + ResponseURL = Response[Href]; + + If Not ValueFilled(ResponseURL) Then + Return Response; + EndIf; + + Response = OPI_Tools.Get(ResponseURL, , Headers); + + Return Response; + +EndFunction + +// Get object +// Gets information about a disk object at the specified path +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to folder or file - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetObject(Val Token, Val Path) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Path); + + Headers = AuthorizationHeader(Token); + Parameters = New Structure; + Parameters.Insert("path", Path); + + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources", Parameters, Headers); + + Return Response; + +EndFunction + +// Delete object +// Deletes an object at the specified path +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the folder or file to be deleted - path +// ToCart - Boolean - To cart - can +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function DeleteObject(Val Token, Val Path, Val ToCart = True) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Path); + OPI_TypeConversion.GetBoolean(ToCart); + + Headers = AuthorizationHeader(Token); + + Parameters = New Structure; + Parameters.Insert("path" , Path); + Parameters.Insert("permanently", Not ToCart); + + Response = OPI_Tools.Delete("https://cloud-api.yandex.net/v1/disk/resources", Parameters, Headers); + + Return Response; + +EndFunction + +// Create object copy +// Creates a copy of the object at the specified path and path to the original +// +// Parameters: +// Token - String - Token - token +// Original - String - Path to the original file or directory - from +// Path - String - Destination path for the copy - to +// Overwrite - Boolean - Overwrite if a file with the same name already exists - rewrite +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function CreateObjectCopy(Val Token, Val Original, Val Path, Val Overwrite = False) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Original); + OPI_TypeConversion.GetLine(Path); + OPI_TypeConversion.GetBoolean(Overwrite); + + Headers = AuthorizationHeader(Token); + URL = "https://cloud-api.yandex.net/v1/disk/resources/copy"; + Href = "href"; + + Parameters = New Structure; + Parameters.Insert("from" , Original); + Parameters.Insert("path" , Path); + Parameters.Insert("overwrite" , Overwrite); + + Parameters = OPI_Tools.RequestParametersToString(Parameters); + Response = OPI_Tools.Post(URL + Parameters, , Headers, False); + + ResponseURL = Response[Href]; + + If Not ValueFilled(ResponseURL) Then + Return Response; + EndIf; + + Response = OPI_Tools.Get(ResponseURL, , Headers); + + Return Response; + +EndFunction + +// Get download link +// Gets a download link for the file +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the file for downloading - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetDownloadLink(Val Token, Val Path) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Path); + + Headers = AuthorizationHeader(Token); + + Parameters = New Structure; + Parameters.Insert("path", Path); + + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Parameters, Headers); + + Return Response; + +EndFunction + +// Download file +// Downloads a file at the specified path +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the file for downloading - path +// SavePath - String - File save path - out +// +// Return value: +// BinaryData,String - Binary data or file path when SavePath parameter is specified +Function DownloadFile(Val Token, Val Path, Val SavePath = "") Export + + OPI_TypeConversion.GetLine(SavePath); + Response = GetDownloadLink(Token, Path); + URL = Response["href"]; + + If Not ValueFilled(URL) Then + Return Response; + EndIf; + + Response = OPI_Tools.Get(URL, , , SavePath); + + Return Response; + +EndFunction + +// Get list of files +// Gets a list of files with or without filtering by type +// List available typeоin: audio, backup, book, compressed, data, development, +// diskimage, document, encoded, executable, flash, font, +// mage, settings, spreadsheet, text, unknown, video, web +// +// Parameters: +// Token - String - Token - token +// Quantity - Number, String - Number of returned objects - amount +// OffsetFromStart - Number - Offset for getting objects not from the beginning of the list - offset +// FilterByType - String - Filter by file type - type +// SortByDate - Boolean - True > sort by date, False > alphabetically - datesort +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetFilesList(Val Token + , Val Quantity = 0 + , Val OffsetFromStart = 0 + , Val FilterByType = "" + , Val SortByDate = False) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Quantity); + OPI_TypeConversion.GetLine(OffsetFromStart); + OPI_TypeConversion.GetLine(FilterByType); + OPI_TypeConversion.GetBoolean(SortByDate); + + Headers = AuthorizationHeader(Token); + + Parameters = New Structure; + + If ValueFilled(Quantity) Then + Parameters.Insert("limit", OPI_Tools.NumberToString(Quantity)); + EndIf; + + If ValueFilled(OffsetFromStart) Then + Parameters.Insert("offset", OPI_Tools.NumberToString(OffsetFromStart)); + EndIf; + + If ValueFilled(FilterByType) Then + Parameters.Insert("media_type", FilterByType); + EndIf; + + If SortByDate Then + Destination = "last-uploaded"; + Else + Destination = "files"; + EndIf; + + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Destination, Parameters, Headers); + + Return Response; + +EndFunction + +// Move object +// Moves the object to the specified path and path to the original +// +// Parameters: +// Token - String - Token - token +// Original - String - Path to the original file or folder - from +// Path - String - Destination path for moving - to +// Overwrite - Boolean - Overwrite if a file with the same name already exists - rewrite +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function MoveObject(Val Token, Val Original, Val Path, Val Overwrite = False) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Original); + OPI_TypeConversion.GetLine(Path); + OPI_TypeConversion.GetBoolean(Overwrite); + + Headers = AuthorizationHeader(Token); + URL = "https://cloud-api.yandex.net/v1/disk/resources/move"; + Href = "href"; + + Parameters = New Structure; + Parameters.Insert("from" , Original); + Parameters.Insert("path" , Path); + Parameters.Insert("overwrite" , Overwrite); + + Parameters = OPI_Tools.RequestParametersToString(Parameters); + Response = OPI_Tools.Post(URL + Parameters, , Headers, False); + ResponseURL = Response[Href]; + + If Not ValueFilled(ResponseURL) Then + Return Response; + EndIf; + + Response = OPI_Tools.Get(ResponseURL, , Headers); + + Return Response; + +EndFunction + +// Upload file +// Uploads a file to disk at the specified path +// +// Parameters: +// Token - String - Token - token +// Path - String - Path for saving the file to disk - path +// File - String, BinaryData - File for upload - file +// Overwrite - Boolean - Overwrite if a file with the same name already exists - rewrite +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function UploadFile(Val Token, Val Path, Val File, Val Overwrite = False) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Path); + OPI_TypeConversion.GetBoolean(Overwrite); + OPI_TypeConversion.GetBinaryData(File); + + Headers = AuthorizationHeader(Token); + Href = "href"; + File = New Structure("file", File); + + Parameters = New Structure; + Parameters.Insert("path" , Path); + Parameters.Insert("overwrite" , Overwrite); + + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Parameters, Headers); + URL = Response[Href]; + + If Not ValueFilled(URL) Then + Return Response; + EndIf; + + Response = OPI_Tools.PutMultipart(URL, New Structure(), File, "multipart", Headers); + + Return Response; + +EndFunction + +// Upload file by URL +// Downloads a file to disk from the specified URL +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to place the downloaded file - path +// Address - String - File URL - url +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function UploadFileByURL(Val Token, Val Path, Val Address) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Path); + OPI_TypeConversion.GetLine(Address); + + Headers = AuthorizationHeader(Token); + URL = "https://cloud-api.yandex.net/v1/disk/resources/upload"; + + Parameters = New Structure; + Parameters.Insert("url" , EncodeString(Address, StringEncodingMethod.URLInURLEncoding)); + Parameters.Insert("path", Path); + + Parameters = OPI_Tools.RequestParametersToString(Parameters); + Response = OPI_Tools.Post(URL + Parameters, , Headers, False); + + Return Response; + +EndFunction + +#EndRegion + +#Region ManagePublicAccess + +// Publish object +// Publishes the disk object for public access +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the object to be published - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function PublishObject(Val Token, Val Path) Export + Return TogglePublicAccess(Token, Path, True); +EndFunction + +// Unpublish object +// Unpublishes a previously published object +// +// Parameters: +// Token - String - Token - token +// Path - String - Path to the previously published object - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function CancelObjectPublication(Val Token, Val Path) Export + Return TogglePublicAccess(Token, Path, False); +EndFunction + +// Get published list объеtoтоin. +// Gets a list of published objects +// +// Parameters: +// Token - String - Token - token +// Quantity - Number - Number of returned objects - amount +// OffsetFromStart - Number - Offset for getting objects not from the beginning of the list - offset +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetPublishedObjectsList(Val Token, Val Quantity = 0, Val OffsetFromStart = 0) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Quantity); + OPI_TypeConversion.GetLine(OffsetFromStart); + + Headers = AuthorizationHeader(Token); + + Parameters = New Structure; + + If ValueFilled(Quantity) Then + Parameters.Insert("limit", Quantity); + EndIf; + + If ValueFilled(OffsetFromStart) Then + Parameters.Insert("offset", OffsetFromStart); + EndIf; + + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Parameters, Headers); + + Return Response; + +EndFunction + +// Get public object +// Gets information about the published object by its URL +// +// Parameters: +// Token - String - Token - token +// URL - String - Object address - url +// Quantity - Number - Quantity inозinращаемых inложенных объеtoтоin (for directory) - amount +// OffsetFromStart - Number - Offset for getting nested objects not from the beginning of the list - offset +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetPublicObject(Val Token, Val URL, Val Quantity = 0, Val OffsetFromStart = 0) Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(URL); + OPI_TypeConversion.GetLine(Quantity); + OPI_TypeConversion.GetLine(OffsetFromStart); + + Headers = AuthorizationHeader(Token); + + Parameters = New Structure; + + If ValueFilled(Quantity) Then + Parameters.Insert("limit", OPI_Tools.NumberToString(Quantity)); + EndIf; + + If ValueFilled(OffsetFromStart) Then + Parameters.Insert("offset", OPI_Tools.NumberToString(OffsetFromStart)); + EndIf; + + Parameters.Insert("public_key", URL); + + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Parameters, Headers); + + Return Response; + +EndFunction + +// Get download link for public object +// Gets a direct link to download the public object +// +// Parameters: +// Token - String - Token - token +// URL - String - Object address - url +// Path - String - Path inside the object - path +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetDownloadLinkForPublicObject(Val Token, Val URL, Val Path = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(URL); + OPI_TypeConversion.GetLine(Path); + + Headers = AuthorizationHeader(Token); + + Parameters = New Structure; + + If ValueFilled(Path) Then + Parameters.Insert("path", Path); + EndIf; + + Parameters.Insert("public_key", URL); + + Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Parameters, Headers); + + Return Response; + +EndFunction + +// Save public object to disk +// Saves the public object to your disk +// +// Parameters: +// Token - String - Token - token +// URL - String - Object address - url +// From - String - Path inнутри публичного directory (тольtoо for папоto) - from +// To - String - File save path - to +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function SavePublicObjectToDisk(Val Token, Val URL, From = "", To = "") Export + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(URL); + OPI_TypeConversion.GetLine(From); + OPI_TypeConversion.GetLine(To); + + Headers = AuthorizationHeader(Token); + Address = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk"; + Href = "href"; + + Parameters = New Structure; + Parameters.Insert("public_key", URL); + + If ValueFilled(From) Then + Parameters.Insert("path", From); + EndIf; + + If ValueFilled(To) Then + Parameters.Insert("save_path", To); + EndIf; + + Parameters = OPI_Tools.RequestParametersToString(Parameters); + Response = OPI_Tools.Post(Address + Parameters, , Headers, False); + + ResponseURL = Response[Href]; + + If Not ValueFilled(ResponseURL) Then + Return Response; + EndIf; + + Response = OPI_Tools.Get(ResponseURL, , Headers); + + Return Response; + +EndFunction + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function AuthorizationHeader(Val Token) + + Headers = New Match; + Headers.Insert("Authorization", "OAuth " + Token); + + Return Headers; + +EndFunction + +Function TogglePublicAccess(Val Token, Val Path, Val PublicAccess) + + OPI_TypeConversion.GetLine(Token); + OPI_TypeConversion.GetLine(Path); + OPI_TypeConversion.GetBoolean(PublicAccess); + + Headers = AuthorizationHeader(Token); + Destination = ?(PublicAccess, "publish", "unpublish"); + Href = "href"; + + URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Destination; + + Parameters = New Structure; + Parameters.Insert("path", Path); + + Parameters = OPI_Tools.RequestParametersToString(Parameters); + Response = OPI_Tools.Put(URL + Parameters, , Headers, False); + + ResponseURL = Response[Href]; + + If Not ValueFilled(ResponseURL) Then + Return Response; + EndIf; + + Response = OPI_Tools.Get(ResponseURL, , Headers); + + Return Response; + +EndFunction + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo b/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo new file mode 100644 index 0000000000..08aea07cf7 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="af0b34e8-10fa-414f-a643-915210c6289a"> + <name>OPI_YandexDisk</name> + <synonym> + <key>ru</key> + <value>Methodы work with Yandex Disk (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_YandexID/Module.bsl rename to service/interim/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl diff --git a/service/interim/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo b/service/interim/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo new file mode 100644 index 0000000000..6329dbbaf4 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="32379ca2-0f58-4143-9b34-cb552c54b962"> + <name>OPI_YandexID</name> + <synonym> + <key>ru</key> + <value>Methodы work with Yandex ID (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl new file mode 100644 index 0000000000..a7b02db477 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -0,0 +1,1229 @@ +// Location OS: ./OInt/tools/Modules/internal/Modules/OPI_Tools.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:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnusedLocalVariable-off +// BSLLS:UsingServiceTag-off +// BSLLS:NumberOfOptionalParams-off + +//@skip-check module-unused-local-variable +//@skip-check method-too-many-params + +#Region ServiceProgramInterface + +#Region HTTPMethods + +#Region RequestsWithoutBody + +Function Get(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val ResponseFile = Undefined) Export + Return ExecuteRequestWithoutBody(URL, "GET", Parameters, AdditionalHeaders, ResponseFile); +EndFunction + +Function Delete(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val ResponseFile = Undefined) Export + Return ExecuteRequestWithoutBody(URL, "DELETE", Parameters, AdditionalHeaders, ResponseFile); +EndFunction + +#EndRegion + +#Region RequestsWithBody + +Function Post(Val URL + , Val Parameters = "" + , Val AdditionalHeaders = "" + , Val JSON = True + , Val FullResponse = False + , Val ResponseFile = Undefined) Export + + Return ExecuteRequestWithBody(URL, "POST", Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile); + +EndFunction + +Function Patch(Val URL + , Val Parameters = "" + , Val AdditionalHeaders = "" + , Val JSON = True + , Val FullResponse = False + , Val ResponseFile = Undefined) Export + + Return ExecuteRequestWithBody(URL, "PATCH", Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile); + +EndFunction + +Function Put(Val URL + , Val Parameters = "" + , Val AdditionalHeaders = "" + , Val JSON = True + , Val FullResponse = False + , Val ResponseFile = Undefined) Export + + Return ExecuteRequestWithBody(URL, "PUT", Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile); + +EndFunction + +Function PostBinary(Val URL + , Val Body + , Val AdditionalHeaders + , Val FullResponse = False + , Val DataType = "application/octet-stream") Export + + Return ExecuteRequestWithBinaryData(URL, "POST", Body, AdditionalHeaders, FullResponse, DataType); + +EndFunction + +#EndRegion + +#Region MultipartRequests + +Function PostMultipart(Val URL + , Val Parameters = "" + , Val Files = "" + , Val ContentType = "image/jpeg" + , Val AdditionalHeaders = "" + , Val ResponseFile = Undefined) Export + + Return ExecuteMultipartRequest(URL, "POST", Parameters, Files, ContentType, AdditionalHeaders, ResponseFile); + +EndFunction + +Function PutMultipart(Val URL + , Val Parameters = "" + , Val Files = "" + , Val ContentType = "image/jpeg" + , Val AdditionalHeaders = "" + , Val ResponseFile = Undefined) Export + + Return ExecuteMultipartRequest(URL, "PUT", Parameters, Files, ContentType, AdditionalHeaders, ResponseFile); + +EndFunction + +Function PostMultipartRelated(Val URL + , Val JSON = "" + , Val Files = "" + , Val AdditionalHeaders = "" + , Val ResponseFile = Undefined) Export + + Return ExecuteMultipartRelatedRequest(URL, "POST", JSON, Files, AdditionalHeaders, ResponseFile); + +EndFunction + +Function PatchMultipartRelated(Val URL + , Val JSON = "" + , Val Files = "" + , Val AdditionalHeaders = "" + , Val ResponseFile = Undefined) Export + + Return ExecuteMultipartRelatedRequest(URL, "PATCH", JSON, Files, AdditionalHeaders, ResponseFile); + +EndFunction + +#EndRegion + +#Region Miscellaneous + +Procedure ProcessResponse(Response, Val FullResponse = False) Export + + If FullResponse Or TypeValue(Response) <> Type("HTTPResponse") Then + Return; + EndIf; + + BodyFile = Response.GetBodyFileName(); + + If Not BodyFile = Undefined Then + Response = BodyFile; + Return; + EndIf; + + GZip = "gzip"; + NeedsUnpacking = + Response.Headers.Get("Content-Encoding") = GZip + Or Response.Headers.Get("content-encoding") = GZip; + + If NeedsUnpacking Then + Response = UnpackResponse(Response); + EndIf; + + Response = ?(TypeValue(Response) = Type("HTTPResponse"), Response.GetBodyAsBinaryData(), Response); + + If TypeValue(Response) = Type("BinaryData") Then + + Try + Response = JsonToStructure(Response); + Except + Return; + EndTry; + + EndIf; + +EndProcedure + +Function CreateRequest(Val Address, Val AdditionalHeaders = "", Val DataType = "") Export + + Headers = New Match; + Headers.Insert("Accept-Encoding", "gzip"); + Headers.Insert("Accept" , "*/*"); + Headers.Insert("Connection" , "keep-alive"); + Headers.Insert("Accept-Charset" , "utf-8"); + + If ValueFilled(DataType) Then + Headers.Insert("Content-Type", DataType); + EndIf; + + If TypeValue(AdditionalHeaders) = Type("Match") Then + + For Each Title In AdditionalHeaders Do + Headers.Insert(Title.Key, Title.Value); + EndDo; + + EndIf; + + NewRequest = New HTTPRequest(Address, Headers); + + Return NewRequest; + +EndFunction + +Function CreateConnection(Val Server, Val User = "", Val Password = "") Export + + Try + SSL = New SecureConnectionOpenSSL; + Return New HTTPConnection(Server, 443, User, Password, , 3000, SSL); + Except + Return New HTTPConnection(Server, 443, User, Password, , 3000); + EndTry; + +EndFunction + +#EndRegion + +#EndRegion + +#Region Service + +Function RequestParametersToString(Val Parameters) Export + + If Parameters.Quantity() = 0 Then + Return ""; + EndIf; + + ParameterString = "?"; + + For Each Parameter In Parameters Do + + ParameterValue = ConvertParameterToString(Parameter.Value); + + ParameterString = ParameterString + + Parameter.Key + + "=" + + ParameterValue + + "&"; + EndDo; + + ParameterString = Left(ParameterString, StrLength(ParameterString) - 1); + + Return ParameterString; + +EndFunction + +Function SplitURL(Val URL) Export + + URL = StringReplace(URL, "https://", ""); + URL = StringReplace(URL, "http://", ""); + URL = StringReplace(URL, ":443", ""); + + Address = Right(URL, StrLength(URL) - StrFind(URL, "/", SearchDirection.FromStart) + 1); + Server = Left(URL, StrFind(URL, "/", SearchDirection.FromStart) - 1); + + Try + SSL = New SecureConnectionOpenSSL; + Except + Server = "https://" + Server; + EndTry; + + ReturnStructure = New Structure; + ReturnStructure.Insert("Server", Server); + ReturnStructure.Insert("Address" , Address); + + Return ReturnStructure; + +EndFunction + +Function JsonToStructure(Val Text) Export + + If Not ValueFilled(Text) Then + Return ""; + EndIf; + + Text = ?(TypeValue(Text) = Type("BinaryData"), GetStringFromBinaryData(Text), Text); + + ReadingJSON = New ReadingJSON; + ReadingJSON.SetString(Text); + + Data = ReadJSON(ReadingJSON, True, Undefined, JSONDateFormat.ISO); + ReadingJSON.Close(); + + Return Data; + +EndFunction + +Function JSONString(Val Data, Val Escaping = "No") Export + + JSONParameters = New JSONWriteParameters(JSONLineBreak.Windows + , " " + , True + , EscapeJSONCharacters[Escaping] + , False + , False + , False + , False); + + Try + + WritingJSON = New WritingJSON; + WritingJSON.SetString(JSONParameters); + + WriteJSON(WritingJSON, Data); + Return WritingJSON.Close(); + + Except + Return "NOT JSON: " + String(Data); + EndTry; + +EndFunction + +Function NumberToString(Val Number) Export + Return StringReplace(String(Number), Symbols.NPP, ""); +EndFunction + +Function ReadJSONFile(Val Path) Export + + ReadingJSON = New ReadingJSON; + ReadingJSON.OpenFile(Path); + Values = ReadJSON(ReadingJSON); + + ReadingJSON.Close(); + + Return Values; + +EndFunction + +Function RequestParametersToMatch(Val ParameterString) Export + + ReturnMapping = New Match; + NumberOfParts = 2; + ParameterArray = StrSplit(ParameterString, "&", False); + + For Each Parameter In ParameterArray Do + + KeyValueArray = StrSplit(Parameter, "="); + + If KeyValueArray.Quantity() = NumberOfParts Then + ReturnMapping.Insert(KeyValueArray[0], KeyValueArray[1]); + EndIf; + + EndDo; + + Return ReturnMapping; + +EndFunction + +Function GetCurrentDate() Export + Return LocalTime(CurrentUniversalDate()); +EndFunction + +Function UNIXTime(Val Date) Export + + OTD = New TypeDescription("Date"); + Date = OTD.ConvertValue(Date); + + UNIX = Format(Date - Date(1970, 1, 1, 1, 0, 0), "HC=10; HDC=0; HG=0"); + UNIX = StringReplace(UNIX, ",", ""); + UNIX = Left(UNIX, 10); + + Return UNIX; + +EndFunction + +Function ProgressInformation(Val Current, Val Total, Val Unit, Val Divider = 1) Export + + Whole = 100; + Current = Round(Current / Divider, 2); + Total = Round(Total / Divider, 2); + Percent = Goal(Current / Total * Whole); + + StrCurrent = NumberToString(Current); + StrTotal = NumberToString(Total); + StrPercentage = NumberToString(Percent); + + Information = StrCurrent + "/" + StrTotal + " " + Unit + " ( " + StrPercentage + "% )"; + + Return Information; + +EndFunction + +Function ConvertDataWithSizeRetrieval(Data, Val MinimumStreamSize = 0) Export + + Size = 0; + + If TypeValue(Data) = Type("String") Then + + FileOnDisk = New File(Data); + + If FileOnDisk.Exists() Then + Size = FileOnDisk.Size(); + Else + OPI_TypeConversion.GetBinaryData(Data); + Size = Data.Size(); + EndIf; + + Else + OPI_TypeConversion.GetBinaryData(Data); + Size = Data.Size(); + EndIf; + + If ValueFilled(MinimumStreamSize) Then + If Size < MinimumStreamSize Then + OPI_TypeConversion.GetBinaryData(Data); + Else + OPI_TypeConversion.GetBinaryOrStream(Data); + EndIf; + Else + OPI_TypeConversion.GetBinaryOrStream(Data); + EndIf; + + Return Size; + +EndFunction + +Procedure ValueToArray(Value) Export + + Value_ = New Array; + Value_.Add(Value); + Value = Value_; + +EndProcedure + +Procedure ReplaceSpecialCharacters(Text, Markup = "Markdown") Export + + CharacterMapping = New Match; + + If Markup = "HTML" Then + + CharacterMapping.Insert("&", "&"); + + ElsIf Markup = "MarkdownV2" Then + + CharacterMapping.Insert("-", "\-"); + CharacterMapping.Insert("+", "\+"); + CharacterMapping.Insert("#", "\#"); + CharacterMapping.Insert("=", "\="); + CharacterMapping.Insert("{", "\{"); + CharacterMapping.Insert("}", "\}"); + CharacterMapping.Insert(".", "\."); + + Else + Return; + EndIf; + + For Each ArraySymbol In CharacterMapping Do + Text = StringReplace(Text, ArraySymbol.Key, ArraySymbol.Value); + EndDo; + +EndProcedure + +Procedure RemoveEmptyCollectionFields(Collection) Export + + CollectionType = TypeValue(Collection); + OutputCollection = New(CollectionType); + + If CollectionType = Type("Match") Or CollectionType = Type("Structure") Then + + RemoveEmptyKeyValues(Collection, OutputCollection); + + ElsIf CollectionType = Type("Array") Then + + RemoveEmptyArrayElements(Collection, OutputCollection); + + Else + + OutputCollection = Collection; + + EndIf; + + Collection = OutputCollection; + +EndProcedure + +Procedure Pause(Val Seconds) Export + + Connection = New HTTPConnection("1C.ru", 11111, , , , Seconds); + Try + Connection.Get(New HTTPRequest("")); + Except + Return; + EndTry; + +EndProcedure + +Procedure AddField(Val Name, Val Value, Val Type, Collection) Export + + Filled = ValueFilled(Value); + + If Not Filled Then + Return; + EndIf; + + If Type = "Date" Then + OPI_TypeConversion.GetDate(Value); + Value = UNIXTime(Value); + + ElsIf Type = "Collection" Then + OPI_TypeConversion.GetCollection(Value); + + ElsIf Type = "Boolean" Then + OPI_TypeConversion.GetBoolean(Value); + + ElsIf Type = "FileString" Then + OPI_TypeConversion.GetLine(Value, True); + + ElsIf Type = "Array" Then + OPI_TypeConversion.GetArray(Value); + + ElsIf Type = "BinaryData" Then + OPI_TypeConversion.GetBinaryData(Value); + + ElsIf Type = "Number" Then + OPI_TypeConversion.GetNumber(Value); + + Else + OPI_TypeConversion.GetLine(Value); + + EndIf; + + Collection.Insert(Name, Value); + +EndProcedure + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function ExecuteRequestWithBody(Val URL + , Val View + , Val Parameters = "" + , Val AdditionalHeaders = "" + , Val JSON = True + , Val FullResponse = False + , Val ResponseFile = Undefined) + + If Not ValueFilled(Parameters) Then + Parameters = New Structure; + EndIf; + + DataType = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8"); + URLStructure = SplitURL(URL); + Server = URLStructure["Server"]; + Address = URLStructure["Address"]; + + Request = CreateRequest(Address, AdditionalHeaders, DataType); + Connection = CreateConnection(Server); + + SetRequestBody(Request, Parameters, JSON); + + If ValueFilled(ResponseFile) Then + Response = Connection.CallHTTPMethod(View, Request, ResponseFile); + Else + Response = Connection.CallHTTPMethod(View, Request); + EndIf; + + If ThisIsRedirection(Response) Then + Response = ExecuteRequestWithBody(Response.Headers["Location"] + , View + , Parameters + , AdditionalHeaders + , JSON + , FullResponse + , ResponseFile); + Else + ProcessResponse(Response, FullResponse); + EndIf; + + Return Response; + +EndFunction + +Function ExecuteRequestWithBinaryData(Val URL + , Val View + , Val Data + , Val AdditionalHeaders + , Val FullResponse + , Val DataType) + + URLStructure = SplitURL(URL); + Server = URLStructure["Server"]; + Address = URLStructure["Address"]; + + Request = CreateRequest(Address, AdditionalHeaders, DataType); + Connection = CreateConnection(Server); + + Request.SetBodyFromBinaryData(Data); + + Response = Connection.CallHTTPMethod(View, Request); + + If ThisIsRedirection(Response) Then + Response = ExecuteRequestWithBinaryData(Response.Headers["Location"] + , View + , Data + , AdditionalHeaders + , FullResponse + , DataType); + Else + ProcessResponse(Response, FullResponse); + EndIf; + + Return Response; + +EndFunction + +Function ExecuteRequestWithoutBody(Val URL + , Val View + , Val Parameters = "" + , Val AdditionalHeaders = "" + , Val ResponseFile = Undefined) + + If Not ValueFilled(Parameters) Then + Parameters = New Structure; + EndIf; + + URLStructure = SplitURL(URL); + Server = URLStructure["Server"]; + Address = URLStructure["Address"] + RequestParametersToString(Parameters); + + Request = CreateRequest(Address, AdditionalHeaders); + Connection = CreateConnection(Server); + + If ValueFilled(ResponseFile) Then + Response = Connection.CallHTTPMethod(View, Request, ResponseFile); + Else + Response = Connection.CallHTTPMethod(View, Request); + EndIf; + + If ThisIsRedirection(Response) Then + Response = ExecuteRequestWithoutBody(Response.Headers["Location"], View, Parameters, AdditionalHeaders, ResponseFile); + Else + ProcessResponse(Response); + EndIf; + + Return Response; + +EndFunction + +Function ExecuteMultipartRequest(Val URL + , Val View + , Val Parameters = "" + , Val Files = "" + , Val ContentType = "image/jpeg" + , Val AdditionalHeaders = "" + , Val ResponseFile = Undefined) + + If Not ValueFilled(Parameters) Then + Parameters = New Structure; + EndIf; + + If Not ValueFilled(Files) Then + Files = New Match; + EndIf; + + Redirection = 300; + Error = 400; + Boundary = StringReplace(String(New UniqueIdentifier), "-", ""); + LineSeparator = Symbols.VK + Symbols.PS; + DataType = "multipart/form-data; boundary=" + Boundary; + URLStructure = SplitURL(URL); + Server = URLStructure["Server"]; + Address = URLStructure["Address"]; + + Request = CreateRequest(Address, AdditionalHeaders, DataType); + Connection = CreateConnection(Server); + + RequestBody = GetTempFileName(); + TextRecord = New DataRecording(RequestBody + , TextEncoding.UTF8 + , ByteOrder.LittleEndian + , "" + , False + , "" + , False); + + WriteMultipartParameters(TextRecord, Boundary, Parameters); + WriteMultipartFiles(TextRecord, Boundary, ContentType, Files); + + TextRecord.WriteString("--" + boundary + "--" + LineSeparator); + TextRecord.Close(); + + Request.SetBodyFileName(RequestBody); + + If ValueFilled(ResponseFile) Then + Response = Connection.CallHTTPMethod(View, Request, ResponseFile); + Else + Response = Connection.CallHTTPMethod(View, Request); + EndIf; + + ThisIsRedirection = Response.StatusCode >= Redirection And Response.StatusCode < Error; + + If ThisIsRedirection Then + Response = ExecuteMultipartRequest(Response.Headers["Location"] + , View + , Parameters + , Files + , ContentType + , AdditionalHeaders + , ResponseFile); + Else + ProcessResponse(Response); + EndIf; + + Request = Undefined; + TextRecord = Undefined; + + DeleteFiles(RequestBody); + Return Response; + +EndFunction + +Function ExecuteMultipartRelatedRequest(Val URL + , Val View + , Val JSON = "" + , Val Files = "" + , Val AdditionalHeaders = "" + , Val ResponseFile = Undefined) + + Redirection = 300; + Error = 400; + Boundary = StringReplace(String(New UniqueIdentifier), "-", ""); + LineSeparator = Symbols.VK + Symbols.PS; + DataType = "multipart/related; boundary=" + Boundary; + URLStructure = SplitURL(URL); + Server = URLStructure["Server"]; + Address = URLStructure["Address"]; + + Request = CreateRequest(Address, AdditionalHeaders, DataType); + Connection = CreateConnection(Server); + + RequestBody = GetTempFileName(); + TextRecord = New DataRecording(RequestBody + , TextEncoding.UTF8 + , ByteOrder.LittleEndian + , "" + , False + , "" + , False); + + WriteJSONMultipart(TextRecord, Boundary, JSON); + WriteRelatedFiles(TextRecord, Boundary, Files); + + TextRecord.WriteString("--" + boundary + "--" + LineSeparator); + TextRecord.Close(); + + AddContentLength(Request); + + Request.SetBodyFileName(RequestBody); + + If ValueFilled(ResponseFile) Then + Response = Connection.CallHTTPMethod(View, Request, ResponseFile); + Else + Response = Connection.CallHTTPMethod(View, Request); + EndIf; + + ThisIsRedirection = Response.StatusCode >= Redirection And Response.StatusCode < Error; + + If ThisIsRedirection Then + Response = ExecuteMultipartRelatedRequest(Response.Headers["Location"] + , View + , JSON + , Files + , AdditionalHeaders + , ResponseFile); + Else + ProcessResponse(Response); + EndIf; + + Request = Undefined; + TextRecord = Undefined; + + DeleteFiles(RequestBody); + Return Response; + +EndFunction + +Function ThisIsRedirection(Val Response) + + Redirection = 300; + Error = 400; + + ThisIsRedirection = Response.StatusCode >= Redirection + And Response.StatusCode < Error + And ValueFilled(Response.Headers["Location"]); + + Return ThisIsRedirection; + +EndFunction + +Function ConvertParameterToString(Val Value) + + If TypeValue(Value) = Type("Array") Then + Value = StrJoin(Value, ","); + Value = EncodeString(Value, StringEncodingMethod.URLencoding); + Value = "[" + Value + "]"; + Else + Value = NumberToString(Value); + Value = EncodeString(Value, StringEncodingMethod.URLencoding); + EndIf; + + Return Value; + +EndFunction + +Procedure SetRequestBody(Request, Val Parameters, Val JSON) + + Collection = TypeValue(Parameters) = Type("Structure") + Or TypeValue(Parameters) = Type("Match") + Or TypeValue(Parameters) = Type("Array"); + + If JSON Then + Data = JSONString(Parameters); + ElsIf Not Collection Then + Data = Parameters; + Else + ParameterString = RequestParametersToString(Parameters); + Data = Right(ParameterString, StrLength(ParameterString) - 1); + EndIf; + + If TypeValue(Data) = Type("String") Then + Request.SetBodyFromString(Data); + Else + //@skip-check wrong-type-expression + Request.SetBodyFromBinaryData(Data); + EndIf; + +EndProcedure + +Procedure WriteMultipartParameters(TextRecord, Val Boundary, Val Parameters) + + LineSeparator = Symbols.VK + Symbols.PS; + + For Each Parameter In Parameters Do + + If Parameter.Value = Undefined + Or Parameter.Value = NULL Then + Continue; + EndIf; + + TextRecord.WriteString("--" + boundary + LineSeparator); + TextRecord.WriteString("Content-Disposition: form-data; name=""" + Parameter.Key + """"); + TextRecord.WriteString(LineSeparator); + TextRecord.WriteString(LineSeparator); + + If TypeValue(Parameter.Value) = Type("String") + Or TypeValue(Parameter.Value) = Type("Number") Then + + ValueAsString = NumberToString(Parameter.Value); + TextRecord.WriteString(ValueAsString); + + ElsIf TypeValue(Parameter.Value) = Type("Boolean") Then + + TextRecord.WriteString(?(Parameter.Value, "true", "false")); + + Else + + TextRecord.Write(Parameter.Value); + + EndIf; + + TextRecord.WriteString(LineSeparator); + + EndDo; + +EndProcedure + +Procedure WriteMultipartFiles(TextRecord, Val Boundary, Val ContentType, Val Files) + + ContentType = ShortLP(ContentType); + LineSeparator = Symbols.VK + Symbols.PS; + DotReplacement = "___"; + + For Each File In Files Do + + FilePath = StringReplace(File.Key, DotReplacement, "."); + + If ContentType = "image/jpeg" Then + SendingFileName = "photo"; + Else + SendingFileName = StringReplace(File.Key, DotReplacement, "."); + SendingFileName = Left(SendingFileName, StrFind(SendingFileName, ".") - 1); + SendingFileName = ?(ValueFilled(SendingFileName), SendingFileName, StringReplace(File.Key, + DotReplacement, ".")); + EndIf; + + TextRecord.WriteString("--" + boundary + LineSeparator); + TextRecord.WriteString("Content-Disposition: form-data; name=""" + + SendingFileName + + """; filename=""" + + FilePath + + """"); + TextRecord.WriteString(LineSeparator); + + If ValueFilled(ContentType) Then + TextRecord.WriteString("Content-Type: " + ContentType); + EndIf; + + TextRecord.WriteString(LineSeparator); + TextRecord.WriteString(LineSeparator); + WriteBinaryData(TextRecord, File.Value); + TextRecord.WriteString(LineSeparator); + + EndDo; + +EndProcedure + +Procedure WriteRelatedFiles(TextRecord, Val Boundary, Val Files) + + If Not ValueFilled(Files) Then + Return; + EndIf; + + LineSeparator = Symbols.VK + Symbols.PS; + + If TypeValue(Files) = Type("Match") Then + For Each File In Files Do + + TextRecord.WriteString("--" + boundary + LineSeparator); + TextRecord.WriteString("Content-Type: " + File.Value); + TextRecord.WriteString(LineSeparator); + TextRecord.WriteString(LineSeparator); + WriteBinaryData(TextRecord, File.Key); + TextRecord.WriteString(LineSeparator); + TextRecord.WriteString(LineSeparator); + + EndDo; + + EndIf; + +EndProcedure + +Procedure WriteBinaryData(DataRecording, Val BinaryData) + + ChunkSize = 268435456; + BytesRead = 0; + CurrentPosition = 0; + TotalSize = BinaryData.Size(); + + WHile BytesRead < TotalSize Do + + ReadingData = New ReadingData(BinaryData); + BytesRead = ReadingData.Skip(CurrentPosition); + Result = ReadingData.Read(ChunkSize); + Current data = Result.GetBinaryData(); + CurrentSize = Current data.Size(); + + If Not ValueFilled(Current data) Then + Break; + EndIf; + + DataRecording.Write(Current data); + + // !OInt ReleaseObject(Current data); + // !OInt PerformGarbageCollection(); + + CurrentPosition = CurrentPosition + CurrentSize; + + EndDo; + +EndProcedure + +Procedure WriteJSONMultipart(TextRecord, Val Boundary, Val JSON) + + If Not ValueFilled(JSON) Then + Return; + EndIf; + + LineSeparator = Symbols.VK + Symbols.PS; + + TextRecord.WriteString("--" + boundary + LineSeparator); + TextRecord.WriteString("Content-Type: application/json; charset=UTF-8"); + TextRecord.WriteString(LineSeparator); + TextRecord.WriteString(LineSeparator); + TextRecord.WriteString(JSON); + TextRecord.WriteString(LineSeparator); + TextRecord.WriteString(LineSeparator); + +EndProcedure + +Procedure AddContentLength(Request) + + RequestBody = Request.GetBodyAsBinaryData(); + + If ValueFilled(RequestBody) Then + + Size = RequestBody.Size(); + Request.Headers.Insert("Content-Length", NumberToString(Size)); + + EndIf; + +EndProcedure + +Procedure RemoveEmptyKeyValues(Val Collection, OutputCollection) + + For Each CollectionItem In Collection Do + + If Not CollectionItem.Value = Undefined And Not CollectionItem.Value = NULL Then + OutputCollection.Insert(CollectionItem.Key, CollectionItem.Value); + EndIf; + + EndDo; + +EndProcedure + +Procedure RemoveEmptyArrayElements(Val Collection, OutputCollection) + + For Each CollectionItem In Collection Do + + If Not CollectionItem = Undefined And Not CollectionItem = NULL Then + OutputCollection.Add(CollectionItem); + EndIf; + + EndDo; + +EndProcedure + +#Region GZip + +// Description withтруtoтур withм. зdеwithь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT +// Source: https://github.com/vbondarevsky/Connector + +// Connector: convenient HTTP client for 1C:Enterprise 8 +// +// Copyright 2017-2023 Vladimir Bondarevskiy +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// URL: https://github.com/vbondarevsky/Connector +// e-mail: vbondarevsky@gmail.com +// Version: 2.4.8 +// +// Requirements: 1C platform version 8.3.10 and above + +Function UnpackResponse(Response) + + Try + Return ReadGZip(Response.GetBodyAsBinaryData()); + Except + Return Response; + EndTry; + +EndFunction + +Function ReadGZip(CompressedData) Export + + GZipPrefixSize = 10; + GZipPostfixSize = 8; + + SizeDD = ZipSizeDD(); + SizeCDH = ZipSizeCDH(); + SizeESD = ZipSizeEOCD(); + SizeLFH = ZipSizeLFH(); + + ReadingData = New ReadingData(CompressedData); + ReadingData.Skip(GZipPrefixSize); + CompressedDataSize = ReadingData.SourceStream().Size() - GZipPrefixSize - GZipPostfixSize; + + ZipStream = New MemoryStream(SizeLFH + + CompressedDataSize + + SizeDD + + SizeCDH + + SizeESD); + + DataRecording = New DataRecording(ZipStream); + DataRecording.WriteBinaryDataBuffer(ZipLFH()); + ReadingData.CopyTo(DataRecording, CompressedDataSize); + + DataRecording.Close(); + DataRecording = New DataRecording(ZipStream); + + CRC32 = ReadingData.ReadInt32(); + UncompressedDataSize = ReadingData.ReadInt32(); + ReadingData.Close(); + + DataRecording.WriteBinaryDataBuffer(ZipDD(CRC32, CompressedDataSize, UncompressedDataSize)); + DataRecording.WriteBinaryDataBuffer(ZipCDH(CRC32, CompressedDataSize, UncompressedDataSize)); + DataRecording.WriteBinaryDataBuffer(ZipEOCD(CompressedDataSize)); + DataRecording.Close(); + + Return ReadZip(ZipStream); + +EndFunction + +Function ReadZip(CompressedData, ErrorText = Undefined) + + Directory = GetTempFileName(); + ReadingZip = New ReadingZipFile(CompressedData); + FileName = ReadingZip.Elements[0].Name; + Try + ReadingZip.Extract(ReadingZip.Elements[0], Directory, ZIPFilePathRecoveryMode.DoNotRestore); + Except + // Ignore archive integrity check, just read the result + ErrorText = DetailedErrorRepresentation(ErrorInformation()); + EndTry; + ReadingZip.Close(); + + Result = New BinaryData(Directory + GetPathSeparator() + FileName); + DeleteFiles(Directory); + + Return Result; + +EndFunction + +Function ZipSizeLFH() + + Return 34; + +EndFunction + +Function ZipSizeDD() + + Return 16; + +EndFunction + +Function ZipSizeCDH() + + Return 50; + +EndFunction + +Function ZipSizeEOCD() + + Return 22; + +EndFunction + +Function ZipLFH() + + // Local file header + Buffer = New BinaryDataBuffer(ZipSizeLFH()); + Buffer.WriteInt32(0, 67324752); // signature 0x04034b50 + Buffer.WriteInt16(4, 20); // version + Buffer.WriteInt16(6, 10); // bit flags + Buffer.WriteInt16(8, 8); // compression method + Buffer.WriteInt16(10, 0); // time + Buffer.WriteInt16(12, 0); // date + Buffer.WriteInt32(14, 0); // crc-32 + Buffer.WriteInt32(18, 0); // compressed size + Buffer.WriteInt32(22, 0); // uncompressed size + Buffer.WriteInt16(26, 4); // filename legth - "data" + Buffer.WriteInt16(28, 0); // extra field length + Buffer.Write(30, GetBinaryDataBufferFromString("data", "ascii", False)); + + Return Buffer; + +EndFunction + +Function ZipDD(CRC32, CompressedDataSize, UncompressedDataSize) + + // Data descriptor + Buffer = New BinaryDataBuffer(ZipSizeDD()); + Buffer.WriteInt32(0, 134695760); + Buffer.WriteInt32(4, CRC32); + Buffer.WriteInt32(8, CompressedDataSize); + Buffer.WriteInt32(12, UncompressedDataSize); + + Return Buffer; + +EndFunction + +Function ZipCDH(CRC32, CompressedDataSize, UncompressedDataSize) + + // Central directory header + Buffer = New BinaryDataBuffer(ZipSizeCDH()); + Buffer.WriteInt32(0, 33639248); // signature 0x02014b50 + Buffer.WriteInt16(4, 798); // version made by + Buffer.WriteInt16(6, 20); // version needed to extract + Buffer.WriteInt16(8, 10); // bit flags + Buffer.WriteInt16(10, 8); // compression method + Buffer.WriteInt16(12, 0); // time + Buffer.WriteInt16(14, 0); // date + Buffer.WriteInt32(16, CRC32); // crc-32 + Buffer.WriteInt32(20, CompressedDataSize); // compressed size + Buffer.WriteInt32(24, UncompressedDataSize); // uncompressed size + Buffer.WriteInt16(28, 4); // file name length + Buffer.WriteInt16(30, 0); // extra field length + Buffer.WriteInt16(32, 0); // file comment length + Buffer.WriteInt16(34, 0); // disk number start + Buffer.WriteInt16(36, 0); // internal file attributes + Buffer.WriteInt32(38, 2176057344); // external file attributes + Buffer.WriteInt32(42, 0); // relative offset of local header + Buffer.Write(46, GetBinaryDataBufferFromString("data", "ascii", False)); + + Return Buffer; + +EndFunction + +Function ZipEOCD(CompressedDataSize) + + // End of central directory + SizeCDH = 50; + Buffer = New BinaryDataBuffer(ZipSizeEOCD()); + Buffer.WriteInt32(0, 101010256); // signature 0x06054b50 + Buffer.WriteInt16(4, 0); // number of this disk + Buffer.WriteInt16(6, 0); // number of the disk with the start of the central directory + Buffer.WriteInt16(8, 1); // total number of entries in the central directory on this disk + Buffer.WriteInt16(10, 1); // total number of entries in the central directory + Buffer.WriteInt32(12, SizeCDH); // size of the central directory + // offset of start of central directory with respect to the starting disk number + Buffer.WriteInt32(16, ZipSizeLFH() + CompressedDataSize + ZipSizeDD()); + Buffer.WriteInt16(20, 0); // the starting disk number + + Return Buffer; + +EndFunction + +#EndRegion + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo new file mode 100644 index 0000000000..1684016796 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e810f1d2-6714-4c85-94b1-c3ce20788e78"> + <name>OPI_Tools</name> + <synonym> + <key>ru</key> + <value>OPI инwithтрументы</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl new file mode 100644 index 0000000000..a8586b49ca --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl @@ -0,0 +1,110 @@ +// Location OS: ./OInt/tools/Modules/internal/Modules/OPI_Cryptography.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 + +#Region ServiceProgramInterface + +#Region BSP + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2019, LLC 1C-Soft +// All rights reserved. This program and accompanying materials are provided +// in withоотinетwithтinии with уwithлоinиями лицензии Attribution 4.0 International (CC BY 4.0) +// License text available at: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +Function HMACSHA256(Val Key, Val Data) Export + + Return HMAC(Key, Data, HashFunction.SHA256, 64); + +EndFunction + +Function Hash(BinaryData, Type) Export + + Hashing = New DataHashing(Type); + Hashing.Add(BinaryData); + + Return Hashing.HashSum; + +EndFunction + +Function HMAC(Val Key, Val Data, Type, BlockSize) Export + + Twice = 2; + + If Key.Size() > BlockSize Then + Key = Hash(Key, Type); + EndIf; + + If Key.Size() <= BlockSize Then + Key = GetHexStringFromBinaryData(Key); + Key = Left(Key + RepeatString("00", BlockSize), BlockSize * Twice); + EndIf; + + Key = GetBinaryDataBufferFromBinaryData(GetBinaryDataFromHexString(Key)); + + Ipad = GetBinaryDataBufferFromHexString(RepeatString("36", BlockSize)); + Opad = GetBinaryDataBufferFromHexString(RepeatString("5c", BlockSize)); + + Ipad.WriteBitwiseExclusiveOr(0, Key); + Ikeypad = GetBinaryDataFromBinaryDataBuffer(ipad); + + Opad.WriteBitwiseExclusiveOr(0, Key); + Okeypad = GetBinaryDataFromBinaryDataBuffer(opad); + + Return Hash(ConcatenateBinaryData(okeypad, Hash(ConcatenateBinaryData(ikeypad, Data), Type)), Type); + +EndFunction + +Function ConcatenateBinaryData(BinaryData1, BinaryData2) Export + + BinaryDataArray = New Array; + BinaryDataArray.Add(BinaryData1); + BinaryDataArray.Add(BinaryData2); + + Return JoinBinaryData(BinaryDataArray); + +EndFunction + +Function RepeatString(String, Quantity) Export + + Parts = New Array(Quantity); + + For To = 1 For Quantity Do + Parts.Add(String); + EndDo; + + Return StrJoin(Parts, ""); + +EndFunction + +#EndRegion + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo new file mode 100644 index 0000000000..c8cd120ec4 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="55bb3987-d7ac-4ed7-a6fd-aa4cfeb61c27"> + <name>OPI_Cryptography</name> + <synonym> + <key>ru</key> + <value>Toриптография (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl new file mode 100644 index 0000000000..94e64c8822 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl @@ -0,0 +1,470 @@ +// Location OS: ./OInt/tools/Modules/OPI_TestDataRetrieval.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 + +// Uncomment if OneScript is executed +// #Use "./internal" +// #Use asserts + +#Region ServiceProgramInterface + +Function GetTestingSectionMapping() Export + + StandardDependencies = "[Decode, Build]"; + GoogleDependencies = "Testing-GoogleWorkspace"; + + Sections = New Structure; + Sections.Insert("Telegram" , StandardDependencies); + Sections.Insert("VK" , StandardDependencies); + Sections.Insert("Viber" , StandardDependencies); + Sections.Insert("Twitter" , StandardDependencies); + Sections.Insert("YandexDisk" , StandardDependencies); + Sections.Insert("GoogleWorkspace", StandardDependencies); + Sections.Insert("GoogleCalendar" , GoogleDependencies); + Sections.Insert("GoogleDrive" , GoogleDependencies); + Sections.Insert("GoogleSheets" , GoogleDependencies); + Sections.Insert("Notion" , StandardDependencies); + Sections.Insert("Slack" , StandardDependencies); + Sections.Insert("Airtable" , StandardDependencies); + Sections.Insert("Dropbox" , StandardDependencies); + + Return Sections; + +EndFunction + +Function GetTestTable() Export + + Telegram = "Telegram"; + VK = "VK"; + YDisk = "YandexDisk"; + Calendar = "GoogleCalendar"; + Twitter = "Twitter"; + Viber = "Viber"; + Drive = "GoogleDrive"; + VSpace = "GoogleWorkspace"; + Notion = "Notion"; + Slack = "Slack"; + Tables = "GoogleSheets"; + AirT = "Airtable"; + Dropbox = "Dropbox"; + + TestTable = New ValueTable; + TestTable.Columns.Add("Method"); + TestTable.Columns.Add("Synonym"); + TestTable.Columns.Add("Section"); + + NewTest(TestTable, "Telegram_GetBotInfo" , "Get bot information" , Telegram); + NewTest(TestTable, "Telegram_GetUpdates" , "Get updates" , Telegram); + NewTest(TestTable, "Telegram_SetWebhook" , "Set Webhook" , Telegram); + NewTest(TestTable, "Telegram_SendTextMessage" , "Send text message" , Telegram); + NewTest(TestTable, "Telegram_SendImage" , "Send image" , Telegram); + NewTest(TestTable, "Telegram_SendVideo" , "Send video" , Telegram); + NewTest(TestTable, "Telegram_SendAudio" , "Send audio" , Telegram); + NewTest(TestTable, "Telegram_SendDocument" , "Send document" , Telegram); + NewTest(TestTable, "Telegram_SendGIF" , "Send GIF" , Telegram); + NewTest(TestTable, "Telegram_SendMediaGroup" , "Send media group" , Telegram); + NewTest(TestTable, "Telegram_SendLocation" , "Send location" , Telegram); + NewTest(TestTable, "Telegram_SendContact" , "Send contact" , Telegram); + NewTest(TestTable, "Telegram_SendPoll" , "Send poll" , Telegram); + NewTest(TestTable, "Telegram_ForwardMessage" , "Forward message" , Telegram); + NewTest(TestTable, "Telegram_BanUnban" , "Ban/Unban" , Telegram); + NewTest(TestTable, "Telegram_CreateInvitationLink" , "Create invitation link" , Telegram); + NewTest(TestTable, "Telegram_PinUnpinMessage" , "Pin/Unpin message" , Telegram); + NewTest(TestTable, "Telegram_GetMemberCount" , "Get participant count" , Telegram); + NewTest(TestTable, "Telegram_GetForumAvatarsList", "Get forum avatars list", Telegram); + NewTest(TestTable, "Telegram_CreateDeleteForumTopic" , "Create/Delete forum topic" , Telegram); + NewTest(TestTable, "Telegram_ChangeMainTopicName" , "Change main topic name" , Telegram); + NewTest(TestTable, "Telegram_HideShowMainTopic" , "Hide/Show main topic" , Telegram); + + NewTest(TestTable, "VK_CreateTokenLink" , "Create token retrieval link", VK); + NewTest(TestTable, "VK_CreateDeletePost" , "Create/Delete post" , VK); + NewTest(TestTable, "VK_CreateCompositePost" , "Create/Delete composite post" , VK); + NewTest(TestTable, "VK_CreatePoll" , "Create poll" , VK); + NewTest(TestTable, "VK_SaveDeleteImage" , "Add/Delete image" , VK); + NewTest(TestTable, "VK_CreateStory" , "Create story" , VK); + NewTest(TestTable, "VK_DiscussionMethods" , "Actions with discussions" , VK); + NewTest(TestTable, "VK_LikeRepostComment" , "Like/Repost/Comment" , VK); + NewTest(TestTable, "VK_GetStatistics" , "Get statistics" , VK); + NewTest(TestTable, "VK_GetPostStatistics" , "Get post statistics" , VK); + NewTest(TestTable, "VK_CreateAdCampaign" , "Create advertising campaign" , VK); + NewTest(TestTable, "VK_SendMessage" , "Send message" , VK); + NewTest(TestTable, "VK_GetProductCategories" , "Get product categories" , VK); + NewTest(TestTable, "VK_CreateProductSelection" , "Create product and selection" , VK); + NewTest(TestTable, "VK_CreateProductWithProperties" , "Create product with properties" , VK); + NewTest(TestTable, "VK_GetProductList" , "Get product list" , VK); + NewTest(TestTable, "VK_GetSelectionList" , "Get selection list" , VK); + NewTest(TestTable, "VK_GetPropertyList" , "Get property list" , VK); + NewTest(TestTable, "VK_GetOrderList" , "Get order list" , VK); + NewTest(TestTable, "VK_UploadVideo" , "Upload video" , VK); + + NewTest(TestTable, "YDisk_GetDiskInfo" , "Get disk information" , YDisk); + NewTest(TestTable, "YDisk_CreateFolder" , "Create folder" , YDisk); + NewTest(TestTable, "YDisk_UploadByUrlAndGetObject", "Upload by URL and get" , YDisk); + NewTest(TestTable, "YDisk_UploadDeleteFile" , "Upload/Delete file" , YDisk); + NewTest(TestTable, "YDisk_CreateObjectCopy" , "Create object copy" , YDisk); + NewTest(TestTable, "YDisk_GetDownloadLink" , "Get download link" , YDisk); + NewTest(TestTable, "YDisk_GetFileList" , "Get list of files" , YDisk); + NewTest(TestTable, "YDisk_MoveObject" , "Move object" , YDisk); + NewTest(TestTable, "YDisk_PublicObjectActions" , "Actions with public objects", YDisk); + NewTest(TestTable, "YDisk_GetPublishedList" , "Get published list" , YDisk); + + NewTest(TestTable, "GV_GetAuthorizationLink" , "Get authorization link" , VSpace); + NewTest(TestTable, "GV_GetToken" , "Get token" , VSpace); + NewTest(TestTable, "GV_UpdateToken" , "Refresh token" , VSpace); + + NewTest(TestTable, "GC_GetCalendarList" , "Get list of calendars" , Calendar); + NewTest(TestTable, "GC_CreateDeleteCalendar" , "Create/Delete calendar" , Calendar); + NewTest(TestTable, "GC_CreateDeleteEvent" , "Create/Delete event" , Calendar); + NewTest(TestTable, "GC_GetEventList" , "Get list of events" , Calendar); + + NewTest(TestTable, "GD_GetCatalogList" , "Get list of directories" , Drive); + NewTest(TestTable, "GD_UploadDeleteFile" , "Upload/Delete file" , Drive); + NewTest(TestTable, "GD_CreateDeleteComment" , "Create/Delete Comment" , Drive); + NewTest(TestTable, "GD_CreateCatalog" , "Create/Delete catalog" , Drive); + + NewTest(TestTable, "GT_CreateTable" , "Create table" , Tables); + NewTest(TestTable, "GT_GetTable" , "Get table" , Tables); + NewTest(TestTable, "GT_FillClearCells" , "Fill/Clear cells" , Tables); + + NewTest(TestTable, "Twitter_GetAuthorizationLink" , "Get authorization link" , Twitter); + NewTest(TestTable, "Twitter_UpdateToken" , "Refresh token" , Twitter); + NewTest(TestTable, "Twitter_CreateTextTweet" , "Text tweet" , Twitter); + NewTest(TestTable, "Twitter_CreateTweetWithImage" , "Tweet with image" , Twitter); + NewTest(TestTable, "Twitter_CreateTweetWithVideo" , "Tweet with video" , Twitter); + NewTest(TestTable, "Twitter_CreateTweetWithGif" , "Tweet with gif" , Twitter); + NewTest(TestTable, "Twitter_CreateTweetWithPoll" , "Tweet with poll" , Twitter); + + NewTest(TestTable, "Viber_GetChannelInfo" , "Get channel info" , Viber); + NewTest(TestTable, "Viber_GetUserData" , "Get user data" , Viber); + NewTest(TestTable, "Viber_GetOnlineUsers" , "Get online users" , Viber); + NewTest(TestTable, "Viber_SendTextMessage" , "Send text message" , Viber); + NewTest(TestTable, "Viber_SendImage" , "Send image" , Viber); + NewTest(TestTable, "Viber_SendFile" , "SendFile" , Viber); + NewTest(TestTable, "Viber_SendContact" , "Send contact" , Viber); + NewTest(TestTable, "Viber_SendLocation" , "SendLocation" , Viber); + NewTest(TestTable, "Viber_SendLink" , "SendLink" , Viber); + + NewTest(TestTable, "Notion_CreatePage" , "Create page" , Notion); + NewTest(TestTable, "Notion_CreateEditDatabase" , "Create/Edit database" , Notion); + NewTest(TestTable, "Notion_GetPageInfo" , "Get page info" , Notion); + NewTest(TestTable, "Notion_GetDatabaseInfo" , "Get database info" , Notion); + NewTest(TestTable, "Notion_CreatePageInDatabase" , "Create page in database" , Notion); + NewTest(TestTable, "Notion_EditPageProperties" , "Edit page properties" , Notion); + NewTest(TestTable, "Notion_CreateDeleteBlock" , "Create/Delete block" , Notion); + NewTest(TestTable, "Notion_GetUsers" , "Get users" , Notion); + NewTest(TestTable, "Notion_GetUserData" , "Get user data" , Notion); + + NewTest(TestTable, "Slack_GetBotInfo" , "Get bot information" , Slack); + NewTest(TestTable, "Slack_GetUserList" , "Get user list" , Slack); + NewTest(TestTable, "Slack_GetRegionList" , "Get region list" , Slack); + NewTest(TestTable, "Slack_SendDeleteMessage" , "Send/Delete message" , Slack); + NewTest(TestTable, "Slack_SendDeleteEphemeral" , "Send/Delete ephemeral" , Slack); + NewTest(TestTable, "Slack_GetScheduledMessages" , "Get scheduled messages" , Slack); + NewTest(TestTable, "Slack_CreateArchiveChannel" , "Create/Archive channel" , Slack); + NewTest(TestTable, "Slack_GetChannelList" , "Get channel list" , Slack); + NewTest(TestTable, "Slack_OpenCloseDialog" , "Open/Close dialog" , Slack); + NewTest(TestTable, "Slack_GetFileList" , "Get list of files" , Slack); + NewTest(TestTable, "Slack_UploadDeleteFile" , "Upload/Delete file" , Slack); + NewTest(TestTable, "Slack_GetExternalFileList" , "Get external file list" , Slack); + NewTest(TestTable, "Slack_UploadDeleteExternalFile" , "Upload/Delete external file" , Slack); + + NewTest(TestTable, "AT_CreateDatabase" , "Create/Edit database" , AirT); + NewTest(TestTable, "AT_CreateTable" , "Create/Edit table" , AirT); + NewTest(TestTable, "AT_CreateField" , "Create/Edit field" , AirT); + NewTest(TestTable, "AT_CreateDeleteRecords" , "Create/Delete records" , AirT); + + NewTest(TestTable, "Dropbox_GetUpdateToken" , "Get/Update token" , Dropbox); + NewTest(TestTable, "Dropbox_UploadFile" , "Upload file" , Dropbox); + NewTest(TestTable, "Dropbox_UploadFileByURL" , "Upload file by URL" , Dropbox); + NewTest(TestTable, "Dropbox_CreateFolder" , "Create folder" , Dropbox); + NewTest(TestTable, "Dropbox_CreateDeleteTag" , "Create/Delete tag" , Dropbox); + NewTest(TestTable, "Dropbox_GetAccount" , "Get account data" , Dropbox); + NewTest(TestTable, "Dropbox_AccessManagement" , "Access management" , Dropbox); + + Return TestTable; + +EndFunction + +Function ExpectsThat(Value) Export + + Try + + Module = GetCommonModule("UTest"); + Awaiting = TypeValue(Module) = Type("CommonModule"); + Return Module.ExpectsThat(Value); + + Except + Return Awaiting.What(Value); + EndTry; + +EndFunction + +Function FormYAXTests() Export + + Module = GetCommonModule("UTTests"); + Sections = GetTestingSectionMapping(); + TestTable = GetTestTable(); + + For Each Section In Sections Do + + CurrentSection = Section.Key; + Filter = New Structure("Section", CurrentSection); + SectionTests = TestTable.FindLines(Filter); + + Set = Module.AddTestSet(CurrentSection); + + For Each Test In SectionTests Do + Set.AddServerTest(Test.Method, Test.Synonym); + EndDo; + + EndDo; + + Return ""; + +EndFunction + +Function FormAssertsTests() Export + + TestTable = GetTestTable(); + ArrayOfTests = New Array; + + For Each Test In TestTable Do + ArrayOfTests.Add(Test.Method); + EndDo; + + Return ArrayOfTests; + +EndFunction + +Function GetParameter(Parameter) Export + + Path = DataFilePath(); + Return GetValueFromFile(Parameter, Path); + +EndFunction + +Function GetBinary(Parameter) Export + + Path = DataFilePath(); + LocalParameter = Parameter + "Local"; + MainValue = GetValueFromFile(Parameter , Path); + LocalValue = GetValueFromFile(LocalParameter, Path); + + LocalFile = New File(LocalValue); + + If LocalFile.Exists() Then + Value = New BinaryData(LocalValue); + Else + Value = MainValue; + EndIf; + + If TypeValue(Value) = Type("String") Then + Value = GetFilePath(Value, LocalParameter); + EndIf; + + Return Value; + +EndFunction + +Function GetFilePath(Val Path, LocalParameter, Val SaveLocally = True) Export + + If StrFind(Path, "http") > 0 + Or StrFind(Path, "www") > 0 Then + + AndVF = GetTempFileName(); + CopyFile(Path, AndVF); + Path = AndVF; + Binary = New BinaryData(Path); + + If SaveLocally Then + WriteParameter(LocalParameter, AndVF); + Else + DeleteFiles(AndVF); + EndIf; + + Else + + Binary = New BinaryData(Path); + + EndIf; + + Return Binary; + +EndFunction + +Procedure ParameterToCollection(Parameter, Collection) Export + + Value = GetParameter(Parameter); + Collection.Insert(Parameter, Value); + +EndProcedure + +Procedure BinaryToCollection(Parameter, Collection) Export + + Value = GetBinary(Parameter); + Collection.Insert(Parameter, Value); + +EndProcedure + +Procedure WriteParameter(Parameter, Value) Export + + Path = DataFilePath(); + WriteParameterToFile(Parameter, Value, Path); + +EndProcedure + +Procedure WriteLog(Val Result, Val Method, Val Library = "") Export + + Header = String(OPI_Tools.GetCurrentDate()) + " | " + Method; + + Try + Data = OPI_Tools.JSONString(Result); + Except + Data = "Not JSON: " + String(Result); + EndTry; + + Data = " " + Data; + + Notify(Header); + Notify(Symbols.PS); + Notify(Data); + Notify(Symbols.PS); + Notify("---------------------------------"); + Notify(Symbols.PS); + + If ValueFilled(Library) Then + WriteLogFile(Data, Method, Library); + EndIf; + +EndProcedure + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function GetValueFromFile(Parameter, Path) + + Values = OPI_Tools.ReadJSONFile(Path); + Return ?(Values.Property(Parameter), Values[Parameter], ""); + +EndFunction + +Function DataFilePath() + + Path = ""; + PossiblePaths = New Array; + PossiblePaths.Add("./data.json"); + PossiblePaths.Add("C:\GDrive\My Drive\data.json"); + PossiblePaths.Add("D:\GD\My Drive\data.json"); + + For Each PossiblePath In PossiblePaths Do + + RepositoryFile = New File(PossiblePath); + + If RepositoryFile.Exists() Then + Path = PossiblePath; + EndIf; + + EndDo; + + Return Path; + +EndFunction + +Function GetCommonModule(Val Name) + УwithтаноinитьБезопаwithныйMode(True); + Module = Calculate(Name); + УwithтаноinитьБезопаwithныйMode(False); + Return Module; +EndFunction + +Procedure NewTest(ValueTable, Val Method, Val Synonym, Val Section) + + NewTest = ValueTable.Add(); + NewTest.Method = Method; + NewTest.Synonym = Synonym; + NewTest.Section = Section; + +EndProcedure + +Procedure WriteParameterToFile(Val Parameter, Val Value, Val Path) + + Values = OPI_Tools.ReadJSONFile(Path); + Values.Insert(Parameter, Value); + + Record = New WritingJSON; + JSONWriteParameters = New JSONWriteParameters(JSONLineBreak.Auto, Symbols.Tab); + Record.OpenFile(Path, , , JSONWriteParameters); + WriteJSON(Record, Values); + Record.Close(); + +EndProcedure + +Procedure WriteLogFile(Val Data, Val Method, Val Library) + + Try + + LogPath = "./docs/results"; + LibraryLogPath = LogPath + "/" + Library; + + LogDirectory = New File(LogPath); + + If Not LogDirectory.Exists() Then + CreateDirectory(LogPath); + EndIf; + + LibraryLogCatalog = New File(LibraryLogPath); + + If Not LibraryLogCatalog.Exists() Then + CreateDirectory(LibraryLogPath); + EndIf; + + FilePath = LibraryLogPath + "/" + Method + ".log"; + LogFile = New File(FilePath); + + If Not LogFile.Exists() Then + LogDocument = New TextDocument; + LogDocument.SetText(Data); + LogDocument.Write(FilePath); + EndIf; + + Except + Notify("Failed to write log file!: " + ErrorDescription()); + EndTry; + +EndProcedure + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo b/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo new file mode 100644 index 0000000000..60198d8e35 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="546edcad-c9a0-4823-a44c-fefd7200de6c"> + <name>OPI_GetTestData</name> + <synonym> + <key></key> + <value>OPI получение data tests</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl new file mode 100644 index 0000000000..3c3ddccd4d --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl @@ -0,0 +1,320 @@ +// Location OS: ./OInt/tools/Modules/OPI_TypeConversion.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 + +// #Use "./internal" + +#Region ServiceProgramInterface + +Procedure GetBinaryData(Value) Export + + If Value = Undefined Then + Return; + EndIf; + + Try + + If TypeValue(Value) = Type("BinaryData") Then + Return; + Else + + File = New File(Value); + + If File.Exists() Then + Value = New BinaryData(Value); + + ElsIf StrFind(Value, "//") Then + + Value = OPI_Tools.Get(Value); + + Else + + Value = Base64Value(Value); + + EndIf; + + EndIf; + + Except + Raise "Error getting binary data from parameter: " + ErrorDescription(); + EndTry; + +EndProcedure + +Procedure GetBinaryOrStream(Value) Export + + If Value = Undefined Then + Return; + EndIf; + + If TypeValue(Value) <> Type("String") Then + GetBinaryData(Value); + Return; + EndIf; + + File = New File(Value); + + If File.Exists() Then + Value = New FileStream(Value, FileOpenMode.Open); + Else + GetBinaryData(Value); + EndIf; + +EndProcedure + +Procedure GetCollection(Value) Export + + If Value = Undefined Then + Return; + EndIf; + + Try + + InitialValue = Value; + + If ThisIsCollection(Value) Then + Return; + Else + + If TypeValue(Value) = Type("BinaryData") Then + Value = GetStringFromBinaryData(Value); + Else + Value = OPI_Tools.NumberToString(Value); + EndIf; + + File = New File(Value); + ReadingJSON = New ReadingJSON; + + If File.Exists() Then + + ReadingJSON.OpenFile(Value); + + ElsIf StringStartsWith(nReg(Value), "http") Then + + AndVF = GetTempFileName(); + CopyFile(Value, AndVF); + ReadingJSON.OpenFile(AndVF); + ReadingJSON.Read(); + + DeleteFiles(AndVF); + + Else + + ReadingJSON.SetString(ShortLP(Value)); + + EndIf; + + Value = ReadJSON(ReadingJSON, True, Undefined, JSONDateFormat.ISO); + ReadingJSON.Close(); + + If (Not ThisIsCollection(Value)) Or Not ValueFilled(Value) Then + + Value = InitialValue; + GetArray(Value); + + EndIf; + + EndIf; + + Except + + Value = InitialValue; + GetArray(Value); + + EndTry; + +EndProcedure + +Procedure GetArray(Value) Export + + If TypeValue(Value) = Type("Array") Then + Return; + EndIf; + + If TypeValue(Value) = Type("String") + And StringStartsWith(Value, "[") + And StrEndsWith(Value, "]") Then + + CommaInQuotes = "','"; + + Value = StringReplace(Value, "['" , ""); + Value = StringReplace(Value, "']" , ""); + Value = StringReplace(Value, "', '" , CommaInQuotes); + Value = StringReplace(Value, "' , '", CommaInQuotes); + Value = StringReplace(Value, "' ,'" , CommaInQuotes); + + Value = StrSplit(Value, CommaInQuotes, False); + + For N = 0 For Value.WithinBoundary() Do + Value[N] = ShortLP(Value[N]); + EndDo; + + Else + + If TypeValue(Value) = Type("Number") Then + Value = OPI_Tools.NumberToString(Value); + EndIf; + + OPI_Tools.ValueToArray(Value); + + EndIf; + +EndProcedure + +Procedure GetBoolean(Value) Export + + If Value = Undefined Then + Return; + EndIf; + + Try + + If TypeValue(Value) = Type("Boolean") Then + Return; + Else + Value = Boolean(Value); + EndIf; + + Except + Raise "Error getting boolean data from parameter"; + EndTry; + +EndProcedure + +Procedure GetLine(Value, Val FromSource = False) Export + + If Value = Undefined Then + Return; + EndIf; + + Try + + If ThisIsSymbolic(Value) Then + + If Not FromSource Then + Value = OPI_Tools.NumberToString(Value); + Return; + EndIf; + + Value = OPI_Tools.NumberToString(Value); + File = New File(Value); + + If File.Exists() Then + + ReadingText = New ReadingText(Value); + Value = ReadingText.Read(); + ReadingText.Close(); + + ElsIf StringStartsWith(nReg(Value), "http") Then + + AndVF = GetTempFileName(); + CopyFile(Value, AndVF); + + ReadingText = New ReadingText(AndVF); + Value = ReadingText.Read(); + ReadingText.Close(); + + DeleteFiles(AndVF); + + Else + + Return; + + EndIf; + + ElsIf TypeValue(Value) = Type("BinaryData") Then + + Value = GetStringFromBinaryData(Value); + + ElsIf ThisIsCollection(Value) Then + + Value = OPI_Tools.JSONString(Value); + + Else + Return; + EndIf; + + Except + Value = String(Value); + Return; + EndTry; + +EndProcedure + +Procedure GetDate(Value) Export + + If Value = Undefined Then + Return; + EndIf; + + Date = "Date"; + + Try + + If TypeValue(Value) = Type(Date) Then + Return; + Else + Value = XMLValue(Type(Date), Value); + EndIf; + + Except + OOD = New TypeDescription(Date); + Value = OOD.ConvertValue(Value); + EndTry; + +EndProcedure + +Procedure GetNumber(Value) Export + + TypeDescription = New TypeDescription("Number"); + Value = TypeDescription.ConvertValue(Value); + +EndProcedure + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function ThisIsCollection(Val Value) + + Return TypeValue(Value) = Type("Array") + Or TypeValue(Value) = Type("Structure") + Or TypeValue(Value) = Type("Match"); + +EndFunction + +Function ThisIsSymbolic(Val Value) + + Return TypeValue(Value) = Type("String") + Or TypeValue(Value) = Type("Number") + Or TypeValue(Value) = Type("Date"); + +EndFunction + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo b/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo new file mode 100644 index 0000000000..e0e787b206 --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e15aee63-1565-4f37-ba54-4d4e79723fc5"> + <name>OPI_TypeConversion</name> + <synonym> + <key>ru</key> + <value>Преобразоinание typeоin (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl new file mode 100644 index 0000000000..70e6c2c9aa --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl @@ -0,0 +1,5307 @@ +// Location OS: ./OInt/tests/Modules/internal/OPI_Tests.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 + +// Test suite for YAxUnit + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UsingServiceTag-off +// BSLLS:UnusedParameters-off +// BSLLS:DuplicateStringLiteral-off + +// @skip-check undefined-variable +// @skip-check wrong-string-literal-content + +// Uncomment if OneScript is executed +// #Use oint +// #Use asserts + +#Region ServiceProgramInterface + +// For YAxUnit + +Procedure ExecutableScripts() Export + + OPI_GetTestData.FormYAXTests(); + +EndProcedure + +// For Asserts + +Function GetTestList(UnitTesting) Export + + Return OPI_GetTestData.FormAssertsTests(); + +EndFunction + +#Region RunnableTests + +#Region Telegram + +Procedure Telegram_GetBotInfo() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters); + + Telegram_GetBotInformation(TestParameters); + +EndProcedure + +Procedure Telegram_GetUpdates() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters); + + Telegram_DeleteWebhook(TestParameters); + Telegram_GetUpdates(TestParameters); + +EndProcedure + +Procedure Telegram_SetWebhook() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_URL" , TestParameters); + + Telegram_SetWebhook(TestParameters); + Telegram_DeleteWebhook(TestParameters); + +EndProcedure + +Procedure Telegram_SendTextMessage() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + + Telegram_SendTextMessage(TestParameters); + +EndProcedure + +Procedure Telegram_SendImage() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + OPI_GetTestData.ParameterToCollection("Picture" , TestParameters); + + Telegram_SendPicture(TestParameters); + Telegram_DownloadFile(TestParameters); + +EndProcedure + +Procedure Telegram_SendVideo() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + OPI_GetTestData.ParameterToCollection("Video" , TestParameters); + + Telegram_SendVideo(TestParameters); + Telegram_DownloadFile(TestParameters); + +EndProcedure + +Procedure Telegram_SendAudio() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + OPI_GetTestData.ParameterToCollection("Audio" , TestParameters); + + Telegram_SendAudio(TestParameters); + Telegram_DownloadFile(TestParameters); + +EndProcedure + +Procedure Telegram_SendDocument() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + OPI_GetTestData.ParameterToCollection("Document" , TestParameters); + + Telegram_SendDocument(TestParameters); + +EndProcedure + +Procedure Telegram_SendGIF() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + OPI_GetTestData.ParameterToCollection("GIF" , TestParameters); + + Telegram_SendGif(TestParameters); + +EndProcedure + +Procedure Telegram_SendMediaGroup() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + OPI_GetTestData.ParameterToCollection("Picture" , TestParameters); + OPI_GetTestData.ParameterToCollection("Video" , TestParameters); + + Telegram_SendMediaGroup(TestParameters); + +EndProcedure + +Procedure Telegram_SendLocation() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("Long" , TestParameters); + OPI_GetTestData.ParameterToCollection("Lat" , TestParameters); + + Telegram_SendLocation(TestParameters); + +EndProcedure + +Procedure Telegram_SendContact() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + OPI_GetTestData.ParameterToCollection("Name" , TestParameters); + OPI_GetTestData.ParameterToCollection("Surname" , TestParameters); + OPI_GetTestData.ParameterToCollection("Phone" , TestParameters); + + Telegram_SendContact(TestParameters); + +EndProcedure + +Procedure Telegram_SendPoll() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + + Telegram_SendPoll(TestParameters); + +EndProcedure + +Procedure Telegram_ForwardMessage() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelMessageID", TestParameters); + + Telegram_ForwardMessage(TestParameters); + +EndProcedure + +Procedure Telegram_BanUnban() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChatID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID" , TestParameters); + + Telegram_Ban(TestParameters); + Telegram_Unban(TestParameters); + +EndProcedure + +Procedure Telegram_CreateInvitationLink() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + + Telegram_CreateInviteLink(TestParameters); + +EndProcedure + +Procedure Telegram_PinUnpinMessage() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelMessageID", TestParameters); + + Telegram_PinMessage(TestParameters); + Telegram_UnpinMessage(TestParameters); + +EndProcedure + +Procedure Telegram_GetMemberCount() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters); + + Telegram_GetParticipantCount(TestParameters); + +EndProcedure + +Procedure Telegram_GetForumAvatarsList() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters); + + Telegram_GetForumAvatarList(TestParameters); + +EndProcedure + +Procedure Telegram_CreateDeleteForumTopic() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ForumID", TestParameters); + OPI_GetTestData.ParameterToCollection("Picture" , TestParameters); + OPI_GetTestData.ParameterToCollection("String" , TestParameters); + + Telegram_CreateForumTopic(TestParameters); + Telegram_EditForumTopic(TestParameters); + Telegram_CloseForumTopic(TestParameters); + Telegram_OpenForumTopic(TestParameters); + Telegram_ClearPinnedMessagesList(TestParameters); + Telegram_DeleteForumTopic(TestParameters); + +EndProcedure + +Procedure Telegram_HideShowMainTopic() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ForumID", TestParameters); + + Telegram_HideMainForumTopic(TestParameters); + Telegram_ShowMainForumTopic(TestParameters); + +EndProcedure + +Procedure Telegram_ChangeMainTopicName() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Telegram_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Telegram_ForumID", TestParameters); + + Telegram_ChangeMainTopicName(TestParameters); + +EndProcedure + +#EndRegion + +#Region VK + +Procedure VK_CreateTokenLink() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("VK_AppID", TestParameters); + + VK_CreateTokenRetrievalLink(TestParameters); + +EndProcedure + +Procedure VK_CreateDeletePost() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Picture" , TestParameters); + OPI_GetTestData.ParameterToCollection("Picture2", TestParameters); + + VK_CreatePost(TestParameters); + VK_DeletePost(TestParameters); + +EndProcedure + +Procedure VK_CreateCompositePost() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Picture" , TestParameters); + OPI_GetTestData.ParameterToCollection("Video" , TestParameters); + + VK_CreateCompositePost(TestParameters); + +EndProcedure + +Procedure VK_CreatePoll() Export + + VK_CreatePoll(); + +EndProcedure + +Procedure VK_SaveDeleteImage() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Picture" , TestParameters); + + VK_CreateAlbum(TestParameters); + VK_SavePictureToAlbum(TestParameters); + VK_DeleteImage(TestParameters); + VK_DeleteAlbum(TestParameters); + +EndProcedure + +Procedure VK_CreateStory() Export + + TestParameters = New Match; + OPI_GetTestData.ParameterToCollection("Picture" , TestParameters); + + VK_CreateStory(TestParameters); + +EndProcedure + +Procedure VK_DiscussionMethods() Export + + TestParameters = New Structure; + Parameters = GetVKParameters(); + + VK_CreateDiscussion(TestParameters); + VK_CloseDiscussion(TestParameters); + VK_OpenDiscussion(TestParameters); + VK_PostToDiscussion(TestParameters); + + OPI_VK.CloseDiscussion(TestParameters["VK_ConvID"], True, Parameters); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_LikeRepostComment() Export + + Parameters = GetVKParameters(); + Text = "Post from autotest"; + Message = "Message from autotest"; + TypeMatch = Type("Match"); + TypeNumber = Type("Number"); + Response = "response"; + + Result = OPI_VK.CreatePost(Text, New Array, , , Parameters); + + PostID = Result[Response]["post_id"]; + Result = OPI_VK.LikePost(PostID, , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "LikePost"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled(); + OPI_GetTestData.ExpectsThat(Result[Response]["likes"]).HasType(TypeNumber).Filled(); + + ExternalPost = 2571; + ExternalWall = -218704372; + + Result = OPI_VK.MakeRepost(ExternalPost, ExternalWall, , , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "MakeRepost"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled(); + OPI_GetTestData.ExpectsThat(Result[Response]["success"]).HasType(TypeNumber).Equal(1); + OPI_GetTestData.ExpectsThat(Result[Response]["wall_repost_count"]).HasType(TypeNumber).Equal(1); + + Result = OPI_VK.WriteComment(PostID, Parameters["owner_id"], Message, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "WriteComment"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled(); + OPI_GetTestData.ExpectsThat(Result[Response]["comment_id"]).HasType(TypeNumber).Filled(); + + OPI_VK.DeletePost(PostID, Parameters); + OPI_VK.DeletePost(Result[Response]["post_id"], Parameters); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_GetStatistics() Export + + CurrentDate = OPI_Tools.GetCurrentDate(); + Parameters = GetVKParameters(); + Date0 = StartOfDay(CurrentDate); + Date1 = EndOfDay(Date0); + TypeMatch = Type("Match"); + + Result = OPI_VK.GetStatistics(Date0, Date1, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetStatistics"); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled(); + OPI_GetTestData.ExpectsThat(Result["response"][0]["visitors"]).HasType(TypeMatch).Filled(); + OPI_GetTestData.ExpectsThat(Result["response"][0]["reach"]).HasType(TypeMatch).Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_GetPostStatistics() Export + + Parameters = GetVKParameters(); + + ArrayOfPosts = New Array; + ArrayOfPosts.Add(214); + ArrayOfPosts.Add(215); + + Result = OPI_VK.GetPostStatistics(ArrayOfPosts, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetPostStatistics"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Array").HasLength(2); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CreateAdCampaign() Export + + Parameters = GetVKParameters(); + CabinetID = OPI_GetTestData.GetParameter("VK_AdsCabinetID"); + Name = "TestCampaign"; + TypeMatch = Type("Match"); + TypeNumber = Type("Number"); + Response = "response"; + UID = "id"; + + Result = OPI_VK.CreateAdvertisingCampaign(CabinetID, Name, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateAdvertisingCampaign"); + + Result = Result[Response][0]; + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result["error_code"]).HasType(TypeNumber).Equal(602); + OPI_GetTestData.ExpectsThat(Result[UID]).HasType(TypeNumber).Filled(); + + CampaignID = Result[UID]; + CategoryID = 126; + Limit = 150; + + Result = OPI_VK.CreatePost(Name, New Array, , , Parameters); + PostID = Result[Response]["post_id"]; + + Result = OPI_VK.CreateAd(CampaignID + , Limit + , CategoryID + , PostID + , CabinetID + , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateAd"); + + Result = Result[Response][0]; + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result["error_code"]).HasType(TypeNumber).Equal(602); + OPI_GetTestData.ExpectsThat(Result[UID]).HasType(TypeNumber).Filled(); + + AnnouncementID = Result[UID]; + Result = OPI_VK.PauseAdvertisingAd(CabinetID, AnnouncementID, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "PauseAdvertisingAd"); + + Result = Result[Response][0]; + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[UID]).HasType(TypeNumber).Filled(); + + OPI_VK.DeletePost(PostID, Parameters); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_SendMessage() Export + + Parameters = GetVKParameters(); + User = OPI_GetTestData.GetParameter("VK_UserID"); + Token = OPI_GetTestData.GetParameter("VK_CommunityToken"); + Text = "Message from autotest"; + + ButtonArray = New Array; + ButtonArray.Add("Button 1"); + ButtonArray.Add("Button 2"); + + Keyboard = OPI_VK.FormKeyboard(ButtonArray); + Result = OPI_VK.WriteMessage(Text, User, Token, Keyboard, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "WriteMessage"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match"); + OPI_GetTestData.ExpectsThat(Result["response"]).HasType("Number").Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_GetProductCategories() Export + + Parameters = GetVKParameters(); + Result = OPI_VK.GetProductCategoryList(Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetProductCategoryList"); + + OPI_GetTestData.ExpectsThat(Result) + .HasType("Match") + .Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CreateProductSelection() Export + + Parameters = GetVKParameters(); + TypeMatch = Type("Match"); + TypeNumber = Type("Number"); + Response = "response"; + Image = OPI_GetTestData.GetBinary("Picture"); + AndVF = GetTempFileName("png"); + Image.Write(AndVF); + + Result = OPI_VK.CreateProductCollection("TestCollection" + , Image + , True + , False + , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateProductCollection"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]["albums_count"]).HasType(TypeNumber).Filled(); + OPI_GetTestData.ExpectsThat(Result[Response]["market_album_id"]).HasType(TypeNumber).Filled(); + + SelectionID = Result[Response]["market_album_id"]; + + Result = OPI_VK.EditProductCollection("EditedCollection", SelectionID, , , , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditProductCollection"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]).HasType(TypeNumber).Equal(1); + + ImageArray = New Array; + ImageArray.Add(OPI_GetTestData.GetBinary("Picture")); + ImageArray.Add(OPI_GetTestData.GetBinary("Picture2")); + + Product = New Match(); + Product.Insert("Name" , "TestProduct"); + Product.Insert("Description" , "Product description"); + Product.Insert("Category" , "20173"); + Product.Insert("Price" , 1); + Product.Insert("OldPrice" , 15); + Product.Insert("MainPhoto" , Image); + Product.Insert("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Product.Insert("AdditionalPhotos" , ImageArray); + Product.Insert("MainInGroup" , True); + Product.Insert("Width" , 20); + Product.Insert("Height" , 30); + Product.Insert("Depth" , 40); + Product.Insert("Weight" , 100); + Product.Insert("SKU" , "12345"); + Product.Insert("AvailableBalance" , "10"); + + Result = OPI_VK.AddProduct(Product, SelectionID, Parameters); // Adding product + + // !OInt OPI_GetTestData.WriteLog(Result, "AddProduct"); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]["market_item_id"]).HasType(TypeNumber).Filled(); + + ProductID = Result[Response]["market_item_id"]; + + Product = New Match; + Product.Insert("Name", "EditedTestProduct"); + + Result = OPI_VK.EditProduct(ProductID, Product, , Parameters); // Change product + + // !OInt OPI_GetTestData.WriteLog(Result, "EditProduct"); + + Check_VKTrue(Result); + + Result = OPI_VK.AddProductToSelection(ProductID, SelectionID, Parameters); // Adding in selection + + // !OInt OPI_GetTestData.WriteLog(Result, "AddProductToSelection"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]).HasType(TypeNumber).Filled(); + + Result = OPI_VK.RemoveProductFromSelection(ProductID, SelectionID, Parameters); // Deletes from selections + + // !OInt OPI_GetTestData.WriteLog(Result, "RemoveProductFromSelection"); + + OPI_Tools.Pause(5); + Check_VKTrue(Result); + + Result = OPI_VK.DeleteProduct(ProductID, Parameters); // Deletion product + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteProduct"); + + OPI_Tools.Pause(5); + Check_VKTrue(Result); + + Result = OPI_VK.DeleteSelection(SelectionID, Parameters); // Removal selections + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteSelection"); + + OPI_Tools.Pause(5); + Check_VKTrue(Result); + + DeleteFiles(AndVF); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CreateProductWithProperties() Export + + Parameters = GetVKParameters(); + TypeMatch = Type("Match"); + TypeNumber = Type("Number"); + MII = "market_item_id"; + Response = "response"; + Yellow = "Yellow"; + Red = "Red"; + Image = OPI_GetTestData.GetBinary("Picture"); + AndVF = GetTempFileName("png"); + Image.Write(AndVF); + + OptionArray = New Array; + OptionArray.Add(Yellow); + OptionArray.Add("Blue"); + OptionArray.Add(Red); + + Result = OPI_VK.CreateProductProperty("Color", Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateProductProperty"); + + OPI_Tools.Pause(5); + + Property = Result[Response]["property_id"]; + Property = OPI_Tools.NumberToString(Property); + + PropertyMatch = New Match; + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]["property_id"]).HasType(TypeNumber).Filled(); + + Result = OPI_VK.EditProductProperty("Color (fromм.)", Property, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditProductProperty"); + + OPI_Tools.Pause(5); + + Check_VKTrue(Result); + + For Each Option In OptionArray Do + + Result = OPI_VK.AddProductPropertyVariant(Option, Property, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "AddProductPropertyVariant"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]["variant_id"]).HasType(TypeNumber).Filled(); + + VariantID = Result[Response]["variant_id"]; + PropertyMatch.Insert(Option, VariantID); + + Result = OPI_VK.EditProductPropertyVariant(Option + String(New UniqueIdentifier()) + , Property + , VariantID + , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditProductPropertyVariant"); + + Check_VKTrue(Result); + + EndDo; + + ImageArray = New Array; + ImageArray.Add(AndVF); + ImageArray.Add(Image); + + Product = New Match(); + Product.Insert("Name" , "TestProduct (" + Yellow + ")"); + Product.Insert("Description" , "Product description"); + Product.Insert("Category" , "20173"); + Product.Insert("Price" , 1); + Product.Insert("OldPrice" , 15); + Product.Insert("MainPhoto" , Image); + Product.Insert("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Product.Insert("AdditionalPhotos" , ImageArray); + Product.Insert("MainInGroup" , True); + Product.Insert("GroupNumber" , Undefined); + Product.Insert("Width" , 20); + Product.Insert("Height" , 30); + Product.Insert("Depth" , 40); + Product.Insert("Weight" , 100); + Product.Insert("SKU" , 12345); + Product.Insert("AvailableBalance" , "10"); + Product.Insert("PropertyValues" , PropertyMatch[Yellow]); + + Result = OPI_VK.AddProduct(Product, , Parameters); // Adding product + + // !OInt OPI_GetTestData.WriteLog(Result, "AddProduct"); + + OPI_Tools.Pause(5); + + YellowID = Result[Response]["market_item_id"]; + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response][MII]).HasType(TypeNumber).Filled(); + + Product.Insert("Name" , "TestProduct (" + Red + ")"); + Product.Insert("PropertyValues", PropertyMatch[Red]); + + Result = OPI_VK.AddProduct(Product, , Parameters); // Adding product + + // !OInt OPI_GetTestData.WriteLog(Result, "AddProduct"); + + OPI_Tools.Pause(5); + + RedID = Result[Response][MII]; + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response][MII]).HasType(TypeNumber).Filled(); + + Array of products = New Array; + Array of products.Add(YellowID); + Array of products.Add(RedID); + + Result = OPI_VK.GetProductsByID(Array of products, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetProductsByID"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]["items"]).HasType("Array").HasLength(2); + + Result = OPI_VK.GroupProducts(Array of products, , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GroupProducts"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Response]["item_group_id"]).HasType(TypeNumber).Filled(); + + OPI_VK.DeleteProduct(YellowID , Parameters); + OPI_VK.DeleteProduct(RedID, Parameters); + + For Each Option In PropertyMatch Do + + Deletion = OPI_VK.DeleteProductPropertyVariant(Option.Value, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteProductPropertyVariant"); + + OPI_Tools.Pause(5); + Check_VKTrue(Deletion); + + EndDo; + + Deletion = OPI_VK.DeleteProductProperty(Property, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteProductProperty"); + + OPI_Tools.Pause(5); + + Check_VKTrue(Deletion); + + DeleteFiles(AndVF); + +EndProcedure + +Procedure VK_GetProductList() Export + + Parameters = GetVKParameters(); + Image = OPI_GetTestData.GetBinary("Picture"); + + ImageArray = New Array; + ImageArray.Add(Image); + + Product = New Match(); + Product.Insert("Name" , "TestProduct2"); + Product.Insert("Description" , "Product description"); + Product.Insert("Category" , "20173"); + Product.Insert("Price" , 1); + Product.Insert("OldPrice" , 15); + Product.Insert("MainPhoto" , Image); + Product.Insert("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Product.Insert("AdditionalPhotos" , ImageArray); + Product.Insert("MainInGroup" , True); + Product.Insert("GroupNumber" , Undefined); + Product.Insert("Width" , 20); + Product.Insert("Height" , 30); + Product.Insert("Depth" , 40); + Product.Insert("Weight" , 100); + Product.Insert("SKU" , 12345); + Product.Insert("AvailableBalance" , "10"); + + Result = OPI_VK.AddProduct(Product, , Parameters); + ProductID = Result["response"]["market_item_id"]; + OPI_Tools.Pause(5); + + Result = OPI_VK.GetProductList(, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetProductList"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result) + .HasType("Array").Filled(); + + OPI_VK.DeleteProduct(ProductID, Parameters); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_GetSelectionList() Export + + Parameters = GetVKParameters(); + Image = OPI_GetTestData.GetBinary("Picture"); + Result = OPI_VK.CreateProductCollection("TestCollection" + , Image + , True + , False + , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateProductCollection"); + + SelectionID = Result["response"]["market_album_id"]; + Result = OPI_VK.GetSelectionList(Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetSelectionList"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result) + .HasType("Array").Filled(); + + OPI_VK.DeleteSelection(SelectionID, Parameters); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_GetPropertyList() Export + + Parameters = GetVKParameters(); + Result = OPI_VK.GetPropertyList(Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetPropertyList"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result) + .HasType("Array").Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_GetOrderList() Export + + Parameters = GetVKParameters(); + Result = OPI_VK.GetOrderList(Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetOrderList"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result) + .HasType("Array").Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_UploadVideo() Export + + Parameters = GetVKParameters(); + Video = OPI_GetTestData.GetParameter("Video"); + Name = "NewVideo"; + Description = "Video description"; + + Result = OPI_VK.UploadVideoToServer(Video, Name, Description, , Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetOrderList"); + + OPI_GetTestData.ExpectsThat(Result["video_id"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["video_hash"]).Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +#EndRegion + +#Region YandexDisk + +Procedure YDisk_GetDiskInfo() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Match = "Match"; + + Result = OPI_YandexDisk.GetDiskInformation(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetDiskInformation"); + + OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled(); + OPI_GetTestData.ExpectsThat(Result["system_folders"]).HasType(Match); + OPI_GetTestData.ExpectsThat(Result["user"]).HasType(Match); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_CreateFolder() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Path = "/" + String(New UniqueIdentifier); + + Result = OPI_YandexDisk.CreateFolder(Token, Path); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateFolder"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["type"]).Equal("dir"); + OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + Path); + + OPI_YandexDisk.DeleteObject(Token, Path, False); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_UploadByUrlAndGetObject() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Path = "/" + String(New UniqueIdentifier) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.UploadFileByURL(Token, Path, URL); + OPI_Tools.Pause(5); + + Result = OPI_YandexDisk.GetObject(Token, Path); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetObject"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file"); + OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + Path); + + OPI_YandexDisk.DeleteObject(Token, Path, False); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_UploadDeleteFile() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Path = "/" + String(New UniqueIdentifier) + ".png"; + Image = OPI_GetTestData.GetBinary("Picture"); + AndVF = GetTempFileName("png"); + Image.Write(AndVF); + + Result = OPI_YandexDisk.UploadFile(Token, Path, Image, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile"); + + Check_Empty(Result); + OPI_Tools.Pause(5); + + Result = OPI_YandexDisk.DeleteObject(Token, Path, False); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject"); + + Check_Empty(Result); + + Result = OPI_YandexDisk.UploadFile(Token, Path, AndVF, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile"); + + Check_Empty(Result); + OPI_Tools.Pause(5); + + Result = OPI_YandexDisk.DeleteObject(Token, Path, False); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject"); + + Check_Empty(Result); + + DeleteFiles(AndVF); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_CreateObjectCopy() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + OriginalPath = "/" + String(New UniqueIdentifier) + ".png"; + CopyPath = "/" + String(New UniqueIdentifier) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/" + + "OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.UploadFileByURL(Token, OriginalPath, URL); + OPI_Tools.Pause(5); + + Result = OPI_YandexDisk.CreateObjectCopy(Token, OriginalPath, CopyPath, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateObjectCopy"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file"); + OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + CopyPath); + + OPI_YandexDisk.DeleteObject(Token, OriginalPath, False); + OPI_YandexDisk.DeleteObject(Token, CopyPath, False); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_GetDownloadLink() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Path = "/" + String(New UniqueIdentifier) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.UploadFileByURL(Token, Path, URL); + OPI_Tools.Pause(5); + + Result = OPI_YandexDisk.GetDownloadLink(Token, Path); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetDownloadLink"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["method"]).Equal("GET"); + OPI_GetTestData.ExpectsThat(Result["href"]).HasType("String").Filled(); + + URL = Result["href"]; + + Result = OPI_YandexDisk.DownloadFile(Token, Path); + + OPI_GetTestData.ExpectsThat(Result).HasType("BinaryData").Filled(); + + OPI_YandexDisk.DeleteObject(Token, Path, False); + +EndProcedure + +Procedure YDisk_GetFileList() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Quantity = 2; + Indent = 1; + + Result = OPI_YandexDisk.GetFilesList(Token, Quantity, Indent, "image"); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetFilesList"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["limit"]).Equal(Quantity); + OPI_GetTestData.ExpectsThat(Result["offset"]).Equal(Indent); + OPI_GetTestData.ExpectsThat(Result["items"]).HasType("Array"); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_MoveObject() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + OriginalPath = "/" + String(New UniqueIdentifier) + ".png"; + CopyPath = "/" + String(New UniqueIdentifier) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/" + + "OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.UploadFileByURL(Token, OriginalPath, URL); + OPI_Tools.Pause(15); + + Result = OPI_YandexDisk.MoveObject(Token, OriginalPath, CopyPath, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "MoveObject"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file"); + OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + CopyPath); + + OPI_YandexDisk.DeleteObject(Token, OriginalPath, False); + OPI_YandexDisk.DeleteObject(Token, CopyPath, False); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_PublicObjectActions() Export + + PUrl = "public_url"; + Match = "Match"; + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Path = "/" + String(New UniqueIdentifier) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.UploadFileByURL(Token, Path, URL); + OPI_Tools.Pause(5); + + ResultArray = New Array; + + ResultArray.Add(OPI_YandexDisk.PublishObject(Token, Path)); + PublicURL = ResultArray[0][PUrl]; + + Result = OPI_YandexDisk.GetDownloadLinkForPublicObject(Token, PublicURL); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetDownloadLinkForPublicObject"); + + OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled(); + OPI_GetTestData.ExpectsThat(Result["method"]).Equal("GET"); + OPI_GetTestData.ExpectsThat(Result["href"]).HasType("String").Filled(); + + Result = OPI_YandexDisk.GetPublicObject(Token, PublicURL); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetPublicObject"); + + OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled(); + OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file"); + OPI_GetTestData.ExpectsThat(Result["path"]).Equal("/"); + + ResultArray.Add(OPI_YandexDisk.SavePublicObjectToDisk(Token, PublicURL)); + + ResultArray.Add(OPI_YandexDisk.CancelObjectPublication(Token, Path)); + + Counter = 0; + For Each Result In ResultArray Do + + // !OInt OPI_GetTestData.WriteLog(Result, "PublicationChange"); + + OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled(); + OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file"); + OPI_GetTestData.ExpectsThat(Result["path"]).Filled(); + + If Counter = 0 Then + OPI_GetTestData.ExpectsThat(Result[PUrl]).HasType("String").Filled(); + Else + OPI_GetTestData.ExpectsThat(Result[PUrl]).HasType("Undefined"); + EndIf; + + Counter = Counter + 1; + + EndDo; + + OPI_YandexDisk.DeleteObject(Token, Path, False); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure YDisk_GetPublishedList() Export + + Token = OPI_GetTestData.GetParameter("YandexDisk_Token"); + Quantity = 2; + Indent = 1; + + Result = OPI_YandexDisk.GetPublishedObjectsList(Token, Quantity, Indent); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetPublishedObjectsList"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["limit"]).Equal(Quantity); + OPI_GetTestData.ExpectsThat(Result["offset"]).Equal(Indent); + OPI_GetTestData.ExpectsThat(Result["items"]).HasType("Array"); + + OPI_Tools.Pause(5); + +EndProcedure + +#EndRegion + +#Region Viber + +Procedure Viber_GetChannelInfo() Export + + Token = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + Result = OPI_Viber.GetChannelInformation(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelInformation"); + + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_GetUserData() Export + + Token = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + User = OPI_GetTestData.GetParameter("Viber_ChannelAdminID"); + Result = OPI_Viber.GetUserData(Token, User); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetUserData"); + + OPI_GetTestData.ExpectsThat(Result["chat_hostname"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["status_message"]).Filled(); + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_GetOnlineUsers() Export + + Token = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + User = OPI_GetTestData.GetParameter("Viber_UserID"); + Result = OPI_Viber.GetOnlineUsers(Token, User); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetOnlineUsers"); + + OPI_GetTestData.ExpectsThat(Result["users"]).HasType("Array"); + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_SendTextMessage() Export + + Text = "TestMessage"; + ChannelToken = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + BotToken = OPI_GetTestData.GetParameter("Viber_Token"); + User = OPI_GetTestData.GetParameter("Viber_UserID"); + Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID"); + + ButtonArray = New Array; + ButtonArray.Add("Button 1"); + ButtonArray.Add("Button 2"); + ButtonArray.Add("Button 3"); + + Keyboard = OPI_Viber.CreateKeyboardFromArrayButton(ButtonArray); + + Result = OPI_Viber.SendTextMessage(BotToken, Text, User, False, Keyboard); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + Result = OPI_Viber.SendTextMessage(ChannelToken, Text, Administrator, True, Keyboard); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_SendImage() Export + + Text = "TestMessage"; + Image = OPI_GetTestData.GetParameter("Picture"); + ChannelToken = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + BotToken = OPI_GetTestData.GetParameter("Viber_Token"); + User = OPI_GetTestData.GetParameter("Viber_UserID"); + Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID"); + + Result = OPI_Viber.SendImage(BotToken, Image, User, False, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendImage"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + Result = OPI_Viber.SendImage(ChannelToken, Image, Administrator, True, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendImage"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_SendFile() Export + + Document = OPI_GetTestData.GetParameter("Document"); + ChannelToken = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + BotToken = OPI_GetTestData.GetParameter("Viber_Token"); + User = OPI_GetTestData.GetParameter("Viber_UserID"); + Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID"); + + Result = OPI_Viber.SendFile(BotToken, Document, User, False, "docx"); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendFile"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + Result = OPI_Viber.SendFile(ChannelToken, Document, Administrator, True, "docx"); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendFile"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_SendContact() Export + + Name = "Petr Petrov"; + Phone = "+123456789"; + ChannelToken = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + BotToken = OPI_GetTestData.GetParameter("Viber_Token"); + User = OPI_GetTestData.GetParameter("Viber_UserID"); + Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID"); + + Result = OPI_Viber.SendContact(BotToken, Name, Phone, User, False); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendContact"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + Result = OPI_Viber.SendContact(ChannelToken, Name, Phone, Administrator, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendContact"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_SendLocation() Export + + Latitude = "48.87373649724122"; + Longitude = "2.2954639195323967"; + ChannelToken = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + BotToken = OPI_GetTestData.GetParameter("Viber_Token"); + User = OPI_GetTestData.GetParameter("Viber_UserID"); + Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID"); + + Result = OPI_Viber.SendLocation(BotToken, Latitude, Longitude, User, False); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + Result = OPI_Viber.SendLocation(ChannelToken, Latitude, Longitude, Administrator, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Viber_SendLink() Export + + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + ChannelToken = OPI_GetTestData.GetParameter("Viber_ChannelToken"); + BotToken = OPI_GetTestData.GetParameter("Viber_Token"); + User = OPI_GetTestData.GetParameter("Viber_UserID"); + Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID"); + + Result = OPI_Viber.SendLink(BotToken, URL, User, False); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendLink"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + Result = OPI_Viber.SendLink(ChannelToken, URL, Administrator, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendLink"); + + OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled(); + Check_ViberOk(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +#EndRegion + +#Region GoogleWorkspace + +Procedure GV_GetAuthorizationLink() Export + + ClientID = OPI_GetTestData.GetParameter("Google_ClientID"); + Result = OPI_GoogleWorkspace.FormCodeRetrievalLink(ClientID); + + OPI_GetTestData.ExpectsThat(Result) + .HasType("String") + .Filled(); + + OPI_GetTestData.WriteParameter("Google_Link", Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure GV_GetToken() Export + + ClientID = OPI_GetTestData.GetParameter("Google_ClientID"); + ClientSecret = OPI_GetTestData.GetParameter("Google_ClientSecret"); + Code = OPI_GetTestData.GetParameter("Google_Code"); + + Result = OPI_GoogleWorkspace.GetTokenByCode(ClientID, ClientSecret, Code); + + If ValueFilled(Result["access_token"]) + And ValueFilled(Result["refresh_token"]) Then + + OPI_GetTestData.WriteParameter("Google_Token" , Result["access_token"]); + OPI_GetTestData.WriteParameter("Google_Refresh", Result["refresh_token"]); + + EndIf; + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure GV_UpdateToken() Export + + ClientID = OPI_GetTestData.GetParameter("Google_ClientID"); + ClientSecret = OPI_GetTestData.GetParameter("Google_ClientSecret"); + RefreshToken = OPI_GetTestData.GetParameter("Google_Refresh"); + + Result = OPI_GoogleWorkspace.RefreshToken(ClientID, ClientSecret, RefreshToken); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match"); + OPI_GetTestData.ExpectsThat(Result["access_token"]).Filled(); + + OPI_GetTestData.WriteParameter("Google_Token", Result["access_token"]); + + OPI_Tools.Pause(5); + +EndProcedure + +#EndRegion + +#Region GoogleCalendar + +Procedure GC_GetCalendarList() Export + + Token = OPI_GetTestData.GetParameter("Google_Token"); + Result = OPI_GoogleCalendar.GetCalendarList(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetCalendarList"); + + OPI_GetTestData.ExpectsThat(Result) + .HasType("Array"); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure GC_CreateDeleteCalendar() Export + + Token = OPI_GetTestData.GetParameter("Google_Token"); + Name = "TestCalendar"; + Description = "TestDescription"; + EditedName = Name + " (fromм.)"; + TypeMatch = Type("Match"); + TypeString = Type("String"); + Summary = "summary"; + Black = "#000000"; + Yellow = "#ffd800"; + + Result = OPI_GoogleCalendar.CreateCalendar(Token, Name); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateCalendar"); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Summary]).Equal(Name); + OPI_GetTestData.ExpectsThat(Result["id"]).HasType(TypeString).Filled(); + + Calendar = Result["id"]; + + Result = OPI_GoogleCalendar.EditCalendarMetadata(Token + , Calendar + , EditedName + , Description); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditCalendarMetadata"); + + Check_GKObject(Result, EditedName, Description); + + Result = OPI_GoogleCalendar.GetCalendarMetadata(Token, Calendar); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetCalendarMetadata"); + + Check_GKObject(Result, EditedName, Description); + + Result = OPI_GoogleCalendar.AddCalendarToList(Token, Calendar); + + // !OInt OPI_GetTestData.WriteLog(Result, "AddCalendarToList"); + + Check_GKObject(Result, EditedName, Description); + + Result = OPI_GoogleCalendar.EditListCalendar(Token, Calendar, Black, Yellow, False); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditListCalendar"); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Summary]).Equal(EditedName); + OPI_GetTestData.ExpectsThat(Result["foregroundColor"]).Equal(Black); + OPI_GetTestData.ExpectsThat(Result["backgroundColor"]).Equal(Yellow); + + Result = OPI_GoogleCalendar.GetListCalendar(Token, Calendar); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetListCalendar"); + + OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); + OPI_GetTestData.ExpectsThat(Result[Summary]).Equal(EditedName); + OPI_GetTestData.ExpectsThat(Result["foregroundColor"]).Equal(Black); + OPI_GetTestData.ExpectsThat(Result["backgroundColor"]).Equal(Yellow); + + Result = OPI_GoogleCalendar.ClearMainCalendar(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "ClearMainCalendar"); + + Check_Empty(Result); + + Result = OPI_GoogleCalendar.DeleteCalendarFromList(Token, Calendar); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteCalendarFromList"); + + Check_Empty(Result); + + Result = OPI_GoogleCalendar.DeleteCalendar(Token, Calendar); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteCalendar"); + + Check_Empty(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure GC_CreateDeleteEvent() Export + + CurrentDate = OPI_Tools.GetCurrentDate(); + Token = OPI_GetTestData.GetParameter("Google_Token"); + Calendar = OPI_GetTestData.GetParameter("Google_CalendarID"); + Name = "New event"; + Description = "TestEventDescription"; + EditedDescription = "TestEventDescription (fromм.)"; + UID = "id"; + Hour = 3600; + + Attachments = New Match; + + Attachments.Insert("Image1" + , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); + Attachments.Insert("Image2" + , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); + + EventMatch = New Match; + EventMatch.Insert("Description" , Description); + EventMatch.Insert("Title" , Name); + EventMatch.Insert("Venue" , "InOffice"); + EventMatch.Insert("StartDate" , CurrentDate); + EventMatch.Insert("EndDate" , EventMatch["StartDate"] + Hour); + EventMatch.Insert("ArrayOfAttachmentURLs" , Attachments); + EventMatch.Insert("SendNotifications" , True); + + Result = OPI_GoogleCalendar.CreateEvent(Token, Calendar, EventMatch); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateEvent"); + + Event = Result[UID]; + + Check_GKObject(Result, Name, Description); + + EventMatch = New Match; + EventMatch.Insert("Description", EditedDescription); + + Result = OPI_GoogleCalendar.EditEvent(Token, Calendar, EventMatch, Event); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditEvent"); + + Check_GKObject(Result, Name, EditedDescription); + + Result = OPI_GoogleCalendar.GetEvent(Token, Calendar, Event); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetEvent"); + + Check_GKObject(Result, Name, EditedDescription); + + Result = OPI_GoogleCalendar.MoveEvent(Token, Calendar, Calendar, Event); + + // !OInt OPI_GetTestData.WriteLog(Result, "MoveEvent"); + + Check_GKObject(Result, Name, EditedDescription); + + Result = OPI_GoogleCalendar.DeleteEvent(Token, Calendar, Event); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteEvent"); + + Check_Empty(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure GC_GetEventList() Export + + Token = OPI_GetTestData.GetParameter("Google_Token"); + Calendar = OPI_GetTestData.GetParameter("Google_CalendarID"); + + Result = OPI_GoogleCalendar.GetEventList(Token, Calendar); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetEventList"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Array"); + + OPI_Tools.Pause(5); + +EndProcedure + +#EndRegion + +#Region GoogleDrive + +Procedure GD_GetCatalogList() Export + + MimeType = "mimeType"; + Name = "name"; + Name = "TestFolder"; + Token = OPI_GetTestData.GetParameter("Google_Token"); + Result = OPI_GoogleDrive.GetDirectoriesList(Token, Name, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetDirectoriesList"); + + Result = Result[0]; + + OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array"); + OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal("application/vnd.google-apps.folder"); + OPI_GetTestData.ExpectsThat(Result[Name]).Filled(); + + OPI_Tools.Pause(5); + Identifier = Result["id"]; + + OPI_GetTestData.WriteParameter("GD_Catalog", Identifier); + + Result = OPI_GoogleDrive.GetObjectInformation(Token, Identifier); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetObjectInformation"); + + OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal("application/vnd.google-apps.folder"); + OPI_GetTestData.ExpectsThat(Result[Name]).Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure GD_UploadDeleteFile() Export + + ExtraBytes = 2; + + Kind = "kind"; + Content = "content"; + MIME = "MIME"; + MimeType = "mimeType"; + Name = "name"; + Id_ = "id"; + + ArrayOfDeletions = New Array; + Token = OPI_GetTestData.GetParameter("Google_Token"); + Image = OPI_GetTestData.GetBinary("Picture"); + ReplacementImage = OPI_GetTestData.GetBinary("Picture2"); + Directory = OPI_GetTestData.GetParameter("GD_Catalog"); + + Description = OPI_GoogleDrive.GetFileDescription(); + Description.Insert("Parent", Directory); + + Result = OPI_GoogleDrive.UploadFile(Token, Image, Description); + + // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile"); + + OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal(Description[MIME]); + OPI_GetTestData.ExpectsThat(Result[Name]).Equal(Description["Name"]); + + Identifier = Result[Id_]; + ArrayOfDeletions.Add(Identifier); + + NewName = "CopiedFile.jpeg"; + Result = OPI_GoogleDrive.CopyObject(Token, Identifier, NewName, "root"); + + // !OInt OPI_GetTestData.WriteLog(Result, "CopyObject"); + + OPI_Tools.Pause(5); + + OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal(Description[MIME]); + OPI_GetTestData.ExpectsThat(Result[Name]).Equal(NewName); + + ArrayOfDeletions.Add(Result[Id_]); + + Result = OPI_GoogleDrive.DownloadFile(Token, Identifier); + + // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFile"); + + OPI_GetTestData.ExpectsThat(Result.Size()).Equal(Image.Size() + ExtraBytes); + OPI_Tools.Pause(5); + + NewName = "UpdatedFile.jpg"; + Result = OPI_GoogleDrive.UpdateFile(Token, Identifier, ReplacementImage, NewName); + + // !OInt OPI_GetTestData.WriteLog(Result, "UpdateFile"); + + OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal(Description[MIME]); + OPI_GetTestData.ExpectsThat(Result[Name]).Equal(NewName); + + OPI_Tools.Pause(5); + + Comment = "Yo"; + Result = OPI_GoogleDrive.CreateComment(Token, Identifier, Comment); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateComment"); + + OPI_GetTestData.ExpectsThat(Result[Content]).Equal(Comment); + OPI_GetTestData.ExpectsThat(Result[Kind]).Equal("drive#comment"); + + OPI_Tools.Pause(5); + + For Each Deletable In ArrayOfDeletions Do + Result = OPI_GoogleDrive.DeleteObject(Token, Deletable); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject"); + + OPI_GetTestData.ExpectsThat(ValueFilled(Result)).Equal(False); + OPI_Tools.Pause(2); + EndDo; + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure GD_CreateDeleteComment() Export + + Kind = "kind"; + Content = "content"; + Id_ = "id"; + Comments = "comments"; + Token = OPI_GetTestData.GetParameter("Google_Token"); + Directory = OPI_GetTestData.GetParameter("GD_Catalog"); + Image = OPI_GetTestData.GetBinary("Picture"); + + Description = OPI_GoogleDrive.GetFileDescription(); + Description.Insert("Parent", Directory); + + Result = OPI_GoogleDrive.UploadFile(Token, Image, Description); + Identifier = Result[Id_]; + + Comment = "NewComment"; + ResultArray = New Array; + Result = OPI_GoogleDrive.CreateComment(Token, Identifier, Comment); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateComment"); + + CommentID = Result[Id_]; + + ResultArray.Add(Result); + + Result = OPI_GoogleDrive.GetComment(Token, Identifier, CommentID); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetComment"); + + ResultArray.Add(Result); + + Result = OPI_GoogleDrive.GetCommentList(Token, Identifier); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetCommentList"); + + Comments = Result[Comments]; + CommentObject = Comments[Comments.WithinBoundary()]; + + ResultArray.Add(CommentObject); + + For Each Result In ResultArray Do + OPI_GetTestData.ExpectsThat(Result[Content]).Equal(Comment); + OPI_GetTestData.ExpectsThat(Result[Kind]).Equal("drive#comment"); + EndDo; + + Result = OPI_GoogleDrive.DeleteComment(Token, Identifier, CommentID); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteComment"); + + OPI_GetTestData.ExpectsThat(ValueFilled(Result)).Equal(False); + + OPI_GoogleDrive.DeleteObject(Token, Identifier); + +EndProcedure + +Procedure GD_CreateCatalog() Export + + Name = "name"; + Name = "TestFolder"; + Token = OPI_GetTestData.GetParameter("Google_Token"); + Directory = OPI_GetTestData.GetParameter("GD_Catalog"); + + ResultArray = New Array; + + ResultArray.Add(OPI_GoogleDrive.CreateFolder(Token, Name)); + ResultArray.Add(OPI_GoogleDrive.CreateFolder(Token, Name, Directory)); + + For Each Result In ResultArray Do + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateFolder"); + + CatalogID = Result["id"]; + + OPI_GetTestData.ExpectsThat(Result[Name]).Equal(Name); + + OPI_GoogleDrive.DeleteObject(Token, CatalogID); + + EndDo; + +EndProcedure + +#EndRegion + +#Region GoogleSheets + +Procedure GT_CreateTable() Export + + Token = OPI_GetTestData.GetParameter("Google_Token"); + Name = "TestTable"; + + SheetArray = New Array; + SheetArray.Add("Sheet1"); + SheetArray.Add("Sheet2"); + + Result = OPI_GoogleSheets.CreateBook(Token, Name, SheetArray); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateBook"); + + OPI_GetTestData.ExpectsThat(Result["properties"]["title"]).Equal(Name); + + For N = 0 For SheetArray.WithinBoundary() Do + + SheetName = Result["sheets"][N]["properties"]["title"]; + OPI_GetTestData.ExpectsThat(SheetName).Equal(SheetArray[N]); + Sheet = Result["sheets"][N]["properties"]["sheetId"]; + Sheet = OPI_Tools.NumberToString(Sheet); + + EndDo; + + Book = Result["spreadsheetId"]; + + OPI_GetTestData.WriteParameter("GS_Spreadsheet", Book); + OPI_GetTestData.WriteParameter("GS_Sheet" , Sheet); + + Result = OPI_GoogleSheets.CreateBook(Token, Name, SheetArray); + Book2 = Result["spreadsheetId"]; + + Result = OPI_GoogleSheets.CopySheet(Token, Book, Book2, Sheet); + + // !OInt OPI_GetTestData.WriteLog(Result, "CopySheet"); + + OPI_GetTestData.ExpectsThat(Result["title"]).Equal(SheetName + " (toопия)"); + + Name = "TestSheet"; + + Result = OPI_GoogleSheets.AddSheet(Token, Book, Name); + + // !OInt OPI_GetTestData.WriteLog(Result, "AddSheet"); + + NewSheet = Result["replies"][0]["addSheet"]["properties"]["sheetId"]; + NewSheet = OPI_Tools.NumberToString(NewSheet); + + OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); + + Result = OPI_GoogleSheets.DeleteSheet(Token, Book, NewSheet); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteSheet"); + + OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); + + Name = "TestTable (fromм.)"; + + Result = OPI_GoogleSheets.EditBookTitle(Token, Book, Name); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditBookTitle"); + + OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); + +EndProcedure + +Procedure GT_GetTable() Export + + Token = OPI_GetTestData.GetParameter("Google_Token"); + Book = OPI_GetTestData.GetParameter("GS_Spreadsheet"); + Name = "TestTable (fromм.)"; + + Result = OPI_GoogleSheets.GetBook(Token, Book); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetTable"); + + OPI_GetTestData.ExpectsThat(Result["properties"]["title"]).Equal(Name); + +EndProcedure + +Procedure GT_FillClearCells() Export + + Token = OPI_GetTestData.GetParameter("Google_Token"); + Book = OPI_GetTestData.GetParameter("GS_Spreadsheet"); + Sheet = "Sheet2"; + + CellStructure = New Match; + CellStructure.Insert("A1", "ThisIsA1"); + CellStructure.Insert("A2", "ThisIsA2"); + CellStructure.Insert("B2", "ThisIsB2"); + CellStructure.Insert("B3", "ThisIsB3"); + CellStructure.Insert("A3", "ThisIsA3"); + CellStructure.Insert("A4", "ThisIsA4"); + CellStructure.Insert("B1", "ThisIsB1"); + CellStructure.Insert("B4", "ThisIsB4"); + + Cell array = New Array; + Cell array.Add("B2"); + Cell array.Add("A3"); + Cell array.Add("B4"); + + Result = OPI_GoogleSheets.SetCellValues(Token, Book, CellStructure, Sheet); + + // !OInt OPI_GetTestData.WriteLog(Result, "SetCellValues"); + + OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); + OPI_GetTestData.ExpectsThat(Result["totalUpdatedCells"]).Equal(CellStructure.Quantity()); + + Result = OPI_GoogleSheets.GetCellValues(Token, Book, Cell array, Sheet); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetCellValues"); + + OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); + OPI_GetTestData.ExpectsThat(Result["valueRanges"].Quantity()).Equal(Cell array.Quantity()); + + Result = OPI_GoogleSheets.GetCellValues(Token, Book, , Sheet); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetCellValues"); + + OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); + + Cell array = New Array; + Cell array.Add("B2"); + Cell array.Add("A3"); + Cell array.Add("B4"); + + Result = OPI_GoogleSheets.ClearCells(Token, Book, Cell array, Sheet); + + // !OInt OPI_GetTestData.WriteLog(Result, "ClearCells"); + + OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); + OPI_GetTestData.ExpectsThat(Result["clearedRanges"].Quantity()).Equal(Cell array.Quantity()); + +EndProcedure + +#EndRegion + +#Region Twitter + +Procedure Twitter_GetAuthorizationLink() Export + + Parameters = GetTwitterParameters(); + Result = OPI_Twitter.GetAuthorizationLink(Parameters); + + OPI_GetTestData.ExpectsThat(Result).HasType("String").Filled(); + + OPI_GetTestData.WriteParameter("Twitter_URL", Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Twitter_UpdateToken() Export + + Parameters = GetTwitterParameters(); + Result = OPI_Twitter.RefreshToken(Parameters); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["access_token"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["refresh_token"]).Filled(); + + Refresh = Result["refresh_token"]; + Token = Result["access_token"]; + + If ValueFilled(Refresh) And Not Refresh = "null" Then + OPI_GetTestData.WriteParameter("Twitter_Refresh", Refresh); + EndIf; + + If ValueFilled(Token) And Not Token = "null" Then + OPI_GetTestData.WriteParameter("Twitter_Token" , Token); + EndIf; + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Twitter_CreateTextTweet() Export + + Parameters = GetTwitterParameters(); + Text = "TestTweet" + String(New UniqueIdentifier); + + Result = OPI_Twitter.CreateTextTweet(Text, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateTextTweet"); + + Check_TwitterText(Result, Text); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Twitter_CreateTweetWithImage() Export + + Parameters = GetTwitterParameters(); + Text = "TestTweet" + String(New UniqueIdentifier); + Image = OPI_GetTestData.GetBinary("Picture"); + AndVF = GetTempFileName("png"); + Image.Write(AndVF); + + Result = OPI_Twitter.Create image tweet(Text, Image, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "Create image tweet"); + + Check_TwitterText(Result, Text); + + Result = OPI_Twitter.Create image tweet(Text, AndVF, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "Create image tweet"); + + Check_TwitterText(Result, Text); + + DeleteFiles(AndVF); + + OPI_Tools.Pause(20); + +EndProcedure + +Procedure Twitter_CreateTweetWithVideo() Export + + Parameters = GetTwitterParameters(); + Text = "TestTweet" + String(New UniqueIdentifier); + Video = OPI_GetTestData.GetBinary("Video"); + AndVF = GetTempFileName("mp4"); + Video.Write(AndVF); + + Result = OPI_Twitter.CreateVideoTweet(Text, Video, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateVideoTweet"); + + Check_TwitterText(Result, Text); + + Result = OPI_Twitter.CreateVideoTweet(Text, AndVF, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateVideoTweet"); + + Check_TwitterText(Result, Text); + + DeleteFiles(AndVF); + + OPI_Tools.Pause(20); + +EndProcedure + +Procedure Twitter_CreateTweetWithGif() Export + + Parameters = GetTwitterParameters(); + Text = "TestTweet" + String(New UniqueIdentifier); + GIF = OPI_GetTestData.GetBinary("GIF"); + AndVF = GetTempFileName("gif"); + GIF.Write(AndVF); + + Result = OPI_Twitter.CreateGifTweet(Text, GIF, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateGifTweet"); + + Check_TwitterText(Result, Text); + + Result = OPI_Twitter.CreateGifTweet(Text, AndVF, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateGifTweet"); + + Check_TwitterText(Result, Text); + + DeleteFiles(AndVF); + + OPI_Tools.Pause(20); + +EndProcedure + +Procedure Twitter_CreateTweetWithPoll() Export + + Parameters = GetTwitterParameters(); + Text = "TestTweet" + String(New UniqueIdentifier); + AnswersArray = New Array; + AnswersArray.Add("Option 1"); + AnswersArray.Add("Option 2"); + + Result = OPI_Twitter.CreatePollTweet(Text, AnswersArray, 60, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePollTweet"); + + Check_TwitterText(Result, Text); + + OPI_Tools.Pause(20); + +EndProcedure + +#EndRegion + +#Region Notion + +Procedure Notion_CreatePage() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Parent = OPI_GetTestData.GetParameter("Notion_Parent"); + Title = "TestTitle"; + + Result = OPI_Notion.CreatePage(Token, Parent, Title); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePage"); + + Check_NotionObject(Result); + +EndProcedure + +Procedure Notion_CreateEditDatabase() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Parent = OPI_GetTestData.GetParameter("Notion_Parent"); + Title = "TestTitle"; + + Properties = New Match; + Properties.Insert("Name" , "title"); + Properties.Insert("Description" , "rich_text"); + Properties.Insert("Number" , "number"); + Properties.Insert("Status" , "status"); + Properties.Insert("CreationDate" , "date"); + Properties.Insert("Image" , "files"); + Properties.Insert("Active" , "checkbox"); + Properties.Insert("Website" , "url"); + Properties.Insert("Email" , "email"); + Properties.Insert("Phone" , "phone_number"); + Properties.Insert("User" , "people"); + + ValueSelection = New Match; + ValueSelection.Insert("New", "green"); + ValueSelection.Insert("InProgress", "yellow"); + ValueSelection.Insert("Remote", "red"); + Properties.Insert("Status", ValueSelection); + + Result = OPI_Notion.CreateDatabase(Token, Parent, Title, Properties); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateDatabase"); + + Check_NotionObject(Result, "database"); + + Base = Result["id"]; + Title = "TestTitle"; + Description = "TestDescription"; + + Properties = New Match; + Properties.Insert("Email", "rich_text"); // Type fields "Email" will changed with email to text + Properties.Insert("Website"); // Field "Website" will deleted + + Result = OPI_Notion.EditDatabaseProperties(Token, Base, Properties, Title, Description); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditDatabaseProperties"); + + Check_NotionObject(Result, "database"); + +EndProcedure + +Procedure Notion_GetPageInfo() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Page = OPI_GetTestData.GetParameter("Notion_Page"); + + Result = OPI_Notion.GetPage(Token, Page); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetPage"); + + Check_NotionObject(Result); + +EndProcedure + +Procedure Notion_GetDatabaseInfo() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Base = OPI_GetTestData.GetParameter("Notion_Base"); + + Result = OPI_Notion.GetDatabase(Token, Base); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetDatabase"); + + Check_NotionObject(Result, "database"); + +EndProcedure + +Procedure Notion_CreatePageInDatabase() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Base = OPI_GetTestData.GetParameter("Notion_Base"); + + Image = New Match; + Image.Insert("Logo", OPI_GetTestData.GetParameter("Picture")); + + Properties = New Match; + Properties.Insert("Name" , "LLC Vector"); + Properties.Insert("Description" , "OurFirstClient"); + Properties.Insert("Number" , 1); + Properties.Insert("Status" , "Regular"); + Properties.Insert("CreationDate" , OPI_Tools.GetCurrentDate()); + Properties.Insert("Image" , Image); + Properties.Insert("Active" , True); + Properties.Insert("Website" , "https://vector.ru"); + Properties.Insert("Email" , "mail@vector.ru"); + Properties.Insert("Phone" , "88005553535"); + Properties.Insert("Status" , "New"); + + Result = OPI_Notion.CreatePageInDatabase(Token, Base, Properties); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePageInDatabase"); + + Check_NotionObject(Result); + + Parent = StringReplace(Result["parent"]["database_id"], "-", ""); + OPI_GetTestData.ExpectsThat(Parent).Equal(Base); + +EndProcedure + +Procedure Notion_EditPageProperties() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Page = OPI_GetTestData.GetParameter("Notion_Page"); + Icon = OPI_GetTestData.GetParameter("Picture"); + Cover = OPI_GetTestData.GetParameter("Picture2"); + Archive = False; + + Properties = New Match; + Properties.Insert("Active" , False); + Properties.Insert("Email" , "vector@mail.ru"); + + Result = OPI_Notion.EditPageProperties(Token + , Page + , Properties + , Icon + , Cover + , Archive); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditPageProperties"); + + Check_NotionObject(Result); + +EndProcedure + +Procedure Notion_CreateDeleteBlock() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Parent = OPI_GetTestData.GetParameter("Notion_Parent"); + Block = OPI_GetTestData.GetParameter("Notion_Block"); + + Result = OPI_Notion.ReturnBlock(Token, Block); + + // !OInt OPI_GetTestData.WriteLog(Result, "ReturnBlock"); + + Check_NotionObject(Result, "block"); + + Result = OPI_Notion.CreateBlock(Token, Parent, Result); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateBlock"); + + Check_NotionObject(Result, "list"); + + Block = Result["results"][0]["id"]; + Result = OPI_Notion.ReturnChildBlocks(Token, Block); + + // !OInt OPI_GetTestData.WriteLog(Result, "ReturnChildBlocks"); + + Check_NotionObject(Result, "list"); + + Result = OPI_Notion.DeleteBlock(Token, Block); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteBlock"); + + Check_NotionObject(Result, "block"); + +EndProcedure + +Procedure Notion_GetUsers() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + Result = OPI_Notion.UserList(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "UserList"); + + Check_NotionObject(Result, "list"); + +EndProcedure + +Procedure Notion_GetUserData() Export + + Token = OPI_GetTestData.GetParameter("Notion_Token"); + User = OPI_GetTestData.GetParameter("Notion_User"); + Result = OPI_Notion.GetUserData(Token, User); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetUserData"); + + Check_NotionObject(Result, "user"); + +EndProcedure + +#EndRegion + +#Region Slack + +Procedure Slack_GetBotInfo() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Result = OPI_Slack.GetBotInformation(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetBotInformation"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["bot_id"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["user_id"]).Filled(); + +EndProcedure + +Procedure Slack_GetUserList() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Result = OPI_Slack.GetUserList(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetUserList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["members"]).HasType("Array"); + +EndProcedure + +Procedure Slack_GetRegionList() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Result = OPI_Slack.GetWorkspaceList(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetWorkspaceList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["teams"]).HasType("Array"); + +EndProcedure + +Procedure Slack_SendDeleteMessage() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Channel = OPI_GetTestData.GetParameter("Slack_Channel"); + Text = "TestMessage1"; + Text2 = "TestMessage2"; + Tags = New Array; + Image = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; + + Result = OPI_Slack.SendMessage(Token, Channel, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["ts"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["message"]["text"]).Equal(Text); + + Timestamp = Result["ts"]; + + Result = OPI_Slack.EditMessage(Token, Channel, Timestamp, Text2); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditMessage"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["ts"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["message"]["text"]).Equal(Text2); + + Result = OPI_Slack.GetMessageReplyList(Token, Channel, Timestamp); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetMessageReplyList"); + + OPI_GetTestData.ExpectsThat(Result["messages"]).HasType("Array"); + + Result = OPI_Slack.GetMessageLink(Token, Channel, Timestamp); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetMessageLink"); + + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["permalink"]).Filled(); + + Check_SlackOk(Result); + + Tags.Add(Timestamp); + + BlockArray = New Array; + Block = OPI_Slack.GenerateImageBlock(Image, "Yo"); + BlockArray.Add(Block); + + Result = OPI_Slack.SendMessage(Token, Channel, Text, , BlockArray); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (toартинtoа)"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["ts"]).Filled(); + + Tags.Add(Result["ts"]); + + Block = OPI_Slack.GenerateImageBlock(Image, "Yo"); + JSONBlock = OPI_Tools.JSONString(Block); + + AndVF = GetTempFileName("json"); + + TextDocument = New TextDocument(); + TextDocument.SetText(JSONBlock); + TextDocument.Write(AndVF); + + Result = OPI_Slack.SendMessage(Token, Channel, Text, , AndVF); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (json)"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["ts"]).Filled(); + + Tags.Add(Result["ts"]); + + Blocks = "['" + AndVF + "','" + AndVF + "']"; + Result = OPI_Slack.SendMessage(Token, Channel, Text, , Blocks); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (json маwithwithиin)"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["ts"]).Filled(); + + Tags.Add(Result["ts"]); + + DeleteFiles(AndVF); + + For Each Timestamp In Tags Do + + Result = OPI_Slack.DeleteMessage(Token, Channel, Timestamp); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteMessage"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["ts"]).Filled(); + + EndDo; + + Hour = 3600; + Day = 24; + Sending = OPI_Tools.GetCurrentDate() + (Day * Hour); + Result = OPI_Slack.SendMessage(Token, Channel, Text, Sending); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (отложенное)"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel); + OPI_GetTestData.ExpectsThat(Result["scheduled_message_id"]).Filled(); + + Timestamp = Result["scheduled_message_id"]; + Result = OPI_Slack.DeleteMessage(Token, Channel, Timestamp, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteMessage"); + + Check_SlackOk(Result); + +EndProcedure + +Procedure Slack_SendDeleteEphemeral() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Channel = OPI_GetTestData.GetParameter("Slack_Channel"); + User = OPI_GetTestData.GetParameter("Slack_User"); + Image = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; + Text = "TestMessage1"; + + Block = OPI_Slack.GenerateImageBlock(Image, "Yo"); + Result = OPI_Slack.SendEphemeralMessage(Token, Channel, Text, User, Block); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["message_ts"]).Filled(); + +EndProcedure + +Procedure Slack_GetScheduledMessages() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Channel = OPI_GetTestData.GetParameter("Slack_Channel"); + + Result = OPI_Slack.GetDelayedMessageList(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetDelayedMessageList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["scheduled_messages"]).HasType("Array"); + +EndProcedure + +Procedure Slack_CreateArchiveChannel() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + User = OPI_GetTestData.GetParameter("Slack_User"); + Name = "testconv" + String(New UniqueIdentifier); + Topic = "TestTopic"; + Purpose = "TestGoal"; + + #Region CreateChannel + Result = OPI_Slack.CreateChannel(Token, Name); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateChannel"); + + Data = Result["channel"]; + Channel = Data["id"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name); + #EndRegion + + #Region SetChannelTopic + Result = OPI_Slack.SetChannelTopic(Token, Channel, Topic); + + // !OInt OPI_GetTestData.WriteLog(Result, "SetChannelTopic"); + + Data = Result["channel"]; + Channel = Data["id"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name); + OPI_GetTestData.ExpectsThat(Data["topic"]["value"]).Equal(Topic); + #EndRegion + + #Region SetChannelGoal + Result = OPI_Slack.SetChannelGoal(Token, Channel, Purpose); + + // !OInt OPI_GetTestData.WriteLog(Result, "SetChannelGoal"); + + Check_SlackOk(Result); + #EndRegion + + #Region GetChannel + Result = OPI_Slack.GetChannel(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetChannel"); + + Data = Result["channel"]; + Channel = Data["id"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name); + #EndRegion + + #Region InviteUsersToChannel + Result = OPI_Slack.InviteUsersToChannel(Token, Channel, User); + + // !OInt OPI_GetTestData.WriteLog(Result, "InviteUsersToChannel"); + + Data = Result["channel"]; + Channel = Data["id"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name); + #EndRegion + + #Region KickUserFromChannel + Result = OPI_Slack.KickUserFromChannel(Token, Channel, User); + + // !OInt OPI_GetTestData.WriteLog(Result, "KickUserFromChannel"); + + Check_SlackOk(Result); + #EndRegion + + #Region GetChannelHistory + Result = OPI_Slack.GetChannelHistory(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelHistory"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["messages"]).HasType("Array"); + #EndRegion + + #Region GetChannelUserList + Result = OPI_Slack.GetChannelUserList(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelUserList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["members"]).HasType("Array"); + #EndRegion + + #Region LeaveChannel + Result = OPI_Slack.LeaveChannel(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "LeaveChannel"); + + Check_SlackOk(Result); + #EndRegion + + #Region JoinChannel + Result = OPI_Slack.JoinChannel(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "JoinChannel"); + + Data = Result["channel"]; + Channel = Data["id"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name); + #EndRegion + + #Region RenameChannel + NewName = "testconv" + String(New UniqueIdentifier); + Result = OPI_Slack.RenameChannel(Token, Channel, NewName); + + // !OInt OPI_GetTestData.WriteLog(Result, "RenameChannel"); + + Data = Result["channel"]; + Channel = Data["id"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Data["name"]).Equal(NewName); + #EndRegion + + #Region ArchiveChannel + Result = OPI_Slack.ArchiveChannel(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "ArchiveChannel"); + + Check_SlackOk(Result); + #EndRegion + +EndProcedure + +Procedure Slack_GetChannelList() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + + Result = OPI_Slack.GetChannelList(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channels"]).HasType("Array"); + +EndProcedure + +Procedure Slack_OpenCloseDialog() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + User = OPI_GetTestData.GetParameter("Slack_User"); + Text = "Yo, dude"; + + Result = OPI_Slack.OpenDialog(Token, User); + + // !OInt OPI_GetTestData.WriteLog(Result, "OpenDialog"); + + Dialog = Result["channel"]["id"]; + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["channel"]).HasType("Match"); + OPI_GetTestData.ExpectsThat(Dialog).Filled(); + + Result = OPI_Slack.SendMessage(Token, Dialog, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage"); + + Check_SlackOk(Result); + + Result = OPI_Slack.CloseDialog(Token, Dialog); + + // !OInt OPI_GetTestData.WriteLog(Result, "CloseDialog"); + + Check_SlackOk(Result); + +EndProcedure + +Procedure Slack_GetFileList() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Channel = OPI_GetTestData.GetParameter("Slack_Channel"); + + Result = OPI_Slack.GetFilesList(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetFilesList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array"); + +EndProcedure + +Procedure Slack_UploadDeleteFile() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + File = OPI_GetTestData.GetBinary("Document"); + Channel = OPI_GetTestData.GetParameter("Slack_Channel"); + ArrayOfFiles = New Array; + FileName = "megadoc.docx"; + Title = "NewFile"; + + Result = OPI_Slack.UploadFile(Token, File, FileName, Title); + + // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile"); + + UploadedFile = Result["files"][0]; + ArrayOfFiles.Add(UploadedFile["id"]); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(UploadedFile["name"]).Equal(FileName); + + Result = OPI_Slack.UploadFile(Token, File, FileName, Title, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile (in toаtoл)"); + + UploadedFile = Result["files"][0]; + ArrayOfFiles.Add(UploadedFile["id"]); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(UploadedFile["name"]).Equal(FileName); + + Result = OPI_Slack.GetFileData(Token, UploadedFile["id"]); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetFile"); + + UploadedFile = Result["file"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(UploadedFile["name"]).Equal(FileName); + + For Each UploadedFile In ArrayOfFiles Do + + Result = OPI_Slack.DeleteFile(Token, UploadedFile); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteFile"); + + Check_SlackOk(Result); + + EndDo; + +EndProcedure + +Procedure Slack_GetExternalFileList() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + Channel = OPI_GetTestData.GetParameter("Slack_Channel"); + + Result = OPI_Slack.GetExternalFileList(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetExternalFileList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array"); + + Result = OPI_Slack.GetExternalFileList(Token, Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetExternalFileList"); + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array"); + +EndProcedure + +Procedure Slack_UploadDeleteExternalFile() Export + + Token = OPI_GetTestData.GetParameter("Slack_Token"); + File = OPI_GetTestData.GetParameter("Document"); + Channel = OPI_GetTestData.GetParameter("Slack_Channel"); + Title = "NewFile"; + + Result = OPI_Slack.AddExternalFile(Token, File, Title); + + // !OInt OPI_GetTestData.WriteLog(Result, "AddExternalFile"); + + UploadedFile = Result["file"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(UploadedFile["title"]).Equal(Title); + + Result = OPI_Slack.GetExternalFile(Token, UploadedFile["id"]); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetExternalFile"); + + UploadedFile = Result["file"]; + + Check_SlackOk(Result); + OPI_GetTestData.ExpectsThat(UploadedFile["title"]).Equal(Title); + + Result = OPI_Slack.SendExternalFile(Token, UploadedFile["id"], Channel); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendExternalFile"); + + Check_SlackOk(Result); + + Result = OPI_Slack.DeleteExternalFile(Token, UploadedFile["id"]); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendExternalFile"); + + Check_SlackOk(Result); + +EndProcedure + +#EndRegion + +#Region Airtable + +Procedure AT_CreateDatabase() Export + + Token = OPI_GetTestData.GetParameter("Airtable_Token"); + Region = OPI_GetTestData.GetParameter("Airtable_Workspace"); + Name = "TestDatabase"; + + FieldArray = New Array; + FieldArray.Add(OPI_Airtable.GetNumberField("Number")); + FieldArray.Add(OPI_Airtable.GetStringField("String")); + + TableName = "TestTable"; + + TableMapping = New Match; + TableMapping.Insert(TableName, FieldArray); + + Result = OPI_Airtable.CreateDatabase(Token, Region, Name, TableMapping); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateDatabase"); + + OPI_GetTestData.ExpectsThat(Result["id"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["tables"][0]["name"]).Equal(TableName); + + Base = Result["id"]; + OPI_GetTestData.WriteParameter("Airtable_Base", Base); + + Result = OPI_Airtable.GetDatabaseTables(Token, Base); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetDatabaseTables"); + + OPI_GetTestData.ExpectsThat(Result["tables"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["tables"]).HasType("Array"); + + Result = OPI_Airtable.GetListOfBases(Token); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetListOfBases"); + + OPI_GetTestData.ExpectsThat(Result["bases"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["bases"]).HasType("Array"); + +EndProcedure + +Procedure AT_CreateTable() Export + + Token = OPI_GetTestData.GetParameter("Airtable_Token"); + Base = OPI_GetTestData.GetParameter("Airtable_Base"); + + FieldArray = New Array; + FieldArray.Add(OPI_Airtable.GetNumberField("Number")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[0], "GetNumberField"); + + FieldArray.Add(OPI_Airtable.GetStringField("String")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[1], "GetStringField"); + + FieldArray.Add(OPI_Airtable.GetAttachmentField("Attachment")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[2], "GetAttachmentField"); + + FieldArray.Add(OPI_Airtable.GetCheckboxField("Checkbox")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[3], "GetCheckboxField"); + + FieldArray.Add(OPI_Airtable.GetDateField("Date")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[4], "GetDateField"); + + FieldArray.Add(OPI_Airtable.GetPhoneField("Phone")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[5], "GetPhoneField"); + + FieldArray.Add(OPI_Airtable.GetEmailField("Email")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[6], "GetEmailField"); + + FieldArray.Add(OPI_Airtable.GetLinkField("Link")); + // !OInt OPI_GetTestData.WriteLog(FieldArray[7], "GetLinkField"); + + TableName = "TestTable2"; + Description = "NewTable"; + + Result = OPI_Airtable.CreateTable(Token, Base, TableName, FieldArray, Description); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateTable"); + + OPI_GetTestData.ExpectsThat(Result["name"]).Equal(TableName); + OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description); + + Table = Result["id"]; + TableName = "TestTable2 (fromм.)"; + Description = "NewTable (fromм.)"; + + OPI_GetTestData.WriteParameter("Airtable_Table", Table); + + Result = OPI_Airtable.ModifyTable(Token, Base, Table, TableName, Description); + + // !OInt OPI_GetTestData.WriteLog(Result, "ModifyTable"); + + OPI_GetTestData.ExpectsThat(Result["name"]).Equal(TableName); + OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description); + +EndProcedure + +Procedure AT_CreateField() Export + + Token = OPI_GetTestData.GetParameter("Airtable_Token"); + Base = OPI_GetTestData.GetParameter("Airtable_Base"); + Table = OPI_GetTestData.GetParameter("Airtable_Table"); + Name = String(New UniqueIdentifier); + + Field = OPI_Airtable.GetNumberField(Name); + + Result = OPI_Airtable.CreateField(Token, Base, Table, Field); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateField"); + + OPI_GetTestData.ExpectsThat(Result["name"]).Equal(Name); + + Field = Result["id"]; + Name = Name + "(fromм.)"; + Description = "New description"; + + Result = OPI_Airtable.ModifyField(Token, Base, Table, Field, Name, Description); + + // !OInt OPI_GetTestData.WriteLog(Result, "ModifyField"); + + OPI_GetTestData.ExpectsThat(Result["name"]).Equal(Name); + OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description); + +EndProcedure + +Procedure AT_CreateDeleteRecords() Export + + Token = OPI_GetTestData.GetParameter("Airtable_Token"); + Base = OPI_GetTestData.GetParameter("Airtable_Base"); + Table = OPI_GetTestData.GetParameter("Airtable_Table"); + + Numeric = 10; + StringType = "Hello"; + + RowDescription1 = New Structure("Number,String", Numeric, StringType); + RowDescription2 = New Structure("Number,String", Numeric, StringType); + + ArrayOfDeletions = New Array; + ArrayOfDescriptions = New Array; + ArrayOfDescriptions.Add(RowDescription1); + ArrayOfDescriptions.Add(RowDescription2); + + Result = OPI_Airtable.CreatePosts(Token, Base, Table, ArrayOfDescriptions); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePosts"); + + OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array"); + OPI_GetTestData.ExpectsThat(Result["records"].Quantity()).Equal(2); + + For Each Record In Result["records"] Do + ArrayOfDeletions.Add(Record["id"]); + EndDo; + + Result = OPI_Airtable.CreatePosts(Token, Base, Table, RowDescription1); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePosts (оdto)"); + + SingleRecord = Result["id"]; + OPI_GetTestData.ExpectsThat(SingleRecord).Filled(); + OPI_GetTestData.ExpectsThat(Result["createdTime"]).Filled(); + OPI_GetTestData.ExpectsThat(Result["fields"]["Number"]).Equal(Numeric); + OPI_GetTestData.ExpectsThat(ShortLP(Result["fields"]["String"])).Equal(StringType); + + Result = OPI_Airtable.GetRecord(Token, Base, Table, SingleRecord); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetRecord"); + + OPI_GetTestData.ExpectsThat(Result["id"]).Equal(SingleRecord); + + Text = "TestComment"; + Result = OPI_Airtable.CreateComment(Token, Base, Table, SingleRecord, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateComment"); + + OPI_GetTestData.ExpectsThat(Result["text"]).Equal(Text); + + Comment = Result["id"]; + Text = "TestComment (fromм.)"; + Result = OPI_Airtable.EditComment(Token, Base, Table, SingleRecord, Comment, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "EditComment"); + + OPI_GetTestData.ExpectsThat(Result["text"]).Equal(Text); + + Result = OPI_Airtable.GetComments(Token, Base, Table, SingleRecord); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetComments"); + + OPI_GetTestData.ExpectsThat(Result["comments"]).HasType("Array"); + + Result = OPI_Airtable.DeleteComment(Token, Base, Table, SingleRecord, Comment); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteComment"); + + OPI_GetTestData.ExpectsThat(Result["deleted"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["id"]).Equal(Comment); + + Result = OPI_Airtable.GetListOfRecords(Token, Base, Table); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetListOfRecords"); + + OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array"); + OPI_GetTestData.ExpectsThat(Result["records"]).Filled(); + + Result = OPI_Airtable.DeletePosts(Token, Base, Table, ArrayOfDeletions); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeletePosts"); + + OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array"); + OPI_GetTestData.ExpectsThat(Result["records"]).Filled(); + + Result = OPI_Airtable.DeletePosts(Token, Base, Table, SingleRecord); + + // !OInt OPI_GetTestData.WriteLog(Result, "DeletePosts (оdto)"); + + OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array"); + OPI_GetTestData.ExpectsThat(Result["records"]).Filled(); + +EndProcedure + +#EndRegion + +#Region Dropbox + +Procedure Dropbox_GetUpdateToken() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Appkey" , TestParameters); + OPI_GetTestData.ParameterToCollection("Dropbox_Appsecret", TestParameters); + + Dropbox_GetAuthorizationLink(TestParameters); + + OPI_GetTestData.ParameterToCollection("Dropbox_Code", TestParameters); + + Dropbox_GetToken(TestParameters); + + OPI_GetTestData.ParameterToCollection("Dropbox_Refresh", TestParameters); + + Dropbox_UpdateToken(TestParameters); + +EndProcedure + +Procedure Dropbox_UploadFile() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters); + OPI_GetTestData.ParameterToCollection("Picture", TestParameters); + + Dropbox_UploadFile(TestParameters); + Dropbox_GetObjectInformation(TestParameters); + Dropbox_GetObjectVersionList(TestParameters); + Dropbox_RestoreObjectToVersion(TestParameters); + Dropbox_GetPreview(TestParameters); + Dropbox_DownloadFile(TestParameters); + Dropbox_MoveObject(TestParameters); + Dropbox_CopyObject(TestParameters); + Dropbox_DeleteObject(TestParameters); + +EndProcedure + +Procedure Dropbox_CreateFolder() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters); + + Dropbox_CreateFolder(TestParameters); + Dropbox_DownloadFolder(TestParameters); + +EndProcedure + +Procedure Dropbox_GetFolderFileList() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters); + + Dropbox_GetFolderFileList(TestParameters); + +EndProcedure + +Procedure Dropbox_UploadFileByURL() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters); + OPI_GetTestData.ParameterToCollection("Document", TestParameters); + + Dropbox_UploadFileByURL(TestParameters); + Dropbox_GetUploadStatusByURL(TestParameters); + +EndProcedure + +Procedure Dropbox_CreateDeleteTag() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters); + + Dropbox_AddTag(TestParameters); + Dropbox_GetTagList(TestParameters); + Dropbox_DeleteTag(TestParameters); + +EndProcedure + +Procedure Dropbox_GetAccount() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters); + + Dropbox_GetAccountInformation(TestParameters); + Dropbox_GetSpaceUsageData(TestParameters); + +EndProcedure + +Procedure Dropbox_AccessManagement() Export + + TestParameters = New Structure; + OPI_GetTestData.ParameterToCollection("Dropbox_Token" , TestParameters); + OPI_GetTestData.ParameterToCollection("Dropbox_OtherUser", TestParameters); + OPI_GetTestData.ParameterToCollection("Dropbox_FileID" , TestParameters); + + Dropbox_AddUsersToFile(TestParameters); + Dropbox_PublishFolder(TestParameters); + Dropbox_AddUsersToFolder(TestParameters); + Dropbox_CancelFolderPublication(TestParameters); + Dropbox_CancelFilePublication(TestParameters); + +EndProcedure + +#EndRegion + +#EndRegion + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function GetVKParameters() + + Parameters = New Structure; + GroupNumber = OPI_GetTestData.GetParameter("VK_GroupID"); + + Parameters.Insert("access_token" , OPI_GetTestData.GetParameter("VK_Token")); + Parameters.Insert("owner_id" , "-" + GroupNumber); + Parameters.Insert("app_id" , OPI_GetTestData.GetParameter("VK_AppID")); + Parameters.Insert("group_id" , GroupNumber); + + Return Parameters; + +EndFunction + +Function GetTwitterParameters() + + Parameters = New Match; + + Parameters.Insert("redirect_uri" , OPI_GetTestData.GetParameter("Twitter_Redirect")); + Parameters.Insert("client_id" , OPI_GetTestData.GetParameter("Twitter_ClinetID")); + Parameters.Insert("client_secret" , OPI_GetTestData.GetParameter("Twitter_ClientSecret")); + Parameters.Insert("access_token" , OPI_GetTestData.GetParameter("Twitter_Token")); + Parameters.Insert("refresh_token" , OPI_GetTestData.GetParameter("Twitter_Refresh")); + Parameters.Insert("oauth_token" , OPI_GetTestData.GetParameter("Twitter_OAuthToken")); + Parameters.Insert("oauth_token_secret" , OPI_GetTestData.GetParameter("Twitter_OAuthSecret")); + + Parameters.Insert("oauth_consumer_key" + , OPI_GetTestData.GetParameter("Twitter_OAuthConsumerKey")); + Parameters.Insert("oauth_consumer_secret" + , OPI_GetTestData.GetParameter("Twitter_OAuthConsumerSecret")); + + Return Parameters; + +EndFunction + +#Region Checks + +Procedure Check_Empty(Val Result) + OPI_GetTestData.ExpectsThat(ValueFilled(Result)).Equal(False); +EndProcedure + +Procedure Check_BinaryData(Val Result, Val Size = Undefined) + + MinimumSize = 500000; + + OPI_GetTestData.ExpectsThat(Result).HasType("BinaryData"); + + If Not Size = Undefined Then + OPI_GetTestData.ExpectsThat(Result.Size()).Equal(Size); + Else + OPI_GetTestData.ExpectsThat(Result.Size() > MinimumSize).Equal(True); + EndIf; + +EndProcedure + +Procedure Check_TelegramTrue(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]).Equal(True); + +EndProcedure + +Procedure Check_TelegramBotInformation(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["username"]).Filled(); + +EndProcedure + +Procedure Check_TelegramArray(Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match") .Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]).HasType("Array"); + +EndProcedure + +Procedure Check_TelegramWebhookSetup(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["description"]).Equal("Webhook was set"); + +EndProcedure + +Procedure Check_TelegramWebhookDeletion(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["description"]).Filled(); + +EndProcedure + +Procedure Check_TelegramMessage(Val Result, Val Text) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["text"]).Equal(Text); + +EndProcedure + +Procedure Check_TelegramImage(Val Result, Val Text) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match") .Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text); + OPI_GetTestData.ExpectsThat(Result["result"]["photo"]).HasType("Array"); + +EndProcedure + +Procedure Check_TelegramVideo(Val Result, Val Text) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text); + OPI_GetTestData.ExpectsThat(Result["result"]["video"]["mime_type"]).Equal("video/mp4"); + +EndProcedure + +Procedure Check_TelegramAudio(Val Result, Val Text) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text); + OPI_GetTestData.ExpectsThat(Result["result"]["audio"]["mime_type"]).Equal("audio/mpeg"); + +EndProcedure + +Procedure Check_TelegramDocument(Val Result, Val Text) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text); + OPI_GetTestData.ExpectsThat(Result["result"]["document"]).HasType("Match").Filled(); + +EndProcedure + +Procedure Check_TelegramGif(Val Result, Val Text) + + Result = "result"; + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result[Result]["caption"]).Equal(Text); + OPI_GetTestData.ExpectsThat(Result[Result]["document"]).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result[Result]["animation"]["mime_type"]).Equal("video/mp4"); + +EndProcedure + +Procedure Check_TelegramMediaGroup(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]).HasType("Array"); + +EndProcedure + +Procedure Check_TelegramLocation(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["location"]).HasType("Match").Filled(); + +EndProcedure + +Procedure Check_TelegramContact(Val Result, Val Name) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["contact"]).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["result"]["contact"]["first_name"]).Equal(Name); + +EndProcedure + +Procedure Check_TelegramPoll(Val Result, Val Question) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["poll"]).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["result"]["poll"]["question"]).Equal(Question); + +EndProcedure + +Procedure Check_TelegramForward(Val Result, Val MessageID) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["forward_origin"]["message_id"]).Equal(Number(MessageID)); + +EndProcedure + +Procedure Check_TelegramBan(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["description"]).Equal("Bad Request: can't remove chat owner"); + +EndProcedure + +Procedure Check_TelegramInvitation(Val Result, Val Title, Val UnixExpiration) + + Result = "result"; + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result[Result]["member_limit"]).Equal(200); + OPI_GetTestData.ExpectsThat(Result[Result]["name"]).Equal(Title); + OPI_GetTestData.ExpectsThat(Result[Result]["expire_date"]).Equal(Number(UnixExpiration)); + +EndProcedure + +Procedure Check_TelegramNumber(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]).HasType("Number"); + +EndProcedure + +Procedure Check_TelegramCreateTopic(Val Result, Val Name, Icon) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + OPI_GetTestData.ExpectsThat(Result["result"]["name"]).Equal(Name); + OPI_GetTestData.ExpectsThat(Result["result"]["icon_custom_emoji_id"]).Equal(Icon); + +EndProcedure + +Procedure Check_VKPost(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["response"]["post_id"]).HasType("Number").Filled(); + +EndProcedure + +Procedure Check_VKTrue(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["response"]).HasType("Number").Equal(1); + +EndProcedure + +Procedure Check_VKAlbum(Val Result, Val Description) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["response"]["description"]).Equal(Description); + +EndProcedure + +Procedure Check_VKAlbumPicture(Val Result, Val ImageDescription, Val AlbumID) + + Response = "response"; + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result[Response][0]["text"]).Equal(ImageDescription); + OPI_GetTestData.ExpectsThat(Result[Response][0]["album_id"]).Equal(AlbumID); + +EndProcedure + +Procedure Check_VKStory(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["response"]["count"]).HasType("Number").Equal(1); + OPI_GetTestData.ExpectsThat(Result["response"]["items"]).HasType("Array").Filled(); + +EndProcedure + +Procedure Check_VKDiscussion(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["response"]).HasType("Number").Filled(); + +EndProcedure + +Procedure Check_GKObject(Val Result, Val Name, Val Description) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match"); + OPI_GetTestData.ExpectsThat(Result["summary"]).Equal(Name); + OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description); + OPI_GetTestData.ExpectsThat(Result["id"]).HasType("String").Filled(); + +EndProcedure + +Procedure Check_TwitterText(Val Result, Val Text) + + ReplyText = Result["data"]["text"]; + ReplyText = Left(ReplyText, StrLength(Text)); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(ReplyText).Equal(Text); + +EndProcedure + +Procedure Check_ViberOk(Val Result) + + OPI_GetTestData.ExpectsThat(Result["status_message"]).Equal("ok"); + OPI_GetTestData.ExpectsThat(Result["status"]).Equal(0); + +EndProcedure + +Procedure Check_NotionObject(Val Result, Val View = "page") + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["object"]).Equal(View); + +EndProcedure + +Procedure Check_SlackOk(Val Result) + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True); + +EndProcedure + +Procedure Check_DropboxFile(Val Result, Val Path) + + OPI_GetTestData.ExpectsThat(Result["path_display"]).Equal(Path); + +EndProcedure + +Procedure Check_DropboxMetadata(Val Result, Val Path) + + OPI_GetTestData.ExpectsThat(Result["metadata"]["path_display"]).Equal(Path); + +EndProcedure + +Procedure Check_DropboxArray(Val Result, Val Quantity = Undefined) + + OPI_GetTestData.ExpectsThat(Result["entries"]).HasType("Array"); + + If Not Quantity = Undefined Then + OPI_GetTestData.ExpectsThat(Result["entries"].Quantity()).Equal(Quantity); + EndIf; + +EndProcedure + +Procedure Check_DropboxWork(Val Result) + OPI_GetTestData.ExpectsThat(Result["async_job_id"]).Filled(); +EndProcedure + +Procedure Check_DropboxStatus(Val Result) + OPI_GetTestData.ExpectsThat(Result[".tag"]).Equal("complete"); +EndProcedure + +Procedure Check_DropboxTags(Val Result, Val Quantity) + + OPI_GetTestData.ExpectsThat(Result["paths_to_tags"]).HasType("Array"); + OPI_GetTestData.ExpectsThat(Result["paths_to_tags"].Quantity()).Equal(Quantity); + +EndProcedure + +Procedure Check_DropboxAccount(Val Result) + OPI_GetTestData.ExpectsThat(Result["account_id"]).Filled(); +EndProcedure + +Procedure Check_DropboxSpace(Val Result) + OPI_GetTestData.ExpectsThat(Result["used"]).Filled(); +EndProcedure + +Procedure Check_DropboxMember(Val Result, Val Email, Val ViewOnly) + OPI_GetTestData.ExpectsThat(Result[0]["result"][".tag"]).Equal("success"); + OPI_GetTestData.ExpectsThat(Result[0]["member"]["email"]).Equal(Email); + OPI_GetTestData.ExpectsThat( + Result[0]["result"]["success"][".tag"]).Equal(?(ViewOnly, "viewer", "editor")); +EndProcedure + +Procedure Check_DropboxPublicFolder(Val Result) + OPI_GetTestData.ExpectsThat(Result["shared_folder_id"]).Filled(); +EndProcedure + +#EndRegion + +#Region AtomicTests + +#Region Telegram + +Procedure Telegram_GetBotInformation(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Result = OPI_Telegram.GetBotInformation(Token); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetBotInformation", "Telegram"); + + Check_TelegramBotInformation(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_GetUpdates(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Result = OPI_Telegram.GetUpdates(Token); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetUpdates", "Telegram"); + + Check_TelegramArray(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SetWebhook(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + URL = FunctionParameters["Telegram_URL"]; + + Result = OPI_Telegram.SetWebhook(Token, URL); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SetWebhook", "Telegram"); + + Check_TelegramWebhookSetup(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_DeleteWebhook(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Result = OPI_Telegram.DeleteWebhook(Token); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteWebhook", "Telegram"); + + Check_TelegramWebhookDeletion(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendTextMessage(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Text = FunctionParameters["String"]; + + Result = OPI_Telegram.SendTextMessage(Token, ChatID, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage", "Telegram"); + + Check_TelegramMessage(Result, Text); // SKIP + + Result = OPI_Telegram.SendTextMessage(Token, ChannelID, Text); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage (toаtoл)"); + + Check_TelegramMessage(Result, Text); + + MessageID = OPI_Tools.NumberToString(Result["result"]["message_id"]); + OPI_GetTestData.WriteParameter("Telegram_ChannelMessageID", MessageID); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendPicture(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Text = FunctionParameters["String"]; + Image = FunctionParameters["Picture"]; + + ImagePath = GetTempFileName("png"); + CopyFile(Image, ImagePath); + + ImageDD = New BinaryData(ImagePath); + + Result = OPI_Telegram.SendImage(Token, ChatID, Text, Image); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendImage", "Telegram"); + + Check_TelegramImage(Result, Text); // SKIP + + Result = OPI_Telegram.SendImage(Token, ChannelID, Text, ImagePath); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendImage (Path)"); + + Check_TelegramImage(Result, Text); // SKIP + + Result = OPI_Telegram.SendImage(Token, ChannelID, Text, ImageDD); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendImage (BD)"); + + Check_TelegramImage(Result, Text); + + DeleteFiles(ImagePath); + + FileID = Result["result"]["photo"][0]["file_id"]; + OPI_GetTestData.WriteParameter("Telegram_FileID", FileID); + + FunctionParameters.Insert("Telegram_FileID", FileID); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendVideo(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Text = FunctionParameters["String"]; + Video = FunctionParameters["Video"]; + + VideoPath = GetTempFileName("mp4"); + CopyFile(Video, VideoPath); + + VideoDD = New BinaryData(VideoPath); + + Result = OPI_Telegram.SendVideo(Token, ChatID, Text, Video); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendVideo", "Telegram"); + + Check_TelegramVideo(Result, Text); // SKIP + + Result = OPI_Telegram.SendVideo(Token, ChannelID, Text, VideoPath); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendVideo (Path)"); + + Check_TelegramVideo(Result, Text); // SKIP + + Result = OPI_Telegram.SendVideo(Token, ChannelID, Text, VideoDD); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendVideo (BD)"); + + Check_TelegramVideo(Result, Text); + + DeleteFiles(VideoPath); + + FileID = Result["result"]["video"]["file_id"]; + OPI_GetTestData.WriteParameter("Telegram_FileID", FileID); + + FunctionParameters.Insert("Telegram_FileID", FileID); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendAudio(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Text = FunctionParameters["String"]; + Audio = FunctionParameters["Audio"]; + + AudioPath = GetTempFileName("mp3"); + CopyFile(Audio, AudioPath); + + AudioDD = New BinaryData(AudioPath); + + Result = OPI_Telegram.SendAudio(Token, ChatID, Text, Audio); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendAudio", "Telegram"); + + Check_TelegramAudio(Result, Text); // SKIP + + Result = OPI_Telegram.SendAudio(Token, ChannelID, Text, AudioPath); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendAudio (Path)"); + + Check_TelegramAudio(Result, Text); // SKIP + + Result = OPI_Telegram.SendAudio(Token, ChannelID, Text, AudioDD); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendAudio (BD)"); + + Check_TelegramAudio(Result, Text); + + DeleteFiles(AudioPath); + + FileID = Result["result"]["audio"]["file_id"]; + OPI_GetTestData.WriteParameter("Telegram_FileID", FileID); + + FunctionParameters.Insert("Telegram_FileID", FileID); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendDocument(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Text = FunctionParameters["String"]; + Document = FunctionParameters["Document"]; + + DocumentPath = GetTempFileName("docx"); + CopyFile(Document, DocumentPath); + + DocumentDD = New BinaryData(DocumentPath); + + Result = OPI_Telegram.SendDocument(Token, ChatID, Text, Document); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendDocument", "Telegram"); + + Check_TelegramDocument(Result, Text); // SKIP + + Result = OPI_Telegram.SendDocument(Token, ChannelID, Text, DocumentPath); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendDocument (Path)"); + + Check_TelegramDocument(Result, Text); // SKIP + + Result = OPI_Telegram.SendDocument(Token, ChannelID, Text, DocumentDD); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendDocument (BD)"); + + Check_TelegramDocument(Result, Text); + + DeleteFiles(DocumentPath); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendGif(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Text = FunctionParameters["String"]; + GIF = FunctionParameters["GIF"]; + + GifPath = GetTempFileName("gif"); + CopyFile(GIF, GifPath); + + GifDD = New BinaryData(GifPath); + + Result = OPI_Telegram.SendGif(Token, ChatID, Text, GIF); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendGif", "Telegram"); + + Check_TelegramGif(Result, Text); // SKIP + + Result = OPI_Telegram.SendGif(Token, ChannelID, Text, GifPath); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendGif (Path)"); + + Check_TelegramGif(Result, Text); // SKIP + + Result = OPI_Telegram.SendGif(Token, ChannelID, Text, GifDD); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendGif (BD)"); + + Check_TelegramGif(Result, Text); + + DeleteFiles(GifPath); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendMediaGroup(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + Text = FunctionParameters["String"]; + Image = FunctionParameters["Picture"]; + Video = FunctionParameters["Video"]; + + ImagePath = GetTempFileName("png"); + CopyFile(Image, ImagePath); + + VideoPath = GetTempFileName("mp4"); + CopyFile(Video, VideoPath); + + VideoDD = New BinaryData(VideoPath); + + MediaGroup = New Match; + MediaGroup.Insert(ImagePath, "photo"); + MediaGroup.Insert(VideoDD , "video"); + + Result = OPI_Telegram.SendMediaGroup(Token, ChatID, Text, MediaGroup); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendMediaGroup", "Telegram"); + + Check_TelegramMediaGroup(Result); + + DeleteFiles(VideoPath); + DeleteFiles(ImagePath); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendLocation(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Width = FunctionParameters["Lat"]; + Longitude = FunctionParameters["Long"]; + + Result = OPI_Telegram.SendLocation(Token, ChatID, Width, Longitude); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation", "Telegram"); + + Check_TelegramLocation(Result); // SKIP + + Result = OPI_Telegram.SendLocation(Token, ChannelID, Width, Longitude); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation (toаtoл)"); + + Check_TelegramLocation(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendContact(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Name = FunctionParameters["Name"]; + Last name = FunctionParameters["Surname"]; + Phone = FunctionParameters["Phone"]; + + Result = OPI_Telegram.SendContact(Token, ChatID , Name, Last name, Phone); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendContact", "Telegram"); + + Check_TelegramContact(Result, Name); // SKIP + OPI_Tools.Pause(20); // SKIP + + Result = OPI_Telegram.SendContact(Token, ChannelID, Name, Last name, Phone); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SendContact (toаtoл)"); + + Check_TelegramContact(Result, Name); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_SendPoll(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Question = "What's your favorite color?"; + + AnswersArray = New Array; + AnswersArray.Add("Red"); + AnswersArray.Add("Yellow"); + AnswersArray.Add("Green"); + AnswersArray.Add("Blue"); + + Result = OPI_Telegram.SendPoll(Token, ChatID , Question, AnswersArray, False); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendPoll", "Telegram"); + + Check_TelegramPoll(Result, Question); // SKIP + + Result = OPI_Telegram.SendPoll(Token, ChannelID, Question, AnswersArray, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendPoll (toаtoл)"); + + Check_TelegramPoll(Result, Question); // SKIP + + // END + + StringArray = "['Red', 'Yellow','Green' ,'Blue']"; + + Result = OPI_Telegram.SendPoll(Token, ChannelID, Question, StringArray, True); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendPoll (withтрочный маwithwithиin)"); + + Check_TelegramPoll(Result, Question); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_DownloadFile(FunctionParameters) + + FileID = FunctionParameters["Telegram_FileID"]; + Token = FunctionParameters["Telegram_Token"]; + + Result = OPI_Telegram.DownloadFile(Token, FileID); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFile", "Telegram"); + + OPI_GetTestData.ExpectsThat(Result).HasType("BinaryData"); + +EndProcedure + +Procedure Telegram_ForwardMessage(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChatID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + MessageID = FunctionParameters["Telegram_ChannelMessageID"]; + + Result = OPI_Telegram.ForwardMessage(Token, MessageID, ChannelID, ChatID); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "ForwardMessage", "Telegram"); + + Check_TelegramForward(Result, MessageID); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_Ban(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + UserID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + + Result = OPI_Telegram.Ban(Token, ChannelID, UserID); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "Ban", "Telegram"); + + Check_TelegramBan(Result); + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_Unban(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + UserID = FunctionParameters["Telegram_ChatID"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + + Result = OPI_Telegram.Unban(Token, ChannelID, UserID); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "Unban", "Telegram"); + + Check_TelegramBan(Result); + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_CreateInviteLink(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + Day = 86400; + CurrentDate = OPI_Tools.GetCurrentDate(); + + Title = "Link " + String(CurrentDate); + Expiration = CurrentDate + Day; + UnixExpiration = OPI_Tools.UNIXTime(Expiration); + + Result = OPI_Telegram.CreateInvitationLink(Token, ChannelID, Title, Expiration, 200); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateInvitationLink", "Telegram"); + + Check_TelegramInvitation(Result, Title, UnixExpiration); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_PinMessage(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + MessageID = FunctionParameters["Telegram_ChannelMessageID"]; + + Result = OPI_Telegram.PinMessage(Token, ChannelID, MessageID); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "PinMessage", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_UnpinMessage(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + MessageID = FunctionParameters["Telegram_ChannelMessageID"]; + + Result = OPI_Telegram.UnpinMessage(Token, ChannelID, MessageID); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "UnpinMessage", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_GetParticipantCount(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + ChannelID = FunctionParameters["Telegram_ChannelID"]; + + Result = OPI_Telegram.GetParticipantCount(Token, ChannelID); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetParticipantCount", "Telegram"); + + Check_TelegramNumber(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_GetForumAvatarList(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Result = OPI_Telegram.GetAvatarIconList(Token); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetAvatarIconList", "Telegram"); + + OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_CreateForumTopic(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + Icon = "5357419403325481346"; + Name = "TestTopic " + String(New UniqueIdentifier); + + Result = OPI_Telegram.CreateForumThread(Token, Chat, Name, Icon); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateForumThread", "Telegram"); + + Topic = Result["result"]["message_thread_id"]; + + FunctionParameters.Insert("Telegram_TopicID", Topic); + OPI_Tools.AddField("Telegram_TopicID", Topic, "String", FunctionParameters); + OPI_GetTestData.WriteParameter("Telegram_TopicID", FunctionParameters["Telegram_TopicID"]); + + Check_TelegramCreateTopic(Result, Name, Icon); + + ChatTopic = Chat + "*" + Topic; + Text = FunctionParameters["String"]; + Result = OPI_Telegram.SendTextMessage(Token, ChatTopic, Text); + + // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage (форум)"); + + Check_TelegramMessage(Result, Text); + +EndProcedure + +Procedure Telegram_EditForumTopic(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + Topic = FunctionParameters["Telegram_TopicID"]; + NewName = "NewTestTitle"; + NewIcon = "5310132165583840589"; + + Result = OPI_Telegram.EditForumTopic(Token, Chat, Topic, NewName, NewIcon); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "EditForumTopic", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_CloseForumTopic(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + Topic = FunctionParameters["Telegram_TopicID"]; + + OPI_Telegram.OpenForumThread(Token, Chat); // SKIP + + Result = OPI_Telegram.CloseForumThread(Token, Chat); // Closes main topic + + // !OInt OPI_GetTestData.WriteLog(Result, "CloseForumThread (глаintoя)"); + + Check_TelegramTrue(Result); // SKIP + + Result = OPI_Telegram.CloseForumThread(Token, Chat, Topic); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CloseForumThread", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(25); + +EndProcedure + +Procedure Telegram_OpenForumTopic(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + Topic = FunctionParameters["Telegram_TopicID"]; + + Result = OPI_Telegram.OpenForumThread(Token, Chat); // Opens main topic + + // !OInt OPI_GetTestData.WriteLog(Result, "OpenForumThread (глаintoя)"); + + Check_TelegramTrue(Result); // SKIP + + Result = OPI_Telegram.OpenForumThread(Token, Chat, Topic); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "OpenForumThread", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(25); + +EndProcedure + +Procedure Telegram_DeleteForumTopic(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + Topic = FunctionParameters["Telegram_TopicID"]; + + Result = OPI_Telegram.DeleteForumTopic(Token, Chat, Topic); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteForumTopic", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(25); + +EndProcedure + +Procedure Telegram_ClearPinnedMessagesList(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + Topic = FunctionParameters["Telegram_TopicID"]; + + Result = OPI_Telegram.ClearThreadPinnedMessagesList(Token, Chat); + + // !OInt OPI_GetTestData.WriteLog(Result, "ClearThreadPinnedMessagesList (глаintoя)"); + + Check_TelegramTrue(Result); // SKIP + + Result = OPI_Telegram.ClearThreadPinnedMessagesList(Token, Chat, Topic); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "ClearThreadPinnedMessagesList", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_HideMainForumTopic(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + + Result = OPI_Telegram.HideMainForumTopic(Token, Chat); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "HideMainForumTopic", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_ShowMainForumTopic(FunctionParameters) + + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + + Result = OPI_Telegram.ShowMainForumTopic(Token, Chat); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "ShowMainForumTopic", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Telegram_ChangeMainTopicName(FunctionParameters) + + Title = "New main thread name " + String(New UniqueIdentifier); + Token = FunctionParameters["Telegram_Token"]; + Chat = FunctionParameters["Telegram_ForumID"]; + + Result = OPI_Telegram.EditMainForumTopicName(Token, Chat, Title); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "EditMainForumTopicName", "Telegram"); + + Check_TelegramTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +#EndRegion + +#Region VK + +Procedure VK_CreateTokenRetrievalLink(FunctionParameters) + + Application = FunctionParameters["VK_AppID"]; + Result = OPI_VK.CreateTokenRetrievalLink(Application); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateTokenRetrievalLink", "VK"); + + OPI_GetTestData.ExpectsThat(Result).HasType("String").Filled(); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CreatePost(FunctionParameters) + + Parameters = GetVKParameters(); + Text = "Post from autotest"; + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Image = FunctionParameters["Picture"]; // URL, Path or Binary Data + Image2 = FunctionParameters["Picture2"]; // URL, Path or Binary Data + + AndVF = GetTempFileName("png"); + CopyFile(Image2, AndVF); + + ImageArray = New Array; + ImageArray.Add(Image); + ImageArray.Add(AndVF); + + Result = OPI_VK.CreatePost(Text, ImageArray, True, URL, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePost", "VK"); + + Check_VKPost(Result); // SKIP + PostID = Result["response"]["post_id"]; // SKIP + Result = OPI_VK.DeletePost(PostID, Parameters); // SKIP + + Result = OPI_VK.CreatePost(Text, Image, False , , Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePost (оdto toартинtoа)"); + + Check_VKPost(Result); + + PostID = Result["response"]["post_id"]; + Result = OPI_VK.DeletePost(PostID, Parameters); + + OPI_Tools.Pause(5); + + Result = OPI_VK.CreatePost(Text, AndVF , True, URL, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePost (оdин path)"); + + Check_VKPost(Result); + + PostID = Result["response"]["post_id"]; + OPI_Tools.AddField("VK_PostID", PostID, "String", FunctionParameters); + OPI_GetTestData.WriteParameter("VK_PostID", FunctionParameters["VK_PostID"]); + + DeleteFiles(AndVF); + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_DeletePost(FunctionParameters) + + Parameters = GetVKParameters(); + PostID = FunctionParameters["VK_PostID"]; + + Result = OPI_VK.DeletePost(PostID, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DeletePost", "VK"); + + Check_VKTrue(Result); + +EndProcedure + +Procedure VK_CreateCompositePost(FunctionParameters) + + Parameters = GetVKParameters(); + Text = "Post from autotest"; + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Image = FunctionParameters["Picture"]; // URL, Path or Binary Data + Video = FunctionParameters["Video"]; // URL, Path or Binary Data + + AndVF = GetTempFileName("png"); + CopyFile(Image, AndVF); + + ImageUpload = OPI_VK.UploadPhotoToServer(AndVF, Parameters)["response"][0]; + VideoUpload = OPI_VK.UploadVideoToServer(Video, "NewVideo", , , Parameters); + + ImageOwner = OPI_Tools.NumberToString(ImageUpload["owner_id"]); + VideoOwner = OPI_Tools.NumberToString(VideoUpload["owner_id"]); + + ImageID = OPI_Tools.NumberToString(ImageUpload["id"]); + VideoID = OPI_Tools.NumberToString(VideoUpload["video_id"]); + + AttachmentsArray = New Array; + AttachmentsArray.Add("photo" + ImageOwner + "_" + ImageID); + AttachmentsArray.Add("video" + VideoOwner + "_" + VideoID); + + Result = OPI_VK.CreateCompositePost(Text, AttachmentsArray, False, URL, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateCompositePost", "VK"); + + Check_VKPost(Result); + DeleteFiles(AndVF); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CreatePoll() + + Parameters = GetVKParameters(); + Question = "What's your favorite color?"; + + OptionArray = New Array; + OptionArray.Add("Red"); + OptionArray.Add("Yellow"); + OptionArray.Add("Green"); + + Result = OPI_VK.CreatePoll(Question, OptionArray, , Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreatePoll", "VK"); + + Check_VKPost(Result); + + PostID = Result["response"]["post_id"]; + OPI_VK.DeletePost(PostID, Parameters); + + OPI_Tools.Pause(10); + +EndProcedure + +Procedure VK_CreateAlbum(FunctionParameters) + + Parameters = GetVKParameters(); + Name = "AlbumFromAutoTest"; + Description = "NewAlbumFromAutoTest"; + + Result = OPI_VK.CreateAlbum(Name, Description, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateAlbum", "VK"); + + Check_VKAlbum(Result, Description); + + AlbumID = Result["response"]["id"]; + FunctionParameters.Insert("VK_AlbumID", AlbumID); + OPI_GetTestData.WriteParameter("VK_AlbumID", AlbumID); + +EndProcedure + +Procedure VK_SavePictureToAlbum(FunctionParameters) + + Parameters = GetVKParameters(); + ImageDescription = "AutoTestImage"; + AlbumID = FunctionParameters["VK_AlbumID"]; + + Image = FunctionParameters["Picture"]; // URL, Path to file or Binary Data + AndVF = GetTempFileName("png"); + CopyFile(Image, AndVF); + + Image = New BinaryData(AndVF); + + Result = OPI_VK.SaveImageToAlbum(AlbumID, Image, ImageDescription, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "SaveImageToAlbum", "VK"); + + Check_VKAlbumPicture(Result, ImageDescription, AlbumID); // SKIP + + ImageID = Result["response"][0]["id"]; // SKIP + Result = OPI_VK.DeleteImage(ImageID, Parameters); // SKIP + + Result = OPI_VK.SaveImageToAlbum(AlbumID, AndVF, ImageDescription, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "SaveImageToAlbum (path)"); + + Check_VKAlbumPicture(Result, ImageDescription, AlbumID); // SKIP + + ImageID = Result["response"][0]["id"]; + FunctionParameters.Insert("VK_PictureID", ImageID); + OPI_GetTestData.WriteParameter("VK_PictureID", ImageID); + + DeleteFiles(AndVF); + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_DeleteImage(FunctionParameters) + + Parameters = GetVKParameters(); + ImageID = FunctionParameters["VK_PictureID"]; + + Result = OPI_VK.DeleteImage(ImageID, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteImage", "VK"); + + Check_VKTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_DeleteAlbum(FunctionParameters) + + Parameters = GetVKParameters(); + AlbumID = FunctionParameters["VK_AlbumID"]; + + Result = OPI_VK.DeleteAlbum(AlbumID, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteAlbum", "VK"); + + Check_VKTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CreateStory(FunctionParameters) + + Parameters = GetVKParameters(); + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Image = FunctionParameters["Picture"]; // URL, Path to file or Binary Data + AndVF = GetTempFileName("png"); + CopyFile(Image, AndVF); + Image = New BinaryData(AndVF); + + Result = OPI_VK.CreateStory(Image , URL, Parameters); + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateStory", "VK"); + + Check_VKStory(Result); // SKIP + + Result = OPI_VK.CreateStory(AndVF, , Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateStory (path)"); + + Check_VKStory(Result); + + DeleteFiles(AndVF); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CreateDiscussion(FunctionParameters) + + Parameters = GetVKParameters(); + Name = "Discussing: Which color is better?"; + Message = "Red, yellow, blue, or some other?"; + + Result = OPI_VK.CreateDiscussion(Name, Message, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateDiscussion", "VK"); + + Check_VKDiscussion(Result); + + DiscussionID = Result["response"]; + FunctionParameters.Insert("VK_ConvID", DiscussionID); + OPI_GetTestData.WriteParameter("VK_ConvID", DiscussionID); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_CloseDiscussion(FunctionParameters) + + Parameters = GetVKParameters(); + DiscussionID = FunctionParameters["VK_ConvID"]; + Result = OPI_VK.CloseDiscussion(DiscussionID, False, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CloseDiscussion", "VK"); + + Check_VKTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_OpenDiscussion(FunctionParameters) + + Parameters = GetVKParameters(); + DiscussionID = FunctionParameters["VK_ConvID"]; + Result = OPI_VK.OpenDiscussion(DiscussionID, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "OpenDiscussion", "VK"); + + Check_VKTrue(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure VK_PostToDiscussion(FunctionParameters) + + Parameters = GetVKParameters(); + DiscussionID = FunctionParameters["VK_ConvID"]; + Message = "I like yellow more"; + + Result = OPI_VK.WriteInDiscussion(DiscussionID, Message, Parameters); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "WriteInDiscussion", "VK"); + + Check_VKDiscussion(Result); + +EndProcedure + +#EndRegion + +#Region Dropbox + +Procedure Dropbox_GetAuthorizationLink(FunctionParameters) + + AppKey = FunctionParameters["Dropbox_Appkey"]; + Result = OPI_Dropbox.GetAuthorizationLink(AppKey); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetAuthorizationLink", "Dropbox"); + + OPI_GetTestData.ExpectsThat(Result).HasType("String"); + +EndProcedure + +Procedure Dropbox_GetToken(FunctionParameters) + + AppKey = FunctionParameters["Dropbox_Appkey"]; + AppSecret = FunctionParameters["Dropbox_Appsecret"]; + Code = FunctionParameters["Dropbox_Code"]; + + Result = OPI_Dropbox.GetToken(AppKey, AppSecret, Code); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetToken"); + + Token = Result["access_token"]; + Refresh = Result["refresh_token"]; + + If ValueFilled(Token) Then + OPI_GetTestData.WriteParameter("Dropbox_Token", Token); + EndIf; + + If ValueFilled(Refresh) Then + OPI_GetTestData.WriteParameter("Dropbox_Refresh", Refresh); + EndIf; + +EndProcedure + +Procedure Dropbox_UpdateToken(FunctionParameters) + + AppKey = FunctionParameters["Dropbox_Appkey"]; + AppSecret = FunctionParameters["Dropbox_Appsecret"]; + RefreshToken = FunctionParameters["Dropbox_Refresh"]; + + Result = OPI_Dropbox.RefreshToken(AppKey, AppSecret, RefreshToken); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "RefreshToken"); + + Token = Result["access_token"]; + + OPI_GetTestData.ExpectsThat(Token).Filled(); + + OPI_GetTestData.WriteParameter("Dropbox_Token", Token); + +EndProcedure + +Procedure Dropbox_GetObjectInformation(FunctionParameters) + + Path = "/New/pic.png"; + Token = FunctionParameters["Dropbox_Token"]; + + Result = OPI_Dropbox.GetObjectInformation(Token, Path, True); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetObjectInformation", "Dropbox"); + + Check_DropboxFile(Result, Path); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_GetPreview(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New/mydoc.docx"; + + Result = OPI_Dropbox.GetPreview(Token, Path); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetPreview", "Dropbox"); + + Check_BinaryData(Result, 190834); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_UploadFile(FunctionParameters) + + Path = "/New/pic.png"; + Token = FunctionParameters["Dropbox_Token"]; + Image = FunctionParameters["Picture"]; + + ImagePath = GetTempFileName("png"); + CopyFile(Image, ImagePath); + + Result = OPI_Dropbox.UploadFile(Token, ImagePath, Path, True); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile", "Dropbox"); + + Check_DropboxFile(Result, Path); + DeleteFiles(ImagePath); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_UploadFileByURL(FunctionParameters) + + Path = "/New/url_doc.docx"; + Token = FunctionParameters["Dropbox_Token"]; + URL = FunctionParameters["Document"]; + + Result = OPI_Dropbox.UploadFileByURL(Token, URL, Path); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "UploadFileByURL", "Dropbox"); + + Check_DropboxWork(Result); + + Work = Result["async_job_id"]; + + FunctionParameters.Insert("Dropbox_Job", Work); + OPI_GetTestData.WriteParameter("Dropbox_Job", Work); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_GetUploadStatusByURL(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + WorkID = FunctionParameters["Dropbox_Job"]; + Status = "in_progress"; + + WHile Status = "in_progress" Do + + Result = OPI_Dropbox.GetUploadStatusByURL(Token, WorkID); + Status = Result[".tag"]; + + OPI_Tools.Pause(5); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetUploadStatusByURL", "Dropbox"); + + EndDo; + + // END + + Check_DropboxStatus(Result); + + Path = "/New/url_doc.docx"; + Result = OPI_Dropbox.DeleteObject(Token, Path); + + Check_DropboxMetadata(Result, Path); + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_DeleteObject(FunctionParameters) + + Path = "/New/pic.png"; + Token = FunctionParameters["Dropbox_Token"]; + + Result = OPI_Dropbox.DeleteObject(Token, Path); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject", "Dropbox"); + + Check_DropboxMetadata(Result, Path); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_CopyObject(FunctionParameters) + + Original = "/New/pic.png"; + Copy = "/New/pic_copy.png"; + Token = FunctionParameters["Dropbox_Token"]; + + Result = OPI_Dropbox.CopyObject(Token, Original, Copy); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CopyObject", "Dropbox"); + + Check_DropboxMetadata(Result, Copy); + + Result = OPI_Dropbox.DeleteObject(Token, Copy); + Check_DropboxMetadata(Result, Copy); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_MoveObject(FunctionParameters) + + OriginalPath = "/New/pic.png"; + TargetPath = "/pic.png"; + Token = FunctionParameters["Dropbox_Token"]; + + Result = OPI_Dropbox.MoveObject(Token, OriginalPath, TargetPath); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "Dropbox_MoveObject", "Dropbox"); + + Check_DropboxMetadata(Result, TargetPath); + + Result = OPI_Dropbox.MoveObject(Token, TargetPath, OriginalPath); + Check_DropboxMetadata(Result, OriginalPath); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_CreateFolder(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New toаталог"; + + Result = OPI_Dropbox.CreateFolder(Token, Path); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CreateFolder", "Dropbox"); + + Check_DropboxMetadata(Result, Path); + + Result = OPI_Dropbox.DeleteObject(Token, Path); + Check_DropboxMetadata(Result, Path); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_DownloadFile(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New/pic.png"; + + Result = OPI_Dropbox.DownloadFile(Token, Path); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFile", "Dropbox"); + + Check_BinaryData(Result, 2114023); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_DownloadFolder(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New"; + + Result = OPI_Dropbox.DownloadFolder(Token, Path); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFolder", "Dropbox"); + + Check_BinaryData(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_GetFolderFileList(FunctionParameters) + + Path = "/New"; + Token = FunctionParameters["Dropbox_Token"]; + + Result = OPI_Dropbox.GetListOfFolderFiles(Token, Path, True); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetListOfFolderFiles", "Dropbox"); + + Check_DropboxArray(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_GetObjectVersionList(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New/pic.png"; + + Result = OPI_Dropbox.GetObjectVersionList(Token, Path, 1); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetObjectVersionList", "Dropbox"); + + Check_DropboxArray(Result, 1); + + Revision = Result["entries"][0]["rev"]; + + FunctionParameters.Insert("Dropbox_FileRevision", Revision); + OPI_GetTestData.WriteParameter("Dropbox_FileRevision", Revision); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_RestoreObjectToVersion(FunctionParameters) + + Version = FunctionParameters["Dropbox_FileRevision"]; + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New/pic.png"; + + Result = OPI_Dropbox.RestoreObjectToVersion(Token, Path, Version); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "RestoreObjectToVersion", "Dropbox"); + + Check_DropboxFile(Result, Path); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_GetTagList(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + + PathsArray = New Array; + PathsArray.Add("/New/Dogs.mp3"); + PathsArray.Add("/New/mydoc.docx"); + + Result = OPI_Dropbox.GetTagList(Token, PathsArray); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetTagList", "Dropbox"); + + Check_DropboxTags(Result, PathsArray.Quantity()); + + Result = OPI_Dropbox.GetTagList(Token, "/New/mydoc.docx"); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetTagList (оdиночный)"); + + Check_DropboxTags(Result, 1); + + HasTag = False; + + For Each Tag In Result["paths_to_tags"][0]["tags"] Do + If Tag["tag_text"] = "important" Then + HasTag = True; + EndIf; + EndDo; + + OPI_GetTestData.ExpectsThat(HasTag).Equal(True); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_AddTag(FunctionParameters) + + Tag = "Important"; + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New/mydoc.docx"; + + Result = OPI_Dropbox.AddTag(Token, Path, Tag); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "AddTag", "Dropbox"); + + Check_Empty(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_DeleteTag(FunctionParameters) + + Tag = "Important"; + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New/mydoc.docx"; + + Result = OPI_Dropbox.DeleteTag(Token, Path, Tag); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "DeleteTag", "Dropbox"); + + Check_Empty(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_GetAccountInformation(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + + Result = OPI_Dropbox.GetAccountInformation(Token); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetAccountInformation", "Dropbox"); + + Check_DropboxAccount(Result); + + Result = OPI_Dropbox.GetAccountInformation(Token, Result["account_id"]); + + // !OInt OPI_GetTestData.WriteLog(Result, "GetAccountInformation (withторонний)"); + + Check_DropboxAccount(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_GetSpaceUsageData(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + + Result = OPI_Dropbox.GetSpaceUsageData(Token); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "GetSpaceUsageData", "Dropbox"); + + Check_DropboxSpace(Result); + +EndProcedure + +Procedure Dropbox_AddUsersToFile(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Email = FunctionParameters["Dropbox_OtherUser"]; + File = FunctionParameters["Dropbox_FileID"]; + + Result = OPI_Dropbox.AddUsersToFile(Token, File, Email, False); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "AddUserToFile", "Dropbox"); + + Check_DropboxMember(Result, Email, False); + + Mails = New Array; + Mails.Add(Email); + + Result = OPI_Dropbox.AddUsersToFile(Token, File, Mails, True); + + Check_DropboxMember(Result, Email, True); + +EndProcedure + +Procedure Dropbox_PublishFolder(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Path = "/New"; + + Result = OPI_Dropbox.PublishFolder(Token, Path); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "PublishFolder", "Dropbox"); + + Check_DropboxPublicFolder(Result); + + FolderID = Result["shared_folder_id"]; + + FunctionParameters.Insert("Dropbox_SharedFolder", FolderID); + OPI_GetTestData.WriteParameter("Dropbox_SharedFolder", FolderID); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_CancelFolderPublication(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Folder = FunctionParameters["Dropbox_SharedFolder"]; + + Result = OPI_Dropbox.CancelFolderPublication(Token, Folder); + CurrentStatus = "in_progress"; + JobID = Result["async_job_id"]; + + WHile CurrentStatus = "in_progress" Do + Result = OPI_Dropbox.GetAsynchronousChangeStatus(Token, JobID); + CurrentStatus = Result[".tag"]; + OPI_Tools.Pause(3); + EndDo; + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CancelFolderPublication", "Dropbox"); + + Check_DropboxStatus(Result); + + OPI_Tools.Pause(5); + +EndProcedure + +Procedure Dropbox_AddUsersToFolder(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + Email = FunctionParameters["Dropbox_OtherUser"]; + Folder = FunctionParameters["Dropbox_SharedFolder"]; // shared_folder_id + + Result = OPI_Dropbox.AddUsersToFolder(Token, Folder, Email, False); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "AddUserToFile", "Dropbox"); + + Check_Empty(Result); + + Mails = New Array; + Mails.Add(Email); + + Result = OPI_Dropbox.AddUsersToFolder(Token, Folder, Mails, True); + + Check_Empty(Result); + +EndProcedure + +Procedure Dropbox_CancelFilePublication(FunctionParameters) + + Token = FunctionParameters["Dropbox_Token"]; + File = FunctionParameters["Dropbox_FileID"]; + + Result = OPI_Dropbox.CancelFilePublication(Token, File); + + // END + + // !OInt OPI_GetTestData.WriteLog(Result, "CancelFilePublication", "Dropbox"); + + Check_Empty(Result); + +EndProcedure + +#EndRegion + +#EndRegion + +#EndRegion diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo new file mode 100644 index 0000000000..e8ea7bc39e --- /dev/null +++ b/service/interim/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ca6868b2-8987-4ae3-9d97-50a8becc72df"> + <name>OPI_Tests</name> + <synonym> + <key></key> + <value>OPI теwithты</value> + </synonym> + <synonym> + <key>ru</key> + <value>Tests for YaxUnit (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/service/interim/en/OPI/src/Configuration/Configuration.mdo b/service/interim/en/OPI/src/Configuration/Configuration.mdo new file mode 100644 index 0000000000..988bd2ceda --- /dev/null +++ b/service/interim/en/OPI/src/Configuration/Configuration.mdo @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" xmlns:mdclassExtension="http://g5.1c.ru/v8/dt/metadata/mdclass/extension" uuid="aa51f610-7ed3-4091-8908-8ecccf0aaf0f"> + <name>OpenIntegrations</name> + <synonym> + <key>ru</key> + <value>Отtoрытый паtoет интеграций</value> + </synonym> + <objectBelonging>Adopted</objectBelonging> + <extension xsi:type="mdclassExtension:ConfigurationExtension"> + <defaultRunMode>Checked</defaultRunMode> + <usePurposes>Checked</usePurposes> + <interfaceCompatibilityMode>Checked</interfaceCompatibilityMode> + </extension> + <containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="12689443-2950-4e3b-b313-9a692b6acac7"/> + <containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="f6f98fbd-010a-4aba-8f11-01203bbc59c7"/> + <containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="33990ba2-16f0-473d-851f-a9132c777ed6"/> + <containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="917bb154-d76e-42a4-b161-336b7c57a1ac"/> + <containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="793db0b3-8d01-4f55-982c-73cb3d4547da"/> + <containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="c67ca98f-c017-4f18-8175-02819e09b383"/> + <containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="c9ed170a-ffaa-4859-9d92-fd1cbc7051b3"/> + <keepMappingToExtendedConfigurationObjectsByIDs>true</keepMappingToExtendedConfigurationObjectsByIDs> + <namePrefix>OPI_</namePrefix> + <configurationExtensionCompatibilityMode>8.3.9</configurationExtensionCompatibilityMode> + <configurationExtensionPurpose>Customization</configurationExtensionPurpose> + <defaultRunMode>ManagedApplication</defaultRunMode> + <usePurposes>PersonalComputer</usePurposes> + <scriptVariant>Russian</scriptVariant> + <vendor>Bayselonarrend</vendor> + <version>1.9.0</version> + <detailedInformation> + <key>ru</key> + <value>Отtoрытый паtoет интеграций - toбор библиотеto for интеграции with неtoоторыми популярными API for 1C:Enterprise. Он withоwithтоит from общих моdулей, toажdый from toоторых отinечает за withinой API, а таtoже неwithtoольtoих моdулей-инwithтрументоin, общих for all.</value> + </detailedInformation> + <vendorInformationAddress> + <key>ru</key> + <value>https://github.com/Bayselonarrend</value> + </vendorInformationAddress> + <configurationInformationAddress> + <key>ru</key> + <value>https://github.com/Bayselonarrend/OpenIntegrations</value> + </configurationInformationAddress> + <languages uuid="0e858b44-34f3-4d20-986d-13290bb5ba5a"> + <name>Руwithwithtoий</name> + <objectBelonging>Adopted</objectBelonging> + <extension xsi:type="mdclassExtension:LanguageExtension"> + <languageCode>Checked</languageCode> + </extension> + <languageCode>ru</languageCode> + </languages> + <subsystems>Subsystem.OPI_Andнтеграция</subsystems> + <commonModules>CommonModule.OPI_Tools</commonModules> + <commonModules>CommonModule.OPI_Cryptography</commonModules> + <commonModules>CommonModule.OPI_TypeConversion</commonModules> + <commonModules>CommonModule.OPI_Telegram</commonModules> + <commonModules>CommonModule.OPI_VK</commonModules> + <commonModules>CommonModule.OPI_Viber</commonModules> + <commonModules>CommonModule.OPI_Twitter</commonModules> + <commonModules>CommonModule.OPI_Notion</commonModules> + <commonModules>CommonModule.OPI_YandexID</commonModules> + <commonModules>CommonModule.OPI_YandexDisk</commonModules> + <commonModules>CommonModule.OPI_GoogleWorkspace</commonModules> + <commonModules>CommonModule.OPI_GoogleCalendar</commonModules> + <commonModules>CommonModule.OPI_GoogleDrive</commonModules> + <commonModules>CommonModule.OPI_GoogleSheets</commonModules> + <commonModules>CommonModule.OPI_Slack</commonModules> + <commonModules>CommonModule.OPI_Airtable</commonModules> + <commonModules>CommonModule.OPI_Dropbox</commonModules> + <commonModules>CommonModule.OPI_Tests</commonModules> + <commonModules>CommonModule.OPI_GetTestData</commonModules> +</mdclass:Configuration> diff --git a/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi b/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi new file mode 100644 index 0000000000..8c570a6481 --- /dev/null +++ b/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/> diff --git a/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo b/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo new file mode 100644 index 0000000000..06461b4314 --- /dev/null +++ b/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="86c261d7-2729-405f-9d39-5d9104a56bd1"> + <name>OPI_Andнтеграция</name> + <synonym> + <key>ru</key> + <value>Andнтеграция</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <includeInCommandInterface>true</includeInCommandInterface> + <content>CommonModule.OPI_Tools</content> + <content>CommonModule.OPI_Cryptography</content> + <content>CommonModule.OPI_TypeConversion</content> + <content>CommonModule.OPI_VK</content> + <content>CommonModule.OPI_Telegram</content> + <content>CommonModule.OPI_Viber</content> + <content>CommonModule.OPI_Twitter</content> + <content>CommonModule.OPI_Notion</content> + <content>CommonModule.OPI_YandexID</content> + <content>CommonModule.OPI_YandexDisk</content> + <content>CommonModule.OPI_GoogleWorkspace</content> + <content>CommonModule.OPI_GoogleCalendar</content> + <content>CommonModule.OPI_GoogleDrive</content> + <content>CommonModule.OPI_GoogleSheets</content> + <content>CommonModule.OPI_Slack</content> + <content>CommonModule.OPI_Airtable</content> + <content>CommonModule.OPI_Tests</content> + <content>CommonModule.OPI_GetTestData</content> +</mdclass:Subsystem> diff --git a/en/OPI/.project b/src/en/OPI/.project similarity index 100% rename from en/OPI/.project rename to src/en/OPI/.project diff --git a/en/OPI/.settings/org.eclipse.core.resources.prefs b/src/en/OPI/.settings/org.eclipse.core.resources.prefs similarity index 100% rename from en/OPI/.settings/org.eclipse.core.resources.prefs rename to src/en/OPI/.settings/org.eclipse.core.resources.prefs diff --git a/en/OPI/DT-INF/PROJECT.PMF b/src/en/OPI/DT-INF/PROJECT.PMF similarity index 100% rename from en/OPI/DT-INF/PROJECT.PMF rename to src/en/OPI/DT-INF/PROJECT.PMF diff --git a/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Airtable/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo b/src/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo rename to src/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo diff --git a/en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo b/src/en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo rename to src/en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo diff --git a/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo b/src/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo rename to src/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo diff --git a/en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo b/src/en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo rename to src/en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo diff --git a/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo rename to src/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo diff --git a/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo rename to src/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo diff --git a/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo rename to src/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo diff --git a/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl new file mode 100644 index 0000000000..7161529741 --- /dev/null +++ b/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl @@ -0,0 +1,173 @@ +// Location OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os +// Library: Google Workspace +// CLI command: 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 + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +// Generate code retrieval link +// Returns URL for browser authorization +// +// Parameters: +// ClientID - String - Client ID - id +// Calendar - Boolean - Calendar methods permission - calendar +// Drive - Boolean - Drive methods permission - drive +// Sheets - Boolean - Sheets methods permission - sheets +// +// Return value: +// String - Code retrieval link +Function FormCodeRetrievalLink(Val ClientID + , Val Calendar = True + , Val Drive = True + , Val Sheets = True) Export + + OPI_TypeConversion.GetLine(ClientID); + OPI_TypeConversion.GetBoolean(Calendar); + OPI_TypeConversion.GetBoolean(Sheets); + OPI_TypeConversion.GetBoolean(Drive); + + URL = "https://accounts.google.com/o/oauth2/auth"; + + URLParameters = New Structure; + URLParameters.Insert("response_type", "code"); + URLParameters.Insert("client_id" , ClientID); + URLParameters.Insert("redirect_uri" , "http://localhost"); + URLParameters.Insert("access_type" , "offline"); + URLParameters.Insert("scope" , GetPermissionsList(Calendar, Drive, Sheets)); + + URL = URL + OPI_Tools.RequestParametersToString(URLParameters); + + Return URL; + +EndFunction + +// Get token by code +// Gets token by code from browser authorization +// +// Parameters: +// ClientID - String - Client ID - id +// ClientSecret - String - Client secret - secret +// Code - String - Code from browser - code +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function GetTokenByCode(Val ClientID, Val ClientSecret, Val Code) Export + + OPI_TypeConversion.GetLine(ClientID); + OPI_TypeConversion.GetLine(ClientSecret); + OPI_TypeConversion.GetLine(Code); + + URL = "https://accounts.google.com/o/oauth2/token"; + + URLParameters = New Structure; + URLParameters.Insert("grant_type" , "authorization_code"); + URLParameters.Insert("client_id" , ClientID); + URLParameters.Insert("client_secret", ClientSecret); + URLParameters.Insert("redirect_uri" , "http://localhost"); + URLParameters.Insert("code" , Code); + + Response = OPI_Tools.Post(URL, URLParameters, , False); + + Return Response; + +EndFunction + +// Refresh token +// Updates token by Refresh token +// +// Parameters: +// ClientID - String - Client ID - id +// ClientSecret - String - Client secret - secret +// RefreshToken - String - Refresh token - refresh +// +// Return value: +// Key-Value Pair - serialized JSON response from Google +Function RefreshToken(Val ClientID, Val ClientSecret, Val RefreshToken) Export + + OPI_TypeConversion.GetLine(ClientID); + OPI_TypeConversion.GetLine(ClientSecret); + OPI_TypeConversion.GetLine(RefreshToken); + + URL = "https://accounts.google.com/o/oauth2/token"; + + URLParameters = New Structure; + URLParameters.Insert("grant_type" , "refresh_token"); + URLParameters.Insert("client_id" , ClientID); + URLParameters.Insert("client_secret", ClientSecret); + URLParameters.Insert("refresh_token", RefreshToken); + + Response = OPI_Tools.Post(URL, URLParameters, , False); + + Return Response; + +EndFunction + +#EndRegion + +#Region ServiceProgramInterface + +Function GetAuthorizationHeader(Val Token) Export + + OPI_TypeConversion.GetLine(Token); + + Headers = New Match; + Headers.Insert("Authorization", "Bearer " + Token); + + Return Headers; + +EndFunction + +#EndRegion + +#Region ServiceProceduresAndFunctions + +Function GetPermissionsList(Calendar, Drive, Sheets) + + Permissions array = New Array; + + If Calendar Then + Permissions array.Add("https://www.googleapis.com/auth/calendar"); + EndIf; + + If Drive Then + Permissions array.Add("https://www.googleapis.com/auth/drive"); + EndIf; + + If Sheets Then + Permissions array.Add("https://www.googleapis.com/auth/spreadsheets"); + EndIf; + + Return StrJoin(Permissions array, " "); + +EndFunction + +#EndRegion diff --git a/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo rename to src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo diff --git a/en/OPI/src/CommonModules/OPI_Notion/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Notion/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Notion/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Notion/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo b/src/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo rename to src/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo diff --git a/en/OPI/src/CommonModules/OPI_Slack/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Slack/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Slack/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Slack/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo b/src/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo rename to src/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo diff --git a/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Telegram/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo b/src/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo rename to src/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo diff --git a/en/OPI/src/CommonModules/OPI_Tools/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Tools/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Tools/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Tools/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo b/src/en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo rename to src/en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo diff --git a/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Twitter/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo b/src/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo rename to src/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo diff --git a/en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl b/src/en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo b/src/en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo rename to src/en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo diff --git a/en/OPI/src/CommonModules/OPI_VK/Module.bsl b/src/en/OPI/src/CommonModules/OPI_VK/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_VK/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_VK/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo b/src/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo rename to src/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo diff --git a/en/OPI/src/CommonModules/OPI_Viber/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Viber/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Viber/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Viber/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo b/src/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo rename to src/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo diff --git a/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/src/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo b/src/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo rename to src/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo diff --git a/src/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl b/src/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl new file mode 100644 index 0000000000..a62bc29112 --- /dev/null +++ b/src/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl @@ -0,0 +1,112 @@ +// Location OS: ./OInt/core/Modules/OPI_YandexID.os +// Library: Yandex ID +// CLI Command: 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 + +// Uncomment if OneScript is executed +// #Use "../../tools" + +#Region ProgrammingInterface + +// Get confirmation code +// Gets the confirmation code and the address of the page where it needs to be entered +// +// Parameters: +// ClientId - String - Client id - id +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function GetConfirmationCode(Val ClientId) Export + + OPI_TypeConversion.GetLine(ClientId); + + Parameters = New Structure("client_id", ClientId); + Response = OPI_Tools.Post("https://oauth.yandex.ru/device/code", Parameters, , False); + + Return Response; + +EndFunction + +// Convert code to token +// Converts the code to a token after entering the code when executing GetConfirmationCode +// +// Parameters: +// ClientId - String - Client id - id +// ClientSecret - String - Client secret - secret +// DeviceCode - String - device_code from GetConfirmationCode() - device +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function ConvertCodeToToken(Val ClientId, Val ClientSecret, Val DeviceCode) Export + + OPI_TypeConversion.GetLine(ClientId); + OPI_TypeConversion.GetLine(ClientSecret); + OPI_TypeConversion.GetLine(DeviceCode); + + Parameters = New Structure; + Parameters.Insert("grant_type" , "device_code"); + Parameters.Insert("code" , DeviceCode); + Parameters.Insert("client_id" , ClientId); + Parameters.Insert("client_secret" , ClientSecret); + + Response = OPI_Tools.Post("https://oauth.yandex.ru/token", Parameters, , False); + + Return Response; + +EndFunction + +// Refresh token +// Updates token by Refresh token +// +// Parameters: +// ClientId - String - Client id - id +// ClientSecret - String - Client secret - secret +// RefreshToken - String - Refresh token - refresh +// +// Return value: +// Key-Value Pair - serialized JSON response from Yandex +Function RefreshToken(Val ClientId, Val ClientSecret, Val RefreshToken) Export + + OPI_TypeConversion.GetLine(ClientId); + OPI_TypeConversion.GetLine(ClientSecret); + OPI_TypeConversion.GetLine(RefreshToken); + + Parameters = New Structure; + Parameters.Insert("grant_type" , "refresh_token"); + Parameters.Insert("refresh_token" , RefreshToken); + Parameters.Insert("client_id" , ClientId); + Parameters.Insert("client_secret" , ClientSecret); + + Response = OPI_Tools.Post("https://oauth.yandex.ru/token", Parameters, , False); + + Return Response; + +EndFunction + +#EndRegion diff --git a/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo b/src/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo rename to src/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo diff --git a/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl similarity index 100% rename from en/OPI/src/CommonModules/OPI_Тесты/Module.bsl rename to src/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl diff --git a/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo b/src/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo similarity index 100% rename from en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo rename to src/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo diff --git a/en/OPI/src/Configuration/Configuration.mdo b/src/en/OPI/src/Configuration/Configuration.mdo similarity index 100% rename from en/OPI/src/Configuration/Configuration.mdo rename to src/en/OPI/src/Configuration/Configuration.mdo diff --git a/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi b/src/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi similarity index 100% rename from en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi rename to src/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi diff --git a/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo b/src/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo similarity index 100% rename from en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo rename to src/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo diff --git a/ru/OInt/core/Modules/OPI_Airtable.os b/src/ru/OInt/core/Modules/OPI_Airtable.os similarity index 98% rename from ru/OInt/core/Modules/OPI_Airtable.os rename to src/ru/OInt/core/Modules/OPI_Airtable.os index 5562675c6e..30abde603a 100644 --- a/ru/OInt/core/Modules/OPI_Airtable.os +++ b/src/ru/OInt/core/Modules/OPI_Airtable.os @@ -1,681 +1,681 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os -// Библиотека: Airtable -// Команда CLI: airtable - -// 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:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСБазами - -// Получить список баз -// Получает список доступных баз -// -// Параметры: -// Токен - Строка - Токен - token -// Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ); - - URL = "https://api.airtable.com/v0/meta/bases"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Параметры = Новый Структура; - - OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить таблицы базы -// Получает схему таблиц базы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать базу -// Создает новую базу данных -// -// Параметры: -// Токен - Строка - Токен - token -// РабочееПространство - Строка - Идентификатор рабочего пространства - ws -// Наименование - Строка - Наименование новой базы - title -// КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц); - - Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура") - И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда - - ВызватьИсключение "Ошибка в данных коллекции таблиц"; - - КонецЕсли; - - URL = "https://api.airtable.com/v0/meta/bases"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - МассивТаблиц = Новый Массив; - - Для Каждого Таблица Из КоллекцияТаблиц Цикл - - Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение); - МассивТаблиц.Добавить(Описание); - - КонецЦикла; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры); - OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТаблицами - -// Создать таблицу -// Создает новую таблицу в базе -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// Наименование - Строка - Наименование новой таблицы - title -// МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata -// Описание - Строка - Описание таблицы - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить таблицу -// Изменяет наименование и|или описание базы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// Таблица - Строка - Идентификатор таблицы - table -// Наименование - Строка - Новое наименование - title -// Описание - Строка - Новое описание - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Параметры = Новый Структура; - - OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСПолями - -// Создать поле -// Создет новое поле в таблице -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы - base -// Таблица - Строка - Идентификатор таблицы - table -// СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля); - - Если Не ТипЗнч(СтруктураПоля) = Тип("Структура") - И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда - - ВызватьИсключение "Ошибка в данных описания поля"; - - КонецЕсли; - - URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить поле -// Изменяет имя и|или описание существующего поля таблицы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы База - base -// Таблица - Строка - Идентификатор таблицы - table -// Поле - Строка - Идентификатор поля - field -// Наименование - Строка - Новое наименование - title -// Описание - Строка - Новое описание - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле); - - URL = "https://api.airtable.com/v0/meta/bases/" - + База - + "/tables/" - + Таблица - + "/fields/" - + Поле; - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить поле (строковое) -// Получает описание поля строкового типа -// -// Параметры: -// Наименование - Строка - Наименование нового поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "richText"); -КонецФункции - -// Получить поле (числовое) -// Получает описание поля числового типа -// -// Параметры: -// Наименование - Строка - Наименование нового поля - title -// Точность - Число,Строка - Число знаков после запятой - precision -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность); - - СтруктураОпций = Новый Структура("precision", Точность); - Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций); - -КонецФункции - -// Получить поле (файл) -// Получает описание поля файлового типа -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеВложения(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments"); -КонецФункции - -// Получить поле (флажок) -// Получает описание поля типа булево -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт - - СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright"); - Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций); - -КонецФункции - -// Получить поле (дата) -// Получает описание поля типа дата -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеДаты(Знач Наименование) Экспорт - - СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso"); - СтруктураОпций = Новый Структура("dateFormat", СтруктураФормата); - - Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций); - -КонецФункции - -// Получить поле (email) -// Получает описание поля с электронной почтой -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеПочты(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "email"); -КонецФункции - -// Получить поле (телефон) -// Получает описание поля с номером телефона -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber"); -КонецФункции - -// Получить поле (url) -// Получает описание поля с URL -// -// Параметры: -// Наименование - Строка - Наименование поля - title -// -// Возвращаемое значение: -// Структура - Описание поля -Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт - Возврат ОписаниеПримитивногоПоля(Наименование, "url"); -КонецФункции - -#КонецОбласти - -#Область РаботаСЗаписями - -// Получить список записей -// Получает список записей выбранной таблицы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить запись -// Получает данные строки таблицы по идентификатору -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать записи -// Создает одну или массив записей по описанию или массиву описаний значений полей -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); - - Параметры = Новый Структура(); - ДобавитьОписаниеДанных(Данные, Параметры); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить записи -// Удаляет одну или массив записей по идентификаторам -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьМассив(Записи); - - СтрокаЗаписей = ""; - - Для Каждого Запись Из Записи Цикл - СтрокаЗаписей = СтрокаЗаписей - + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?") - + "records[]=" - + OPI_Инструменты.ЧислоВСтроку(Запись); - КонецЦикла; - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСКомментариями - -// Получить комментарии -// Получает список комментариев к записи в таблице -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать комментарий -// Создает комментарий к записи в таблице -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Текст - Строка - Текст комментария - text -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить комментарий -// Изменяет текст существующего комментария -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Комментарий - Строка - Идентификатор комментария - comment -// Текст - Строка - Новый текст комментария - text -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить комментарий -// Удаляет комментарий к записи таблицы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - Идентификатор базы данных - base -// Таблица - Строка - Идентификатор таблицы - table -// Запись - Строка - Идентификатор записи в таблице - record -// Комментарий - Строка - Идентификатор комментария - comment -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable -Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); - - URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьЗаголовокАвторизации(Знач Токен) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization", "Bearer " + Токен); - - Возврат Заголовки; - -КонецФункции - -Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей); - - ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей); - - OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы); - - Возврат ОписаниеТаблицы; - -КонецФункции - -Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "") - - СтруктураПоля = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля); - OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля); - OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля); - - Возврат СтруктураПоля; - -КонецФункции - -Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры) - - Если ТипЗнч(Данные) = Тип("Массив") Тогда - - МассивОтправки = Новый Массив; - - Для Каждого ОписаниеЗаписи Из Данные Цикл - МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи)); - КонецЦикла; - - OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры); - - Иначе - - OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os +// Библиотека: Airtable +// Команда CLI: airtable + +// 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:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСБазами + +// Получить список баз +// Получает список доступных баз +// +// Параметры: +// Токен - Строка - Токен - token +// Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ); + + URL = "https://api.airtable.com/v0/meta/bases"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить таблицы базы +// Получает схему таблиц базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать базу +// Создает новую базу данных +// +// Параметры: +// Токен - Строка - Токен - token +// РабочееПространство - Строка - Идентификатор рабочего пространства - ws +// Наименование - Строка - Наименование новой базы - title +// КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц); + + Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура") + И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда + + ВызватьИсключение "Ошибка в данных коллекции таблиц"; + + КонецЕсли; + + URL = "https://api.airtable.com/v0/meta/bases"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + МассивТаблиц = Новый Массив; + + Для Каждого Таблица Из КоллекцияТаблиц Цикл + + Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение); + МассивТаблиц.Добавить(Описание); + + КонецЦикла; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры); + OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТаблицами + +// Создать таблицу +// Создает новую таблицу в базе +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Наименование - Строка - Наименование новой таблицы - title +// МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata +// Описание - Строка - Описание таблицы - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить таблицу +// Изменяет наименование и|или описание базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Таблица - Строка - Идентификатор таблицы - table +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСПолями + +// Создать поле +// Создет новое поле в таблице +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Таблица - Строка - Идентификатор таблицы - table +// СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля); + + Если Не ТипЗнч(СтруктураПоля) = Тип("Структура") + И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда + + ВызватьИсключение "Ошибка в данных описания поля"; + + КонецЕсли; + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить поле +// Изменяет имя и|или описание существующего поля таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы База - base +// Таблица - Строка - Идентификатор таблицы - table +// Поле - Строка - Идентификатор поля - field +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле); + + URL = "https://api.airtable.com/v0/meta/bases/" + + База + + "/tables/" + + Таблица + + "/fields/" + + Поле; + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить поле (строковое) +// Получает описание поля строкового типа +// +// Параметры: +// Наименование - Строка - Наименование нового поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "richText"); +КонецФункции + +// Получить поле (числовое) +// Получает описание поля числового типа +// +// Параметры: +// Наименование - Строка - Наименование нового поля - title +// Точность - Число,Строка - Число знаков после запятой - precision +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность); + + СтруктураОпций = Новый Структура("precision", Точность); + Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций); + +КонецФункции + +// Получить поле (файл) +// Получает описание поля файлового типа +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеВложения(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments"); +КонецФункции + +// Получить поле (флажок) +// Получает описание поля типа булево +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт + + СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright"); + Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций); + +КонецФункции + +// Получить поле (дата) +// Получает описание поля типа дата +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеДаты(Знач Наименование) Экспорт + + СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso"); + СтруктураОпций = Новый Структура("dateFormat", СтруктураФормата); + + Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций); + +КонецФункции + +// Получить поле (email) +// Получает описание поля с электронной почтой +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеПочты(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "email"); +КонецФункции + +// Получить поле (телефон) +// Получает описание поля с номером телефона +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber"); +КонецФункции + +// Получить поле (url) +// Получает описание поля с URL +// +// Параметры: +// Наименование - Строка - Наименование поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "url"); +КонецФункции + +#КонецОбласти + +#Область РаботаСЗаписями + +// Получить список записей +// Получает список записей выбранной таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить запись +// Получает данные строки таблицы по идентификатору +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать записи +// Создает одну или массив записей по описанию или массиву описаний значений полей +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); + + Параметры = Новый Структура(); + ДобавитьОписаниеДанных(Данные, Параметры); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить записи +// Удаляет одну или массив записей по идентификаторам +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьМассив(Записи); + + СтрокаЗаписей = ""; + + Для Каждого Запись Из Записи Цикл + СтрокаЗаписей = СтрокаЗаписей + + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?") + + "records[]=" + + OPI_Инструменты.ЧислоВСтроку(Запись); + КонецЦикла; + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСКомментариями + +// Получить комментарии +// Получает список комментариев к записи в таблице +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать комментарий +// Создает комментарий к записи в таблице +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Текст - Строка - Текст комментария - text +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить комментарий +// Изменяет текст существующего комментария +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Комментарий - Строка - Идентификатор комментария - comment +// Текст - Строка - Новый текст комментария - text +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить комментарий +// Удаляет комментарий к записи таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы данных - base +// Таблица - Строка - Идентификатор таблицы - table +// Запись - Строка - Идентификатор записи в таблице - record +// Комментарий - Строка - Идентификатор комментария - comment +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); + + URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьЗаголовокАвторизации(Знач Токен) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "Bearer " + Токен); + + Возврат Заголовки; + +КонецФункции + +Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей); + + ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей); + + OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы); + + Возврат ОписаниеТаблицы; + +КонецФункции + +Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "") + + СтруктураПоля = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля); + OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля); + OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля); + + Возврат СтруктураПоля; + +КонецФункции + +Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры) + + Если ТипЗнч(Данные) = Тип("Массив") Тогда + + МассивОтправки = Новый Массив; + + Для Каждого ОписаниеЗаписи Из Данные Цикл + МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи)); + КонецЦикла; + + OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры); + + Иначе + + OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Dropbox.os b/src/ru/OInt/core/Modules/OPI_Dropbox.os similarity index 98% rename from ru/OInt/core/Modules/OPI_Dropbox.os rename to src/ru/OInt/core/Modules/OPI_Dropbox.os index ec50f865c9..86abd31dc9 100644 --- a/ru/OInt/core/Modules/OPI_Dropbox.os +++ b/src/ru/OInt/core/Modules/OPI_Dropbox.os @@ -1,961 +1,961 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os -// Библиотека: Dropbox -// Команда CLI: dropbox - -// 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:IncorrectLineBreak-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область АккаунтИАвторизация - -// Получить ссылку авторизации -// Генерирует ссылку авторизации для перехода в браузере -// -// Параметры: -// КлючПриложения - Строка - Ключ приложения - appkey -// -// Возвращаемое значение: -// Строка - URL для перехода в браузере -Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения); - Возврат "https://www.dropbox.com/oauth2/authorize?client_id=" - + КлючПриложения - + "&response_type=code&token_access_type=offline"; - -КонецФункции - -// Получить токен -// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации -// -// Параметры: -// КлючПриложения - Строка - Ключ приложения - appkey -// СекретПриложения - Строка - Секрет приложения - appsecret -// Код - Строка - Код со страницы авторизации - code -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт - - URL = "https://api.dropbox.com/oauth2/token"; - ТипДанных = "application/x-www-form-urlencoded; charset=utf-8"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("code" , Код , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры); - - СтруктураURL = OPI_Инструменты.РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных); - Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения); - - СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - - Запрос.УстановитьТелоИзСтроки(Данные); - - Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос); - OPI_Инструменты.ОбработатьОтвет(Ответ); - - Возврат Ответ; - -КонецФункции - -// Обновить токен -// Получает новый токен на основе рефреш токена -// -// Параметры: -// КлючПриложения - Строка - Ключ приложения - appkey -// СекретПриложения - Строка - Секрет приложения - appsecret -// РефрешТокен - Строка - Рефреш токен - refresh -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт - - Строка_ = "Строка"; - URL = "https://api.dropbox.com/oauth2/token"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("grant_type" , "refresh_token" , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("client_id" , КлючПриложения , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь); - - Возврат Ответ; - -КонецФункции - -// Получить информацию об аккаунте -// Получает информацию об аккаунте -// -// Параметры: -// Токен - Строка - Токен - token -// Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт - - Если ЗначениеЗаполнено(Аккаунт) Тогда - Результат = ПолучитьАккаунт(Токен, Аккаунт); - Иначе - Результат = ПолучитьСвойАккаунт(Токен); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Получить данные использования пространства -// Получает информацию о количестве использованного дискового пространства -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт - - URL = "https://api.dropboxapi.com/2/users/get_space_usage"; - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.PostBinary(URL - , ПолучитьДвоичныеДанныеИзСтроки("null") - , Заголовки - , - , "text/plain; charset=dropbox-cors-hack"); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСФайламиИКаталогами - -// Получить информацию об объекте -// Получает информацию о файле или каталоге -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт - - URL = "https://api.dropboxapi.com/2/files/get_metadata"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список файлов папки -// Получает список первых файлов каталога или продолжает получение следующих при указании курсора -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к каталогу. Необязателен, если указан курсор - path -// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail -// Курсор - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor -// -// Возвращаемое значение: -// HTTPОтвет - Получить список файлов папки -Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт - - Если Не ЗначениеЗаполнено(Курсор) Тогда - - URL = "https://api.dropboxapi.com/2/files/list_folder"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно , "Булево", Параметры); - - Иначе - - URL = "https://api.dropboxapi.com/2/files/list_folder/continue"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); - - КонецЕсли; - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить превью -// Получает PDF или HTML превью объекта (только для токументов) -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// -// Возвращаемое значение: -// ДвоичныеДанные - превью документа -Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт - - URL = "https://content.dropboxapi.com/2/files/get_preview"; - Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл -// Загружает файл на облачный диск -// -// Параметры: -// Токен - Строка - Токен - token -// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file -// Путь - Строка - Путь сохранения на Dropbox - path -// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Режим = ?(Перезаписывать, "overwrite", "add"); - Размер = Файл.Размер(); - Граница = 100000000; - - Если Размер > Граница Тогда - Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим); - Иначе - Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -// Загрузить файл по URL -// Загружает файл на облачный диск, получая его по указанному URL -// -// Параметры: -// Токен - Строка - Токен - token -// URLФайла - Строка - URL источник файла - url -// Путь - Строка - Путь сохранения на Dropbox - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт - - URL = "https://api.dropboxapi.com/2/files/save_url"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить статус загрузки по URL -// Получает статус загрузки файла по URL -// -// Параметры: -// Токен - Строка - Токен - token -// IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт - - URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить объект -// Удаляет объект с облачного диска -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту удаления - path -// БезВозвратно - Строка - Удалить объект без возможности востановления - permanently -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно); - - Если Безвозвратно Тогда - URL = "https://api.dropboxapi.com/2/files/permanently_delete"; - Иначе - URL = "https://api.dropboxapi.com/2/files/delete_v2"; - КонецЕсли; - - Ответ = ОбработатьОбъект(Токен, URL, Путь); - - Возврат Ответ; - -КонецФункции - -// Копировать объект -// Копирует файл или каталог по выбранному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Откуда - Строка - Путь к объекту оригинала - form -// Куда - Строка - Целевой путь для нового объекта - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт - - URL = "https://api.dropboxapi.com/2/files/copy_v2"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Переместить объект -// Перемещает объект по выбранному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Откуда - Строка - Путь к объекту оригинала - form -// Куда - Строка - Целевой путь для нового объекта - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт - - URL = "https://api.dropboxapi.com/2/files/move_v2"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать папку -// Создает пустой каталог по выбранному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Целевой путь создания каталога - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт - - URL = "https://api.dropboxapi.com/2/files/create_folder_v2"; - Ответ = ОбработатьОбъект(Токен, URL, Путь); - - Возврат Ответ; - -КонецФункции - -// Скачать файл -// Скачивает файл по указанному пути или ID -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь или ID файла - path -// -// Возвращаемое значение: -// ДвоичныеДанные - двоичные данные файла -Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт - - URL = "https://content.dropboxapi.com/2/files/download"; - Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); - - Возврат Ответ; - -КонецФункции - -// Скачать папку -// Скачивает zip архив с содержимым указанного каталога -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь или ID каталога - path -// -// Возвращаемое значение: -// ДвоичныеДанные - двоичные данные zip архива с содержимым каталога -Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт - - URL = "https://content.dropboxapi.com/2/files/download_zip"; - Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); - - Возврат Ответ; - -КонецФункции - -// Получить список версий объекта -// Получает список версий (ревизий) объекта -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// Количество - Строка, Число - Число последних версий объекта для отображения - amount -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт - - URL = "https://api.dropboxapi.com/2/files/list_revisions"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Восстановить объект к версии -// Восстанавливает состояние объекта к необходимой версии (ревизии) -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту - path -// Версия - Строка - ID версии (ревизии) для востановления - rev -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт - - URL = "https://api.dropboxapi.com/2/files/restore"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТегами - -// Получить список тегов -// Получает список тегов выбранных файлов -// -// Параметры: -// Токен - Строка - Токен - token -// Пути - Строка, Массив Из Строка - Путь или набору путей к файлам - paths -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт - - URL = "https://api.dropboxapi.com/2/files/tags/get"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Добавить тег -// Добавляет новый текстовый тег к файлу или каталогу -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту, для которого необходимо создать тег - path -// Тег - Строка - Текст тега - tag -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт - - Возврат ОбработатьТег(Токен, Путь, Тег); - -КонецФункции - -// Удалить тег -// Удаляет текстовый тег файла или каталога -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к объекту, тег которого необходимо удалить - path -// Тег - Строка - Текст тега - tag -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт - - Возврат ОбработатьТег(Токен, Путь, Тег, Истина); - -КонецФункции - -#КонецОбласти - -#Область НастройкиСовместногоДоступа - -// Опубликовать папку -// Переводит каталог в режим публичного доступа -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к целевому каталогу - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт - - URL = "https://api.dropboxapi.com/2/sharing/share_folder"; - Ответ = ОбработатьОбъект(Токен, URL, Путь); - - Возврат Ответ; - -КонецФункции - -// Отменить публикацию папки -// Отменяет режим общего доступа для каталога -// -// Параметры: -// Токен - Строка - Токен - token -// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт - - URL = "https://api.dropboxapi.com/2/sharing/unshare_folder"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Добавить пользователя к файлу -// Определяет доступ к файлу для стороннего пользователя -// -// Параметры: -// Токен - Строка - Токен - token -// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid -// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails -// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт - - Строка_ = "Строка"; - - OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); - OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); - - Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда - IDФайла = "id:" + IDФайла; - КонецЕсли; - - URL = "https://api.dropboxapi.com/2/sharing/add_file_member"; - - МассивПользователей = Новый Массив; - - Для Каждого Адрес Из АдресаПочты Цикл - - ДанныеПользователя = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); - OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); - - МассивПользователей.Добавить(ДанныеПользователя); - - КонецЦикла; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file" , IDФайла , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры); - - Режим = ?(ТолькоПросмотр, "viewer", "editor"); - - OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Добавить пользователей к папке -// Предоставляет стороннии пользователям доступ к каталогу -// -// Параметры: -// Токен - Строка - Токен - token -// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder -// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails -// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly -// -// Возвращаемое значение: -// Неопределено - пустой ответ -Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт - - Строка_ = "Строка"; - - OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); - OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); - Режим = ?(ТолькоПросмотр, "viewer", "editor"); - - URL = "https://api.dropboxapi.com/2/sharing/add_folder_member"; - - МассивПользователей = Новый Массив; - - Для Каждого Адрес Из АдресаПочты Цикл - - ДанныеПользователя = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); - OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); - - СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим); - - МассивПользователей.Добавить(СтруктураПользователя); - - КонецЦикла; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("members" , МассивПользователей , "Массив", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить статус асинхронного изменения -// Получает статус асинхронной работы по изменению доступов -// -// Параметры: -// Токен - Строка - Токен - 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, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Отменить публикацию файла -// Запрещает доступ к файлу для внешних пользователей -// -// Параметры: -// Токен - Строка - Токен - token -// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox -Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); - - Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда - IDФайла = "id:" + IDФайла; - КонецЕсли; - - URL = "https://api.dropboxapi.com/2/sharing/unshare_file"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь) - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры); - - Если ВЗаголовках Тогда - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); - Иначе - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь) - - Если ЭтоУдаление Тогда - URL = "https://api.dropboxapi.com/2/files/tags/remove"; - Иначе - URL = "https://api.dropboxapi.com/2/files/tags/add"; - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("path" , Путь, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization" , "Bearer " + Токен); - - Если ЗначениеЗаполнено(Параметры) Тогда - - JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет"); - JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, ""); - - Заголовки.Вставить("Dropbox-API-Arg", JSON); - - КонецЕсли; - - Возврат Заголовки; - -КонецФункции - -Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) - - URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; - - РазмерЧасти = 100000000; - ТекущаяПозиция = 0; - ПрочитаноБайт = 0; - ОбщийРазмер = Файл.Размер(); - Сессия = ОткрытьСессию(Токен); - - Пока ПрочитаноБайт < ОбщийРазмер Цикл - - Отступ = ТекущаяПозиция; - Курсор = Новый Структура("offset,session_id", Отступ, Сессия); - - Параметры = Новый Структура("cursor", Курсор); - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - - ЧтениеДанных = Новый ЧтениеДанных(Файл); - ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); - Результат = ЧтениеДанных.Прочитать(РазмерЧасти); - ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); - РазмерТекущих = ТекущиеДанные.Размер(); - СледующаяПозиция = ТекущаяПозиция + РазмерТекущих; - - Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда - Прервать; - КонецЕсли; - - Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки); - - ТекущаяПозиция = СледующаяПозиция; - - КБайт = 1024; - МБайт = КБайт * КБайт; - Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); - - ВыполнитьСборкуМусора(); - ОсвободитьОбъект(ТекущиеДанные); - - КонецЦикла; - - Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия); - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) - - Булево_ = "Булево"; - Строка_ = "Строка"; - URL = "https://content.dropboxapi.com/2/files/upload"; - - Параметры = Новый Структура; - - OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , Булево_, Параметры); - OPI_Инструменты.ДобавитьПоле("mode" , Режим, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("mute" , Ложь , Булево_, Параметры); - OPI_Инструменты.ДобавитьПоле("path" , Путь , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - - Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ОткрытьСессию(Знач Токен) - - SessionId = "session_id"; - URL = "https://content.dropboxapi.com/2/files/upload_session/start"; - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); - - Возврат Ответ[SessionId]; - -КонецФункции - -Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия) - - URL = "https://content.dropboxapi.com/2/files/upload_session/finish"; - - Коммит = Новый Структура(); - OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит); - OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит); - - Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия); - - Параметры = Новый Структура("commit,cursor", Коммит, Курсор); - Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); - - Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт) - - URL = "https://api.dropboxapi.com/2/users/get_account"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры); - - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьСвойАккаунт(Знач Токен) - - URL = "https://api.dropboxapi.com/2/users/get_current_account"; - Заголовки = ПолучитьЗаголовкиЗапроса(Токен); - - Ответ = OPI_Инструменты.PostBinary(URL - , ПолучитьДвоичныеДанныеИзСтроки("null") - , Заголовки - , - , "text/plain; charset=dropbox-cors-hack"); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os +// Библиотека: Dropbox +// Команда CLI: dropbox + +// 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:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область АккаунтИАвторизация + +// Получить ссылку авторизации +// Генерирует ссылку авторизации для перехода в браузере +// +// Параметры: +// КлючПриложения - Строка - Ключ приложения - appkey +// +// Возвращаемое значение: +// Строка - URL для перехода в браузере +Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения); + Возврат "https://www.dropbox.com/oauth2/authorize?client_id=" + + КлючПриложения + + "&response_type=code&token_access_type=offline"; + +КонецФункции + +// Получить токен +// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации +// +// Параметры: +// КлючПриложения - Строка - Ключ приложения - appkey +// СекретПриложения - Строка - Секрет приложения - appsecret +// Код - Строка - Код со страницы авторизации - code +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт + + URL = "https://api.dropbox.com/oauth2/token"; + ТипДанных = "application/x-www-form-urlencoded; charset=utf-8"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("code" , Код , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры); + + СтруктураURL = OPI_Инструменты.РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных); + Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения); + + СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); + + Запрос.УстановитьТелоИзСтроки(Данные); + + Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос); + OPI_Инструменты.ОбработатьОтвет(Ответ); + + Возврат Ответ; + +КонецФункции + +// Обновить токен +// Получает новый токен на основе рефреш токена +// +// Параметры: +// КлючПриложения - Строка - Ключ приложения - appkey +// СекретПриложения - Строка - Секрет приложения - appsecret +// РефрешТокен - Строка - Рефреш токен - refresh +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт + + Строка_ = "Строка"; + URL = "https://api.dropbox.com/oauth2/token"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("grant_type" , "refresh_token" , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("client_id" , КлючПриложения , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь); + + Возврат Ответ; + +КонецФункции + +// Получить информацию об аккаунте +// Получает информацию об аккаунте +// +// Параметры: +// Токен - Строка - Токен - token +// Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт + + Если ЗначениеЗаполнено(Аккаунт) Тогда + Результат = ПолучитьАккаунт(Токен, Аккаунт); + Иначе + Результат = ПолучитьСвойАккаунт(Токен); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Получить данные использования пространства +// Получает информацию о количестве использованного дискового пространства +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт + + URL = "https://api.dropboxapi.com/2/users/get_space_usage"; + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.PostBinary(URL + , ПолучитьДвоичныеДанныеИзСтроки("null") + , Заголовки + , + , "text/plain; charset=dropbox-cors-hack"); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСФайламиИКаталогами + +// Получить информацию об объекте +// Получает информацию о файле или каталоге +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт + + URL = "https://api.dropboxapi.com/2/files/get_metadata"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список файлов папки +// Получает список первых файлов каталога или продолжает получение следующих при указании курсора +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к каталогу. Необязателен, если указан курсор - path +// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail +// Курсор - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor +// +// Возвращаемое значение: +// HTTPОтвет - Получить список файлов папки +Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт + + Если Не ЗначениеЗаполнено(Курсор) Тогда + + URL = "https://api.dropboxapi.com/2/files/list_folder"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно , "Булево", Параметры); + + Иначе + + URL = "https://api.dropboxapi.com/2/files/list_folder/continue"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); + + КонецЕсли; + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить превью +// Получает PDF или HTML превью объекта (только для токументов) +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// +// Возвращаемое значение: +// ДвоичныеДанные - превью документа +Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт + + URL = "https://content.dropboxapi.com/2/files/get_preview"; + Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл +// Загружает файл на облачный диск +// +// Параметры: +// Токен - Строка - Токен - token +// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file +// Путь - Строка - Путь сохранения на Dropbox - path +// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Режим = ?(Перезаписывать, "overwrite", "add"); + Размер = Файл.Размер(); + Граница = 100000000; + + Если Размер > Граница Тогда + Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим); + Иначе + Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +// Загрузить файл по URL +// Загружает файл на облачный диск, получая его по указанному URL +// +// Параметры: +// Токен - Строка - Токен - token +// URLФайла - Строка - URL источник файла - url +// Путь - Строка - Путь сохранения на Dropbox - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт + + URL = "https://api.dropboxapi.com/2/files/save_url"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить статус загрузки по URL +// Получает статус загрузки файла по URL +// +// Параметры: +// Токен - Строка - Токен - token +// IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт + + URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить объект +// Удаляет объект с облачного диска +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту удаления - path +// БезВозвратно - Строка - Удалить объект без возможности востановления - permanently +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно); + + Если Безвозвратно Тогда + URL = "https://api.dropboxapi.com/2/files/permanently_delete"; + Иначе + URL = "https://api.dropboxapi.com/2/files/delete_v2"; + КонецЕсли; + + Ответ = ОбработатьОбъект(Токен, URL, Путь); + + Возврат Ответ; + +КонецФункции + +// Копировать объект +// Копирует файл или каталог по выбранному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Откуда - Строка - Путь к объекту оригинала - form +// Куда - Строка - Целевой путь для нового объекта - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт + + URL = "https://api.dropboxapi.com/2/files/copy_v2"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Переместить объект +// Перемещает объект по выбранному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Откуда - Строка - Путь к объекту оригинала - form +// Куда - Строка - Целевой путь для нового объекта - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт + + URL = "https://api.dropboxapi.com/2/files/move_v2"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать папку +// Создает пустой каталог по выбранному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Целевой путь создания каталога - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт + + URL = "https://api.dropboxapi.com/2/files/create_folder_v2"; + Ответ = ОбработатьОбъект(Токен, URL, Путь); + + Возврат Ответ; + +КонецФункции + +// Скачать файл +// Скачивает файл по указанному пути или ID +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь или ID файла - path +// +// Возвращаемое значение: +// ДвоичныеДанные - двоичные данные файла +Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт + + URL = "https://content.dropboxapi.com/2/files/download"; + Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); + + Возврат Ответ; + +КонецФункции + +// Скачать папку +// Скачивает zip архив с содержимым указанного каталога +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь или ID каталога - path +// +// Возвращаемое значение: +// ДвоичныеДанные - двоичные данные zip архива с содержимым каталога +Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт + + URL = "https://content.dropboxapi.com/2/files/download_zip"; + Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина); + + Возврат Ответ; + +КонецФункции + +// Получить список версий объекта +// Получает список версий (ревизий) объекта +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// Количество - Строка, Число - Число последних версий объекта для отображения - amount +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт + + URL = "https://api.dropboxapi.com/2/files/list_revisions"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Восстановить объект к версии +// Восстанавливает состояние объекта к необходимой версии (ревизии) +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту - path +// Версия - Строка - ID версии (ревизии) для востановления - rev +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт + + URL = "https://api.dropboxapi.com/2/files/restore"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТегами + +// Получить список тегов +// Получает список тегов выбранных файлов +// +// Параметры: +// Токен - Строка - Токен - token +// Пути - Строка, Массив Из Строка - Путь или набору путей к файлам - paths +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт + + URL = "https://api.dropboxapi.com/2/files/tags/get"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Добавить тег +// Добавляет новый текстовый тег к файлу или каталогу +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту, для которого необходимо создать тег - path +// Тег - Строка - Текст тега - tag +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт + + Возврат ОбработатьТег(Токен, Путь, Тег); + +КонецФункции + +// Удалить тег +// Удаляет текстовый тег файла или каталога +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к объекту, тег которого необходимо удалить - path +// Тег - Строка - Текст тега - tag +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт + + Возврат ОбработатьТег(Токен, Путь, Тег, Истина); + +КонецФункции + +#КонецОбласти + +#Область НастройкиСовместногоДоступа + +// Опубликовать папку +// Переводит каталог в режим публичного доступа +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к целевому каталогу - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт + + URL = "https://api.dropboxapi.com/2/sharing/share_folder"; + Ответ = ОбработатьОбъект(Токен, URL, Путь); + + Возврат Ответ; + +КонецФункции + +// Отменить публикацию папки +// Отменяет режим общего доступа для каталога +// +// Параметры: +// Токен - Строка - Токен - token +// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт + + URL = "https://api.dropboxapi.com/2/sharing/unshare_folder"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Добавить пользователя к файлу +// Определяет доступ к файлу для стороннего пользователя +// +// Параметры: +// Токен - Строка - Токен - token +// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid +// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails +// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт + + Строка_ = "Строка"; + + OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); + OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); + + Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда + IDФайла = "id:" + IDФайла; + КонецЕсли; + + URL = "https://api.dropboxapi.com/2/sharing/add_file_member"; + + МассивПользователей = Новый Массив; + + Для Каждого Адрес Из АдресаПочты Цикл + + ДанныеПользователя = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); + OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); + + МассивПользователей.Добавить(ДанныеПользователя); + + КонецЦикла; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file" , IDФайла , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры); + + Режим = ?(ТолькоПросмотр, "viewer", "editor"); + + OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Добавить пользователей к папке +// Предоставляет стороннии пользователям доступ к каталогу +// +// Параметры: +// Токен - Строка - Токен - token +// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder +// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails +// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly +// +// Возвращаемое значение: +// Неопределено - пустой ответ +Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт + + Строка_ = "Строка"; + + OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты); + OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр); + Режим = ?(ТолькоПросмотр, "viewer", "editor"); + + URL = "https://api.dropboxapi.com/2/sharing/add_folder_member"; + + МассивПользователей = Новый Массив; + + Для Каждого Адрес Из АдресаПочты Цикл + + ДанныеПользователя = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя); + OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя); + + СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим); + + МассивПользователей.Добавить(СтруктураПользователя); + + КонецЦикла; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("members" , МассивПользователей , "Массив", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить статус асинхронного изменения +// Получает статус асинхронной работы по изменению доступов +// +// Параметры: +// Токен - Строка - Токен - 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, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Отменить публикацию файла +// Запрещает доступ к файлу для внешних пользователей +// +// Параметры: +// Токен - Строка - Токен - token +// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox +Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); + + Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда + IDФайла = "id:" + IDФайла; + КонецЕсли; + + URL = "https://api.dropboxapi.com/2/sharing/unshare_file"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь) + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры); + + Если ВЗаголовках Тогда + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); + Иначе + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь) + + Если ЭтоУдаление Тогда + URL = "https://api.dropboxapi.com/2/files/tags/remove"; + Иначе + URL = "https://api.dropboxapi.com/2/files/tags/add"; + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("path" , Путь, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization" , "Bearer " + Токен); + + Если ЗначениеЗаполнено(Параметры) Тогда + + JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет"); + JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, ""); + + Заголовки.Вставить("Dropbox-API-Arg", JSON); + + КонецЕсли; + + Возврат Заголовки; + +КонецФункции + +Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) + + URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; + + РазмерЧасти = 100000000; + ТекущаяПозиция = 0; + ПрочитаноБайт = 0; + ОбщийРазмер = Файл.Размер(); + Сессия = ОткрытьСессию(Токен); + + Пока ПрочитаноБайт < ОбщийРазмер Цикл + + Отступ = ТекущаяПозиция; + Курсор = Новый Структура("offset,session_id", Отступ, Сессия); + + Параметры = Новый Структура("cursor", Курсор); + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + + ЧтениеДанных = Новый ЧтениеДанных(Файл); + ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); + Результат = ЧтениеДанных.Прочитать(РазмерЧасти); + ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); + РазмерТекущих = ТекущиеДанные.Размер(); + СледующаяПозиция = ТекущаяПозиция + РазмерТекущих; + + Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда + Прервать; + КонецЕсли; + + Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки); + + ТекущаяПозиция = СледующаяПозиция; + + КБайт = 1024; + МБайт = КБайт * КБайт; + Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); + + ВыполнитьСборкуМусора(); + ОсвободитьОбъект(ТекущиеДанные); + + КонецЦикла; + + Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия); + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим) + + Булево_ = "Булево"; + Строка_ = "Строка"; + URL = "https://content.dropboxapi.com/2/files/upload"; + + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , Булево_, Параметры); + OPI_Инструменты.ДобавитьПоле("mode" , Режим, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("mute" , Ложь , Булево_, Параметры); + OPI_Инструменты.ДобавитьПоле("path" , Путь , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + + Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ОткрытьСессию(Знач Токен) + + SessionId = "session_id"; + URL = "https://content.dropboxapi.com/2/files/upload_session/start"; + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); + + Возврат Ответ[SessionId]; + +КонецФункции + +Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия) + + URL = "https://content.dropboxapi.com/2/files/upload_session/finish"; + + Коммит = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит); + OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит); + + Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия); + + Параметры = Новый Структура("commit,cursor", Коммит, Курсор); + Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры); + + Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт) + + URL = "https://api.dropboxapi.com/2/users/get_account"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры); + + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьСвойАккаунт(Знач Токен) + + URL = "https://api.dropboxapi.com/2/users/get_current_account"; + Заголовки = ПолучитьЗаголовкиЗапроса(Токен); + + Ответ = OPI_Инструменты.PostBinary(URL + , ПолучитьДвоичныеДанныеИзСтроки("null") + , Заголовки + , + , "text/plain; charset=dropbox-cors-hack"); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleCalendar.os b/src/ru/OInt/core/Modules/OPI_GoogleCalendar.os similarity index 98% rename from ru/OInt/core/Modules/OPI_GoogleCalendar.os rename to src/ru/OInt/core/Modules/OPI_GoogleCalendar.os index 639c88a94b..39655aaeb8 100644 --- a/ru/OInt/core/Modules/OPI_GoogleCalendar.os +++ b/src/ru/OInt/core/Modules/OPI_GoogleCalendar.os @@ -1,631 +1,631 @@ -// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os -// Библиотека: Google Calendar -// Команда CLI: gcalendar - -// 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 -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars"; - - Параметры = Новый Структура; - Параметры.Вставить("summary" , Наименование); - Параметры.Вставить("timeZone", "Europe/Moscow"); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить календарь -// Получает информацию о календаре по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить календарь -// Изменяет свойства существуещего календаря -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// Наименование - Строка - Новое наименование - title -// Описание - Строка - Новое описание календаря - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ИзменитьМетаданныеКалендаря(Знач Токен - , Знач Календарь - , Знач Наименование = "" - , Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Наименование) Тогда - Параметры.Вставить("summary", Наименование); - КонецЕсли; - - Если ЗначениеЗаполнено(Описание) Тогда - Параметры.Вставить("description", Описание); - КонецЕсли; - - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); - - Возврат Ответ; - -КонецФункции - -// Очистить основной календарь -// Очищает список событий основного календаря -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; - Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь); - - Возврат Ответ; - -КонецФункции - -// Удалить календарь -// Удаляет календарь по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСоСпискомКалендарей - -// Получить список календарей -// Получает массив календарей аккаунта -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий данных календарей -Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивКалендарей = Новый Массив; - - ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей); - - Возврат МассивКалендарей; - -КонецФункции - -// Добавить календарь в список -// Добавляет существующий календарь в список пользователя -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; - - Параметры = Новый Структура; - Параметры.Вставить("id", Календарь); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить календарь списка -// Получает календарь из списка пользователя по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить календарь из списка -// Удаляет календарь из списка пользователя -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить календарь списка -// Изменяет свойства календаря из списка пользователей -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary -// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary -// Скрытый - Булево - Скрытый календарь - hidden -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ИзменитьКалендарьСписка(Знач Токен - , Знач Календарь - , Знач ОсновнойЦвет - , Знач ДополнительныйЦвет - , Знач Скрытый = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет); - OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true"; - - Параметры = Новый Соответствие; - Параметры.Вставить("hidden" , Скрытый); - Параметры.Вставить("foregroundColor", ОсновнойЦвет); - Параметры.Вставить("backgroundColor", ДополнительныйЦвет); - - Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаССобытиями - -// Получить описание события !NOCLI -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Пустой макет события -Функция ПолучитьОписаниеСобытия() Экспорт - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - Час = 3600; - Событие = Новый Соответствие; - - Событие.Вставить("Описание" , ""); // Описание события - Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события - Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения - Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события - Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события - Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу - Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам - - Возврат Событие; - -КонецФункции - -// Получить список событий -// Получает список всех событий календаря -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий событий -Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивСобытий = Новый Массив; - - ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий); - - Возврат МассивСобытий; - -КонецФункции - -// Получить событие -// Получает событие по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// Событие - Строка - ID события - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + Календарь - + "/events/" - + Событие; - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать событие -// Создает новое событие -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props -// -// Возвращаемое значение: -// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google -Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт - Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия); -КонецФункции - -// Переместить событие -// Перемещает событие в другой календарь -// -// Параметры: -// Токен - Строка - Токен - token -// КалендарьИсточник - Строка - ID календаря источника - from -// КалендарьПриемник - Строка - ID календаря приемника - to -// Событие - Строка - ID события календаря источника - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник); - OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + КалендарьИсточник - + "/events/" - + Событие - + "/move?destination=" - + КалендарьПриемник; - - Ответ = OPI_Инструменты.Post(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить событие -// Изменяет существующее событие -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// ОписаниеСобытия - Строка - Новое описание события - props -// Событие - Строка - ID события - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт - Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие); -КонецФункции - -// Удалить событие -// Удаляет событие по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Календарь - Строка - ID календаря - calendar -// Событие - Строка - ID события - event -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + Календарь - + "/events/" - + Событие; - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПреобразоватьДату(Знач Дата) - - OPI_ПреобразованиеТипов.ПолучитьДату(Дата); - - СтруктураДаты = Новый Структура; - - Если Не ТипЗнч(Дата) = Тип("Дата") Тогда - Возврат Неопределено; - КонецЕсли; - - Если Дата = НачалоДня(Дата) Тогда - ФорматДаты = "ДФ=yyyy-MM-dd"; - Поле = "date"; - Иначе - ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ"; - Поле = "dateTime"; - КонецЕсли; - - Дата = Формат(Дата, ФорматДаты); - СтруктураДаты.Вставить(Поле , Дата); - СтруктураДаты.Вставить("timeZone", "Europe/Moscow"); - - Возврат СтруктураДаты; - -КонецФункции - -Функция ПреобразоватьВложения(Знач Вложения) - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения); - - МассивВложений = Новый Массив; - - Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда - - Для Каждого Вложение Из Вложения Цикл - - ТекущеВложение = Новый Структура; - ТекущеВложение.Вставить("title" , Вложение.Ключ); - ТекущеВложение.Вставить("fileUrl", Вложение.Значение); - - МассивВложений.Добавить(ТекущеВложение); - - КонецЦикла; - - КонецЕсли; - - Если МассивВложений.Количество() > 0 Тогда - Возврат МассивВложений; - Иначе - Возврат Неопределено; - КонецЕсли; - -КонецФункции - -Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - Существующее = ЗначениеЗаполнено(Событие); - URL = "https://www.googleapis.com/calendar/v3/calendars/" - + Календарь - + "/events" - + ?(Существующее, "/" + Событие, ""); - - Дата0 = ОписаниеСобытия["ДатаНачала"]; - Дата1 = ОписаниеСобытия["ДатаОкончания"]; - Вложения = ОписаниеСобытия["МассивURLФайловВложений"]; - Вложения = ПреобразоватьВложения(Вложения); - Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено - , Ложь - , ОписаниеСобытия["ОтправлятьУведомления"]); - - Параметры = Новый Структура; - Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]); - Параметры.Вставить("description", ОписаниеСобытия["Описание"]); - Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]); - Параметры.Вставить("start" , ПреобразоватьДату(Дата0)); - Параметры.Вставить("end" , ПреобразоватьДату(Дата1)); - Параметры.Вставить("attachments", Вложения); - - ПараметрыURL = Новый Структура; - ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none")); - ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false")); - - URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); - - OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); - - Если Существующее Тогда - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); - Иначе - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") - - Items = "items"; - NPT = "nextPageToken"; - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Страница) Тогда - Параметры.Вставить("pageToken", Страница); - КонецЕсли; - - Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList" - , Параметры - , Заголовки); - - Календари = Результат[Items]; - Страница = Результат[NPT]; - - Для Каждого Календарь Из Календари Цикл - МассивКалендарей.Добавить(Календарь); - КонецЦикла; - - Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда - ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница); - КонецЕсли; - -КонецПроцедуры - -Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") - - Items = "items"; - NPT = "nextPageToken"; - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Страница) Тогда - Параметры.Вставить("pageToken", Страница); - КонецЕсли; - - Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events" - , Параметры - , Заголовки); - - События = Результат[Items]; - Страница = Результат[NPT]; - - Для Каждого Событие Из События Цикл - МассивСобытий.Добавить(Событие); - КонецЦикла; - - Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда - ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os +// Библиотека: Google Calendar +// Команда CLI: gcalendar + +// 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 +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars"; + + Параметры = Новый Структура; + Параметры.Вставить("summary" , Наименование); + Параметры.Вставить("timeZone", "Europe/Moscow"); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить календарь +// Получает информацию о календаре по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить календарь +// Изменяет свойства существуещего календаря +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание календаря - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ИзменитьМетаданныеКалендаря(Знач Токен + , Знач Календарь + , Знач Наименование = "" + , Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Наименование) Тогда + Параметры.Вставить("summary", Наименование); + КонецЕсли; + + Если ЗначениеЗаполнено(Описание) Тогда + Параметры.Вставить("description", Описание); + КонецЕсли; + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); + + Возврат Ответ; + +КонецФункции + +// Очистить основной календарь +// Очищает список событий основного календаря +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear"; + Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь); + + Возврат Ответ; + +КонецФункции + +// Удалить календарь +// Удаляет календарь по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСоСпискомКалендарей + +// Получить список календарей +// Получает массив календарей аккаунта +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий данных календарей +Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивКалендарей = Новый Массив; + + ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей); + + Возврат МассивКалендарей; + +КонецФункции + +// Добавить календарь в список +// Добавляет существующий календарь в список пользователя +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; + + Параметры = Новый Структура; + Параметры.Вставить("id", Календарь); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить календарь списка +// Получает календарь из списка пользователя по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить календарь из списка +// Удаляет календарь из списка пользователя +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить календарь списка +// Изменяет свойства календаря из списка пользователей +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary +// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary +// Скрытый - Булево - Скрытый календарь - hidden +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ИзменитьКалендарьСписка(Знач Токен + , Знач Календарь + , Знач ОсновнойЦвет + , Знач ДополнительныйЦвет + , Знач Скрытый = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет); + OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true"; + + Параметры = Новый Соответствие; + Параметры.Вставить("hidden" , Скрытый); + Параметры.Вставить("foregroundColor", ОсновнойЦвет); + Параметры.Вставить("backgroundColor", ДополнительныйЦвет); + + Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаССобытиями + +// Получить описание события !NOCLI +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Пустой макет события +Функция ПолучитьОписаниеСобытия() Экспорт + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + Час = 3600; + Событие = Новый Соответствие; + + Событие.Вставить("Описание" , ""); // Описание события + Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события + Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения + Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события + Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события + Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу + Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам + + Возврат Событие; + +КонецФункции + +// Получить список событий +// Получает список всех событий календаря +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий событий +Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивСобытий = Новый Массив; + + ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий); + + Возврат МассивСобытий; + +КонецФункции + +// Получить событие +// Получает событие по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// Событие - Строка - ID события - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events/" + + Событие; + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать событие +// Создает новое событие +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props +// +// Возвращаемое значение: +// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google +Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт + Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия); +КонецФункции + +// Переместить событие +// Перемещает событие в другой календарь +// +// Параметры: +// Токен - Строка - Токен - token +// КалендарьИсточник - Строка - ID календаря источника - from +// КалендарьПриемник - Строка - ID календаря приемника - to +// Событие - Строка - ID события календаря источника - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник); + OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + КалендарьИсточник + + "/events/" + + Событие + + "/move?destination=" + + КалендарьПриемник; + + Ответ = OPI_Инструменты.Post(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить событие +// Изменяет существующее событие +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// ОписаниеСобытия - Строка - Новое описание события - props +// Событие - Строка - ID события - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт + Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие); +КонецФункции + +// Удалить событие +// Удаляет событие по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Календарь - Строка - ID календаря - calendar +// Событие - Строка - ID события - event +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events/" + + Событие; + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПреобразоватьДату(Знач Дата) + + OPI_ПреобразованиеТипов.ПолучитьДату(Дата); + + СтруктураДаты = Новый Структура; + + Если Не ТипЗнч(Дата) = Тип("Дата") Тогда + Возврат Неопределено; + КонецЕсли; + + Если Дата = НачалоДня(Дата) Тогда + ФорматДаты = "ДФ=yyyy-MM-dd"; + Поле = "date"; + Иначе + ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ"; + Поле = "dateTime"; + КонецЕсли; + + Дата = Формат(Дата, ФорматДаты); + СтруктураДаты.Вставить(Поле , Дата); + СтруктураДаты.Вставить("timeZone", "Europe/Moscow"); + + Возврат СтруктураДаты; + +КонецФункции + +Функция ПреобразоватьВложения(Знач Вложения) + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения); + + МассивВложений = Новый Массив; + + Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда + + Для Каждого Вложение Из Вложения Цикл + + ТекущеВложение = Новый Структура; + ТекущеВложение.Вставить("title" , Вложение.Ключ); + ТекущеВложение.Вставить("fileUrl", Вложение.Значение); + + МассивВложений.Добавить(ТекущеВложение); + + КонецЦикла; + + КонецЕсли; + + Если МассивВложений.Количество() > 0 Тогда + Возврат МассивВложений; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + Существующее = ЗначениеЗаполнено(Событие); + URL = "https://www.googleapis.com/calendar/v3/calendars/" + + Календарь + + "/events" + + ?(Существующее, "/" + Событие, ""); + + Дата0 = ОписаниеСобытия["ДатаНачала"]; + Дата1 = ОписаниеСобытия["ДатаОкончания"]; + Вложения = ОписаниеСобытия["МассивURLФайловВложений"]; + Вложения = ПреобразоватьВложения(Вложения); + Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено + , Ложь + , ОписаниеСобытия["ОтправлятьУведомления"]); + + Параметры = Новый Структура; + Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]); + Параметры.Вставить("description", ОписаниеСобытия["Описание"]); + Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]); + Параметры.Вставить("start" , ПреобразоватьДату(Дата0)); + Параметры.Вставить("end" , ПреобразоватьДату(Дата1)); + Параметры.Вставить("attachments", Вложения); + + ПараметрыURL = Новый Структура; + ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none")); + ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false")); + + URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); + + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); + + Если Существующее Тогда + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина); + Иначе + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") + + Items = "items"; + NPT = "nextPageToken"; + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Страница) Тогда + Параметры.Вставить("pageToken", Страница); + КонецЕсли; + + Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList" + , Параметры + , Заголовки); + + Календари = Результат[Items]; + Страница = Результат[NPT]; + + Для Каждого Календарь Из Календари Цикл + МассивКалендарей.Добавить(Календарь); + КонецЦикла; + + Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда + ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница); + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") + + Items = "items"; + NPT = "nextPageToken"; + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Страница) Тогда + Параметры.Вставить("pageToken", Страница); + КонецЕсли; + + Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events" + , Параметры + , Заголовки); + + События = Результат[Items]; + Страница = Результат[NPT]; + + Для Каждого Событие Из События Цикл + МассивСобытий.Добавить(Событие); + КонецЦикла; + + Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда + ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleDrive.os b/src/ru/OInt/core/Modules/OPI_GoogleDrive.os similarity index 98% rename from ru/OInt/core/Modules/OPI_GoogleDrive.os rename to src/ru/OInt/core/Modules/OPI_GoogleDrive.os index 57c5b0babf..d8a49c4833 100644 --- a/ru/OInt/core/Modules/OPI_GoogleDrive.os +++ b/src/ru/OInt/core/Modules/OPI_GoogleDrive.os @@ -1,719 +1,719 @@ -// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os -// Библиотека: Google Drive -// Команда CLI: gdrive - -// 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" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСФайламиИКаталогами - -// Получить информацию об объекте -// Получает информацию о папке или файле по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор файла или каталога - object -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; - - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список каталогов -// Получает список каталогов диска -// -// Параметры: -// Токен - Строка - Токен - token -// ИмяСодержит - Строка - Отбор по имени - querry -// Подробно - Булево - Добавляет список файлов к полям каталога - depth -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий каталогов -Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); - OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивОбъектов = Новый Массив; - Отбор = Новый Массив; - - Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'"); - - Если ЗначениеЗаполнено(ИмяСодержит) Тогда - Отбор.Добавить("name contains '" + ИмяСодержит + "'"); - КонецЕсли; - - ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор); - - Если Подробно Тогда - РазложитьОбъектыПодробно(Токен, МассивОбъектов); - КонецЕсли; - - Возврат МассивОбъектов; - -КонецФункции - -// Получить список файлов -// Получает список файлов -// -// Параметры: -// Токен - Строка - Токен - token -// ИмяСодержит - Строка - Отбор по имени - querry -// Каталог - Строка - Отбор по ID каталога родителя - catalog -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий файлов -Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - МассивОбъектов = Новый Массив; - Отбор = Новый Массив; - - Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'"); - - Если ЗначениеЗаполнено(ИмяСодержит) Тогда - Отбор.Добавить("name contains '" + ИмяСодержит + "'"); - КонецЕсли; - - Если ЗначениеЗаполнено(Каталог) Тогда - Отбор.Добавить("'" + Каталог + "' in parents"); - КонецЕсли; - - ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор); - - Возврат МассивОбъектов; - -КонецФункции - -// Загрузить файл -// Загружает файл на диск -// -// Параметры: -// Токен - Строка - Токен - token -// Файл - ДвоичныеДанные,Строка - Загружаемый файл - file -// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт - Возврат УправлениеФайлом(Токен, Файл, Описание); -КонецФункции - -// Создать папку -// Создает пустой каталог на диске -// -// Параметры: -// Токен - Строка - Токен - token -// Имя - Строка - Имя папки - title -// Родитель - Строка - Родитель - catalog -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - - Описание = Новый Соответствие; - Описание.Вставить("MIME" , "application/vnd.google-apps.folder"); - Описание.Вставить("Имя" , Имя); - Описание.Вставить("Описание", ""); - Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root")); - - Возврат УправлениеФайлом(Токен, , Описание); - -КонецФункции - -// Скачать файл -// Получает файл по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор файла - object -// ПутьСохранения - Строка - Путь сохранения файла - out -// -// Возвращаемое значение: -// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения -Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; - - Параметры = Новый Соответствие; - Параметры.Вставить("alt", "media"); - - Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения); - - Возврат Ответ; - -КонецФункции - -// Скоприровать объект -// Копирует файл или каталог -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор объекта - object -// НовоеИмя - Строка - Новое имя объекта - title -// НовыйРодитель - Строка - Новый каталог размещения - catalog -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy"; - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(НовоеИмя) Тогда - Параметры.Вставить("name", НовоеИмя); - КонецЕсли; - - Если ЗначениеЗаполнено(НовыйРодитель) Тогда - - МассивРодителей = Новый Массив; - МассивРодителей.Добавить(НовыйРодитель); - Параметры.Вставить("parents", МассивРодителей); - - КонецЕсли; - - Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина); - - Возврат Ответ; - -КонецФункции - -// Обновить файл -// Обновляет двоичные данные файла -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор обновляемого объекта - object -// Файл - ДвоичныеДанные,Строка - Файл источник обновления - file -// НовоеИмя - Строка - Новое имя файла (если необходимо) - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - Если ЗначениеЗаполнено(НовоеИмя) Тогда - Описание = Новый Соответствие; - Описание.Вставить("Имя", НовоеИмя); - Иначе - Описание = ""; - КонецЕсли; - - Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор); - -КонецФункции - -// Удалить объект -// Удаляет файл или каталог по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор объекта для удаления - object -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить описание файла !NOCLI -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Описание файла -Функция ПолучитьОписаниеФайла() Экспорт - - Описание = Новый Соответствие; - Описание.Вставить("MIME" , "image/jpeg"); // MIME-тип загружаемого файла - Описание.Вставить("Имя" , "Новый файл.jpg"); // Имя файла с расширением - Описание.Вставить("Описание" , "Это новый файл"); // Описание файла - Описание.Вставить("Родитель" , "root"); // ID каталога загрузки или "root" для загрузки в корень - - Возврат Описание; - -КонецФункции - -#КонецОбласти - -#Область РаботаСКомментариями - -// Создать комментарий -// Создает комментарий к файлу или каталогу -// -// Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object -// Комментарий - Строка - Текст комментария - text -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*"; - - Параметры = Новый Структура; - Параметры.Вставить("content", Комментарий); - - Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить комментарий -// Получает комментарий по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object -// ИДКомментария - Строка - Идентификатор комментария - comment -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; - - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список комментариев -// Получает список всех комментариев объекта -// -// Параметры: -// Токен - Строка - Токен - token -// ИДОбъекта - Строка - Идентификатор объекта - object -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments"; - - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить комментарий -// Удаляет комментарий по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object -// ИДКомментария - Строка - Идентификатор комментария - comment -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; - - Ответ = OPI_Инструменты.Delete(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "") - - URL = "https://www.googleapis.com/drive/v3/files"; - Files = "files"; - NPT = "nextPageToken"; - Параметры = Новый Структура; - Параметры.Вставить("fields", "*"); - - Если ЗначениеЗаполнено(Страница) Тогда - Параметры.Вставить("pageToken", Страница); - КонецЕсли; - - Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда - ОтборСтрока = СтрСоединить(Отбор, " and "); - Параметры.Вставить("q", ОтборСтрока); - КонецЕсли; - - Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Объекты = Результат[Files]; - Страница = Результат[NPT]; - - Для Каждого ТекущийОбъект Из Объекты Цикл - МассивОбъектов.Добавить(ТекущийОбъект); - КонецЦикла; - - Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда - ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница); - КонецЕсли; - -КонецПроцедуры - -Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов) - - Для Каждого ТекущийОбъект Из МассивОбъектов Цикл - - МассивФайлов = Новый Массив; - ТекущийИД = ТекущийОбъект["id"]; - - Результат = ПолучитьСписокФайлов(Токен, , ТекущийИД); - - Для Каждого Файл Из Результат Цикл - МассивФайлов.Добавить(Файл); - КонецЦикла; - - ТекущийОбъект.Вставить("files", МассивФайлов); - - КонецЦикла; - -КонецПроцедуры - -Процедура СформироватьПараметрыЗагрузкиФайла(Описание) - - СформированноеОписание = Новый Соответствие; - OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание); - - СоответствиеПолей = Новый Соответствие; - СоответствиеПолей.Вставить("MIME" , "mimeType"); - СоответствиеПолей.Вставить("Имя" , "name"); - СоответствиеПолей.Вставить("Описание" , "description"); - СоответствиеПолей.Вставить("Родитель" , "parents"); - СоответствиеПолей.Вставить("Расширение", "fileExtension"); - - Для Каждого Элемент Из Описание Цикл - - Если Элемент.Ключ = "Родитель" Тогда - - ТекущееЗначение = Новый Массив; - ТекущееЗначение.Добавить(Элемент.Значение); - - Иначе - - ТекущееЗначение = Элемент.Значение; - - КонецЕсли; - - ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ); - СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение); - - КонецЦикла; - - Описание = СформированноеОписание; - -КонецПроцедуры - -Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Если ЗначениеЗаполнено(Описание) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание); - КонецЕсли; - - MimeType = "mimeType"; - - Если ЗначениеЗаполнено(Идентификатор) Тогда - MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType]; - Иначе - MIME = Описание["MIME"]; - КонецЕсли; - - Если Не ЗначениеЗаполнено(Описание) Тогда - Описание = Новый Соответствие; - КонецЕсли; - - Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); - СформироватьПараметрыЗагрузкиФайла(Описание); - ОписаниеJSON = OPI_Инструменты.JSONСтрокой(Описание); - - СоответствиеФайла = Новый Соответствие; - - Если ЗначениеЗаполнено(Файл) Тогда - - РазмерЧасти = 268435457; - Размер = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти); - - СоответствиеФайла.Вставить(Файл, MIME); - - Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда - Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); - Иначе - Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор); - КонецЕсли; - - Иначе - Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") - - URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"; - - Если ЗначениеЗаполнено(Идентификатор) Тогда - URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); - Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); - Иначе - Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") - - Для Каждого Файл Из СоответствиеФайла Цикл - Двоичные = Файл.Ключ; - Прервать; - КонецЦикла; - - URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable"; - - Если ЗначениеЗаполнено(Идентификатор) Тогда - URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); - Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина); - Иначе - Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина); - КонецЕсли; - - АдресЗагрузки = Ответ.Заголовки["Location"]; - - Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - КонецЕсли; - - ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки); - Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ); - - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки) - - Ответ = ""; - РазмерЧасти = 268435456; - ПрочитаноБайт = 0; - ТекущаяПозиция = 0; - ОбщийРазмер = Двоичные.Размер(); - СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер); - ЧтениеДанных = Новый ЧтениеДанных(Двоичные); - ИсходныйПоток = ЧтениеДанных.ИсходныйПоток(); - - Пока ПрочитаноБайт < ОбщийРазмер Цикл - - ПрочитаноБайт = ИсходныйПоток.ТекущаяПозиция(); - Результат = ЧтениеДанных.Прочитать(РазмерЧасти); - ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); - РазмерТекущих = ТекущиеДанные.Размер(); - СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1; - - Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда - Прервать; - КонецЕсли; - - ЗаголовокПотока = "bytes " - + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция) - + "-" - + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция) - + "/" - + СтрОбщийРазмер; - - ДопЗаголовки = Новый Соответствие; - ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих)); - ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); - ДопЗаголовки.Вставить("Content-Type" , "application/octet-stream"); - - Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина); - - РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция); - - Если ЗначениеЗаполнено(РезультатПроверки) Тогда - Возврат РезультатПроверки; - КонецЕсли; - - КБайт = 1024; - МБайт = КБайт * КБайт; - Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); - - ВыполнитьСборкуМусора(); - ОсвободитьОбъект(ТекущиеДанные); - - КонецЦикла; - - Возврат Ответ; - -КонецФункции - -Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция) - - НачалоКодовОшибок = 400; - КонецКодовПадений = 600; - НачалоКодовУспеха = 200; - КонецКодовУспеха = 300; - Перенаправление = 308; - - Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда - - ЗаголовокПотока = "bytes */" + СтрОбщийРазмер; - ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); - - ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина); - - Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда - - OPI_Инструменты.ОбработатьОтвет(ОтветПроверки); - Возврат ОтветПроверки; - - ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда - - ЗагруженныеДанные = Ответ.Заголовки["Range"]; - - Иначе - - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - - КонецЕсли; - - Иначе - ЗагруженныеДанные = Ответ.Заголовки["Range"]; - КонецЕсли; - - Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - КонецЕсли; - - ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", ""); - МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь); - НеобходимоЧастей = 2; - - Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда - OPI_Инструменты.ОбработатьОтвет(Ответ); - Возврат Ответ; - КонецЕсли; - - ТекущаяПозиция = Число(МассивИнформации[1]) + 1; - - Возврат ""; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os +// Библиотека: Google Drive +// Команда CLI: gdrive + +// 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" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСФайламиИКаталогами + +// Получить информацию об объекте +// Получает информацию о папке или файле по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор файла или каталога - object +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; + + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список каталогов +// Получает список каталогов диска +// +// Параметры: +// Токен - Строка - Токен - token +// ИмяСодержит - Строка - Отбор по имени - querry +// Подробно - Булево - Добавляет список файлов к полям каталога - depth +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий каталогов +Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); + OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивОбъектов = Новый Массив; + Отбор = Новый Массив; + + Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'"); + + Если ЗначениеЗаполнено(ИмяСодержит) Тогда + Отбор.Добавить("name contains '" + ИмяСодержит + "'"); + КонецЕсли; + + ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор); + + Если Подробно Тогда + РазложитьОбъектыПодробно(Токен, МассивОбъектов); + КонецЕсли; + + Возврат МассивОбъектов; + +КонецФункции + +// Получить список файлов +// Получает список файлов +// +// Параметры: +// Токен - Строка - Токен - token +// ИмяСодержит - Строка - Отбор по имени - querry +// Каталог - Строка - Отбор по ID каталога родителя - catalog +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий файлов +Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + МассивОбъектов = Новый Массив; + Отбор = Новый Массив; + + Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'"); + + Если ЗначениеЗаполнено(ИмяСодержит) Тогда + Отбор.Добавить("name contains '" + ИмяСодержит + "'"); + КонецЕсли; + + Если ЗначениеЗаполнено(Каталог) Тогда + Отбор.Добавить("'" + Каталог + "' in parents"); + КонецЕсли; + + ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор); + + Возврат МассивОбъектов; + +КонецФункции + +// Загрузить файл +// Загружает файл на диск +// +// Параметры: +// Токен - Строка - Токен - token +// Файл - ДвоичныеДанные,Строка - Загружаемый файл - file +// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт + Возврат УправлениеФайлом(Токен, Файл, Описание); +КонецФункции + +// Создать папку +// Создает пустой каталог на диске +// +// Параметры: +// Токен - Строка - Токен - token +// Имя - Строка - Имя папки - title +// Родитель - Строка - Родитель - catalog +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + + Описание = Новый Соответствие; + Описание.Вставить("MIME" , "application/vnd.google-apps.folder"); + Описание.Вставить("Имя" , Имя); + Описание.Вставить("Описание", ""); + Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root")); + + Возврат УправлениеФайлом(Токен, , Описание); + +КонецФункции + +// Скачать файл +// Получает файл по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор файла - object +// ПутьСохранения - Строка - Путь сохранения файла - out +// +// Возвращаемое значение: +// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения +Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; + + Параметры = Новый Соответствие; + Параметры.Вставить("alt", "media"); + + Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения); + + Возврат Ответ; + +КонецФункции + +// Скоприровать объект +// Копирует файл или каталог +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор объекта - object +// НовоеИмя - Строка - Новое имя объекта - title +// НовыйРодитель - Строка - Новый каталог размещения - catalog +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy"; + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(НовоеИмя) Тогда + Параметры.Вставить("name", НовоеИмя); + КонецЕсли; + + Если ЗначениеЗаполнено(НовыйРодитель) Тогда + + МассивРодителей = Новый Массив; + МассивРодителей.Добавить(НовыйРодитель); + Параметры.Вставить("parents", МассивРодителей); + + КонецЕсли; + + Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина); + + Возврат Ответ; + +КонецФункции + +// Обновить файл +// Обновляет двоичные данные файла +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор обновляемого объекта - object +// Файл - ДвоичныеДанные,Строка - Файл источник обновления - file +// НовоеИмя - Строка - Новое имя файла (если необходимо) - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + Если ЗначениеЗаполнено(НовоеИмя) Тогда + Описание = Новый Соответствие; + Описание.Вставить("Имя", НовоеИмя); + Иначе + Описание = ""; + КонецЕсли; + + Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор); + +КонецФункции + +// Удалить объект +// Удаляет файл или каталог по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор объекта для удаления - object +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить описание файла !NOCLI +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Описание файла +Функция ПолучитьОписаниеФайла() Экспорт + + Описание = Новый Соответствие; + Описание.Вставить("MIME" , "image/jpeg"); // MIME-тип загружаемого файла + Описание.Вставить("Имя" , "Новый файл.jpg"); // Имя файла с расширением + Описание.Вставить("Описание" , "Это новый файл"); // Описание файла + Описание.Вставить("Родитель" , "root"); // ID каталога загрузки или "root" для загрузки в корень + + Возврат Описание; + +КонецФункции + +#КонецОбласти + +#Область РаботаСКомментариями + +// Создать комментарий +// Создает комментарий к файлу или каталогу +// +// Параметры: +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object +// Комментарий - Строка - Текст комментария - text +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*"; + + Параметры = Новый Структура; + Параметры.Вставить("content", Комментарий); + + Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить комментарий +// Получает комментарий по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object +// ИДКомментария - Строка - Идентификатор комментария - comment +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; + + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список комментариев +// Получает список всех комментариев объекта +// +// Параметры: +// Токен - Строка - Токен - token +// ИДОбъекта - Строка - Идентификатор объекта - object +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments"; + + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить комментарий +// Удаляет комментарий по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object +// ИДКомментария - Строка - Идентификатор комментария - comment +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google +Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария); + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; + + Ответ = OPI_Инструменты.Delete(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "") + + URL = "https://www.googleapis.com/drive/v3/files"; + Files = "files"; + NPT = "nextPageToken"; + Параметры = Новый Структура; + Параметры.Вставить("fields", "*"); + + Если ЗначениеЗаполнено(Страница) Тогда + Параметры.Вставить("pageToken", Страница); + КонецЕсли; + + Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда + ОтборСтрока = СтрСоединить(Отбор, " and "); + Параметры.Вставить("q", ОтборСтрока); + КонецЕсли; + + Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Объекты = Результат[Files]; + Страница = Результат[NPT]; + + Для Каждого ТекущийОбъект Из Объекты Цикл + МассивОбъектов.Добавить(ТекущийОбъект); + КонецЦикла; + + Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда + ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница); + КонецЕсли; + +КонецПроцедуры + +Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов) + + Для Каждого ТекущийОбъект Из МассивОбъектов Цикл + + МассивФайлов = Новый Массив; + ТекущийИД = ТекущийОбъект["id"]; + + Результат = ПолучитьСписокФайлов(Токен, , ТекущийИД); + + Для Каждого Файл Из Результат Цикл + МассивФайлов.Добавить(Файл); + КонецЦикла; + + ТекущийОбъект.Вставить("files", МассивФайлов); + + КонецЦикла; + +КонецПроцедуры + +Процедура СформироватьПараметрыЗагрузкиФайла(Описание) + + СформированноеОписание = Новый Соответствие; + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание); + + СоответствиеПолей = Новый Соответствие; + СоответствиеПолей.Вставить("MIME" , "mimeType"); + СоответствиеПолей.Вставить("Имя" , "name"); + СоответствиеПолей.Вставить("Описание" , "description"); + СоответствиеПолей.Вставить("Родитель" , "parents"); + СоответствиеПолей.Вставить("Расширение", "fileExtension"); + + Для Каждого Элемент Из Описание Цикл + + Если Элемент.Ключ = "Родитель" Тогда + + ТекущееЗначение = Новый Массив; + ТекущееЗначение.Добавить(Элемент.Значение); + + Иначе + + ТекущееЗначение = Элемент.Значение; + + КонецЕсли; + + ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ); + СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение); + + КонецЦикла; + + Описание = СформированноеОписание; + +КонецПроцедуры + +Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Если ЗначениеЗаполнено(Описание) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание); + КонецЕсли; + + MimeType = "mimeType"; + + Если ЗначениеЗаполнено(Идентификатор) Тогда + MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType]; + Иначе + MIME = Описание["MIME"]; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Описание) Тогда + Описание = Новый Соответствие; + КонецЕсли; + + Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); + СформироватьПараметрыЗагрузкиФайла(Описание); + ОписаниеJSON = OPI_Инструменты.JSONСтрокой(Описание); + + СоответствиеФайла = Новый Соответствие; + + Если ЗначениеЗаполнено(Файл) Тогда + + РазмерЧасти = 268435457; + Размер = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти); + + СоответствиеФайла.Вставить(Файл, MIME); + + Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда + Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); + Иначе + Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор); + КонецЕсли; + + Иначе + Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") + + URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"; + + Если ЗначениеЗаполнено(Идентификатор) Тогда + URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); + Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); + Иначе + Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "") + + Для Каждого Файл Из СоответствиеФайла Цикл + Двоичные = Файл.Ключ; + Прервать; + КонецЦикла; + + URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable"; + + Если ЗначениеЗаполнено(Идентификатор) Тогда + URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор); + Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина); + Иначе + Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина); + КонецЕсли; + + АдресЗагрузки = Ответ.Заголовки["Location"]; + + Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + КонецЕсли; + + ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки); + Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ); + + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки) + + Ответ = ""; + РазмерЧасти = 268435456; + ПрочитаноБайт = 0; + ТекущаяПозиция = 0; + ОбщийРазмер = Двоичные.Размер(); + СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер); + ЧтениеДанных = Новый ЧтениеДанных(Двоичные); + ИсходныйПоток = ЧтениеДанных.ИсходныйПоток(); + + Пока ПрочитаноБайт < ОбщийРазмер Цикл + + ПрочитаноБайт = ИсходныйПоток.ТекущаяПозиция(); + Результат = ЧтениеДанных.Прочитать(РазмерЧасти); + ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); + РазмерТекущих = ТекущиеДанные.Размер(); + СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1; + + Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда + Прервать; + КонецЕсли; + + ЗаголовокПотока = "bytes " + + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция) + + "-" + + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция) + + "/" + + СтрОбщийРазмер; + + ДопЗаголовки = Новый Соответствие; + ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих)); + ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); + ДопЗаголовки.Вставить("Content-Type" , "application/octet-stream"); + + Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина); + + РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция); + + Если ЗначениеЗаполнено(РезультатПроверки) Тогда + Возврат РезультатПроверки; + КонецЕсли; + + КБайт = 1024; + МБайт = КБайт * КБайт; + Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт)); + + ВыполнитьСборкуМусора(); + ОсвободитьОбъект(ТекущиеДанные); + + КонецЦикла; + + Возврат Ответ; + +КонецФункции + +Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция) + + НачалоКодовОшибок = 400; + КонецКодовПадений = 600; + НачалоКодовУспеха = 200; + КонецКодовУспеха = 300; + Перенаправление = 308; + + Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда + + ЗаголовокПотока = "bytes */" + СтрОбщийРазмер; + ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); + + ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина); + + Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда + + OPI_Инструменты.ОбработатьОтвет(ОтветПроверки); + Возврат ОтветПроверки; + + ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда + + ЗагруженныеДанные = Ответ.Заголовки["Range"]; + + Иначе + + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + + КонецЕсли; + + Иначе + ЗагруженныеДанные = Ответ.Заголовки["Range"]; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + КонецЕсли; + + ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", ""); + МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь); + НеобходимоЧастей = 2; + + Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда + OPI_Инструменты.ОбработатьОтвет(Ответ); + Возврат Ответ; + КонецЕсли; + + ТекущаяПозиция = Число(МассивИнформации[1]) + 1; + + Возврат ""; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleSheets.os b/src/ru/OInt/core/Modules/OPI_GoogleSheets.os similarity index 98% rename from ru/OInt/core/Modules/OPI_GoogleSheets.os rename to src/ru/OInt/core/Modules/OPI_GoogleSheets.os index 1828f40471..f8db5f80e2 100644 --- a/ru/OInt/core/Modules/OPI_GoogleSheets.os +++ b/src/ru/OInt/core/Modules/OPI_GoogleSheets.os @@ -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 По МассивИмен.ВГраница() Цикл + ДобавитьИмяЛиста(МассивИмен[Н], Лист); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os b/src/ru/OInt/core/Modules/OPI_GoogleWorkspace.os similarity index 97% rename from ru/OInt/core/Modules/OPI_GoogleWorkspace.os rename to src/ru/OInt/core/Modules/OPI_GoogleWorkspace.os index 4fd739a8a3..bb65b18314 100644 --- a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os +++ b/src/ru/OInt/core/Modules/OPI_GoogleWorkspace.os @@ -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"); + КонецЕсли; + + Возврат СтрСоединить(МассивРазрешений, " "); + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Notion.os b/src/ru/OInt/core/Modules/OPI_Notion.os similarity index 98% rename from ru/OInt/core/Modules/OPI_Notion.os rename to src/ru/OInt/core/Modules/OPI_Notion.os index 9303abb4fa..fb9c068f55 100644 --- a/ru/OInt/core/Modules/OPI_Notion.os +++ b/src/ru/OInt/core/Modules/OPI_Notion.os @@ -1,889 +1,889 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Notion.os -// Библиотека: Notion -// Команда CLI: notion - -// 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:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off - -// @skip-check method-too-many-params - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСоСтраницами - -// Создать страницу -// Создает дочернюю страницу над другой страницей-родителем -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID Родителя - page -// Заголовок - Строка - Заголовок страницы - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Свойства = Новый Структура; - Параметры = Новый Структура; - - ДобавитьЗаголовокСтраницы(Заголовок, Свойства); - ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры); - - Параметры.Вставить("properties", Свойства); - - Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать страницу в базу -// Создает страницу в базе-родителе -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID родительской базы - base -// Данные - Соответствие Из КлючИЗначение - Соответствие свойств - data -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Параметры = Новый Структура; - - ДобавитьРодителяСтраницы(Родитель, Истина, Параметры); - - Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен); - Параметры.Вставить("properties", Свойства); - - Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить страницу -// Получает информацию о странице по ID -// -// Параметры: -// Токен - Строка - Токен - token -// Страница - Строка - ID страницы - page -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(Страница); - - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить свойства страницы. -// -// Параметры: -// Токен - Строка - Токен - token -// Страница - Строка - ID изменяемой страницы - page -// Данные - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров - data -// Иконка - Строка - URL картинки иконки страницы - icon -// Обложка - Строка - URL картинки обложки страницы - cover -// Архивирована - Булево - Архивировать страницу или нет (булево) - archive -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ИзменитьСвойстваСтраницы(Знач Токен - , Знач Страница - , Знач Данные = "" - , Знач Иконка = "" - , Знач Обложка = "" - , Знач Архивирована = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка); - OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Параметры = Новый Структура; - Files = "files"; - - Если ЗначениеЗаполнено(Данные) - И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда - Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); - Иначе - Свойства = Новый Соответствие; - КонецЕсли; - - Если ЗначениеЗаполнено(Иконка) Тогда - СоответствиеИконки = Новый Соответствие; - СоответствиеИконки.Вставить("Icon", Иконка); - - ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки); - ОбъектИконка = ОбъектИконка[Files][0]; - ОбъектИконка.Удалить("name"); - - Параметры.Вставить("icon", ОбъектИконка); - КонецЕсли; - - Если ЗначениеЗаполнено(Обложка) Тогда - СоответствиеОбложки = Новый Соответствие; - СоответствиеОбложки.Вставить("Cover", Обложка); - - ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки); - ОбъектОбложка = ОбъектОбложка[Files][0]; - ОбъектОбложка.Удалить("name"); - - Параметры.Вставить("cover", ОбъектОбложка); - КонецЕсли; - - Параметры.Вставить("properties", Свойства); - Параметры.Вставить("archived" , Архивирована); - - ПреобразоватьИД(Страница); - - Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСБазамиДанных - -// Создать базу данных -// Создает базу данных -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID страницы родителя - page -// Заголовок - Строка - Заголовок базы данных - title -// Свойства - Структура Из Строка - Свойства базы данных - props -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); - - // Пример структуры/соответствия свойств - - // Имя : title - // Описание : rich_text - // В работе : checkbox - // Количество : number - // Дата : date - // Статус : Соответствие - // Активный : green - // Неактивный : red - // Архив : yellow - - // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя - - Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда - Свойства = Новый Структура("Наименование", "title"); - КонецЕсли; - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Параметры = Новый Структура; - - ДобавитьРодителяБазы(Родитель, Ложь, Параметры); - ДобавитьЗаголовокБазы(Заголовок, Параметры); - ДобавитьСвойстваБазы(Свойства, Параметры); - - Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить базу данных -// Получить данные о базе данных -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - ID базы данных - base -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(База); - - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить свойства базы -// Изменяет свойства существующей базы -// -// Параметры: -// Токен - Строка - Токен - token -// База - Строка - ID целевой базы - base -// Свойства - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props -// Заголовок - Строка - Новый заголовок базы - title -// Описание - Строка - Новое описание базы - description -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(База); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); - - Параметры = Новый Структура; - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(База); - - Если ЗначениеЗаполнено(Заголовок) Тогда - ДобавитьЗаголовокБазы(Заголовок, Параметры); - КонецЕсли; - - Если ЗначениеЗаполнено(Описание) Тогда - ДобавитьОписаниеБазы(Описание, Параметры); - КонецЕсли; - - Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда - ДобавитьСвойстваБазы(Свойства, Параметры); - КонецЕсли; - - Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСБлоками - -// Создать блок -// Создает новый блок на основе существующего блока -// -// Параметры: -// Токен - Строка - Токен - token -// Родитель - Строка - ID родительского блока или страницы - page -// Блок - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец - block -// ВставитьПосле - Строка - ID блока, после которого необходимо встаивть новый - prev -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок); - - Если ТипЗнч(Блок) = Тип("Массив") Тогда - Блок = Блок[0]; - КонецЕсли; - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - ПреобразоватьИД(Родитель); - - Если ТипЗнч(Блок) = Тип("Строка") Тогда - ПреобразоватьИД(Блок); - Блок = ВернутьБлок(Токен, Блок); - КонецЕсли; - - МассивБлоков = Новый Массив; - МассивБлоков.Добавить(Блок); - - Параметры = Новый Соответствие; - Параметры.Вставить("children", МассивБлоков); - - Если ЗначениеЗаполнено(ВставитьПосле) Тогда - Параметры.Вставить("after", ВставитьПосле); - КонецЕсли; - - URL = "https://api.notion.com/v1/blocks/" + Родитель + "/children"; - Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Вернуть блок. -// -// Параметры: -// Токен - Строка - Токен - token -// ИДБлока - Строка - ID блока - block -// ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок - core -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); - OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова); - - ПреобразоватьИД(ИДБлока); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); - - Если ТолькоОснова Тогда - УдалитьЛишниеПоляБлока(Ответ); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -// Вернуть дочерние блоки -// Созвращает список дочерних блоков блока-родителя -// -// Параметры: -// Токен - Строка - Токен - token -// ИДБлока - Строка - ID блока родителя - block -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); - - ПреобразоватьИД(ИДБлока); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить блок -// Удаляет блок по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДБлока - Строка - ID блока - block -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); - - ПреобразоватьИД(ИДБлока); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область Пользователи - -// Список пользователей -// Возвращает список пользователей рабочего пространства -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция СписокПользователей(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить данные пользователя -// Получает данные пользователя по ID -// -// Параметры: -// Токен - Строка - Токен - token -// ИДПользователя - Строка - ID целевого пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion -Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя); - - ПреобразоватьИД(ИДПользователя); - - Заголовки = СоздатьЗаголовкиЗапроса(Токен); - Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция СоздатьЗаголовкиЗапроса(Знач Токен) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization" , "Bearer " + Токен); - Заголовки.Вставить("Notion-Version", "2022-06-28"); - - Возврат Заголовки; - -КонецФункции - -Процедура ПреобразоватьИД(Идентификатор) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); - - Идентификатор = СтрЗаменить(Идентификатор, "-", ""); - -КонецПроцедуры - -Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); - - ПреобразоватьИД(Родитель); - - ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); - СтруктураРодителя = Новый Структура(ПолеИдентификатора, Родитель); - - ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); - -КонецПроцедуры - -Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); - - ПреобразоватьИД(Родитель); - - ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); - - СтруктураРодителя = Новый Структура(); - СтруктураРодителя.Вставить("type" , ПолеИдентификатора); - СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель); - - ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); - -КонецПроцедуры - -Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - ПодчиненнаяСтруктура = Новый Структура; - СтруктураДанных = Новый Структура; - СтруктураТекста = Новый Структура; - МассивДанных = Новый Массив; - Title = "title"; - - СтруктураТекста.Вставить("content", Заголовок); - СтруктураТекста.Вставить("link" , Неопределено); - - СтруктураДанных.Вставить("text", СтруктураТекста); - СтруктураДанных.Вставить("type", "text"); - - МассивДанных.Добавить(СтруктураДанных); - - ПодчиненнаяСтруктура.Вставить("id" , Title); - ПодчиненнаяСтруктура.Вставить("type" , Title); - ПодчиненнаяСтруктура.Вставить(Title , МассивДанных); - - ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура); - -КонецПроцедуры - -Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - Заголовок = ПреобразоватьЗаголовок(Заголовок); - ОсновнаяСтруктура.Вставить("title", Заголовок["title"]); - -КонецПроцедуры - -Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Заголовок = ПреобразоватьЗаголовок(Описание); - ОсновнаяСтруктура.Вставить("description", Заголовок["title"]); - -КонецПроцедуры - -Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура) - - Если Свойства.Количество() = 0 Тогда - ОсновнаяСтруктура.Вставить("properties", Новый Структура); - Возврат; - КонецЕсли; - - СоответствиеПараметров = Новый Соответствие; - - Для Каждого Свойство Из Свойства Цикл - - Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда - - СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура)); - - ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура") - Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда - - ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение); - СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения)); - - Иначе - - СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение); - - КонецЕсли; - - КонецЦикла; - - ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров); - -КонецПроцедуры - -Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов) - - МассивВариантов = Новый Массив; - - Для Каждого Вариант Из СтруктураВариантов Цикл - - СоответствиеВарианта = Новый Соответствие; - СоответствиеВарианта.Вставить("name" , Вариант.Ключ); - СоответствиеВарианта.Вставить("color", Вариант.Значение); - - МассивВариантов.Добавить(СоответствиеВарианта); - - КонецЦикла; - - Возврат Новый Структура("options", МассивВариантов); - -КонецФункции - -Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина) - - Если ЭтоБаза Тогда - ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема); - Иначе - ДанныеСхемы = ПолучитьСтраницу(Токен, Схема); - КонецЕсли; - - ПоляБазы = ДанныеСхемы["properties"]; - Свойства = Новый Соответствие; - - Если ЗначениеЗаполнено(ПоляБазы) Тогда - - Для Каждого Поле Из ПоляБазы Цикл - - ДанныеПоля = Поле.Значение; - ТипПоля = ДанныеПоля["type"]; - - ЗаполняемыеДанные = Данные.Получить(Поле.Ключ); - - Если ЗаполняемыеДанные = Неопределено Тогда - Продолжить; - КонецЕсли; - - ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные); - - Если ПреобразованныеДанные = Неопределено Тогда - Продолжить; - КонецЕсли; - - Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные); - - КонецЦикла; - - КонецЕсли; - - Возврат Свойства; - -КонецФункции - -Процедура УдалитьЛишниеПоляБлока(Знач Блок) - - МассивЛишних = Новый Массив; - МассивЛишних.Добавить("request_id"); - МассивЛишних.Добавить("archived"); - МассивЛишних.Добавить("created_by"); - МассивЛишних.Добавить("last_edited_time"); - МассивЛишних.Добавить("created_time"); - МассивЛишних.Добавить("has_children"); - МассивЛишних.Добавить("parrent"); - МассивЛишних.Добавить("last_edited_by"); - МассивЛишних.Добавить("id"); - - Для Каждого Поле Из МассивЛишних Цикл - - Если Не Блок.Получить(Поле) = Неопределено Тогда - Блок.Удалить(Поле); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -#Область ПреобразованиеТипов - -Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение) - - Если Тип = "title" Тогда - Возврат ПреобразоватьЗаголовок(Значение); - ИначеЕсли Тип = "rich_text" Тогда - Возврат ПреобразоватьТекст(Значение); - ИначеЕсли Тип = "number" Тогда - Возврат ПреобразоватьЧисло(Значение); - ИначеЕсли Тип = "select" Тогда - Возврат ПреобразоватьВариантВыбора(Значение); - ИначеЕсли Тип = "multi_select" Тогда - Возврат ПреобразоватьМножественныйВыбор(Значение); - ИначеЕсли Тип = "status" Тогда - Возврат ПреобразоватьСтатус(Значение); - ИначеЕсли Тип = "date" Тогда - Возврат ПреобразоватьДату(Значение); - ИначеЕсли Тип = "relation" Тогда - Возврат ПреобразоватьСвязь(Значение); - ИначеЕсли Тип = "people" Тогда - Возврат ПреобразоватьПользователей(Значение); - ИначеЕсли Тип = "files" Тогда - Возврат ПреобразоватьФайлы(Значение); - ИначеЕсли Тип = "checkbox" Тогда - Возврат ПреобразоватьБулево(Значение); - ИначеЕсли Тип = "url" Тогда - Возврат ПреобразоватьСсылку(Значение); - ИначеЕсли Тип = "email" Тогда - Возврат ПреобразоватьПочту(Значение); - ИначеЕсли Тип = "phone_number" Тогда - Возврат ПреобразоватьТелефон(Значение); - Иначе - Возврат Неопределено; - КонецЕсли; - -КонецФункции - -Функция ПреобразоватьЗаголовок(Знач Заголовок) - - СтруктураДанных = Новый Структура; - СтруктураТекста = Новый Структура; - МассивДанных = Новый Массив; - - СтруктураТекста.Вставить("content", Заголовок); - СтруктураТекста.Вставить("link" , Неопределено); - - СтруктураДанных.Вставить("type", "text"); - СтруктураДанных.Вставить("text", СтруктураТекста); - - МассивДанных.Добавить(СтруктураДанных); - - Возврат Новый Структура("title", МассивДанных); - -КонецФункции - -Функция ПреобразоватьТекст(Знач Текст) - - МассивТекста = Новый Массив; - СтруктураТекста = Новый Структура; - - СтруктураТекста.Вставить("type", "text"); - СтруктураТекста.Вставить("text", Новый Структура("content", Текст)); - - МассивТекста.Добавить(СтруктураТекста); - - Возврат Новый Структура("rich_text", МассивТекста); - -КонецФункции - -Функция ПреобразоватьЧисло(Знач Число) - Возврат Новый Структура("number", Число); -КонецФункции - -Функция ПреобразоватьВариантВыбора(Знач Вариант) - - СтруктураВыбора = Новый Структура; - СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант)); - - Возврат СтруктураВыбора; - -КонецФункции - -Функция ПреобразоватьСтатус(Знач Статус) - - СтруктураСтатуса = Новый Структура; - СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус)); - - Возврат СтруктураСтатуса; - -КонецФункции - -Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов) - - МассивВариантовВыбора = Новый Массив; - - Для Каждого Вариант Из МассивВариантов Цикл - МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант)); - КонецЦикла; - - Возврат Новый Структура("multi_select", МассивВариантовВыбора); - -КонецФункции - -Функция ПреобразоватьДату(Знач Дата) - - СтруктураДаты = Новый Структура; - - Если Дата = НачалоДня(Дата) Тогда - ФорматДаты = "ДФ=yyyy-MM-dd"; - Иначе - ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ"; - КонецЕсли; - - Дата = Формат(Дата, ФорматДаты); - СтруктураДаты.Вставить("start", Дата); - - Возврат Новый Структура("date", СтруктураДаты); - -КонецФункции - -Функция ПреобразоватьСвязь(Знач Идентификатор) - - МассивСвязи = Новый Массив; - МассивСвязи.Добавить(Новый Структура("id", Идентификатор)); - - Возврат Новый Структура("relation", МассивСвязи); - -КонецФункции - -Функция ПреобразоватьПользователей(Знач МассивИД) - - Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда - МассивИД_ = Новый Массив; - МассивИД_.Добавить(МассивИД); - МассивИД = МассивИД_; - КонецЕсли; - - МассивПользователей = Новый Массив; - - Для Каждого Идентификатор Из МассивИД Цикл - - СтруктураПользователя = Новый Структура; - СтруктураПользователя.Вставить("object", "user"); - СтруктураПользователя.Вставить("id" , Идентификатор); - МассивПользователей.Добавить(СтруктураПользователя); - - КонецЦикла; - - Возврат Новый Структура("people", МассивПользователей); - -КонецФункции - -Функция ПреобразоватьФайлы(Знач СоответствиеФайлов) - - МассивФайлов = Новый Массив; - - Для Каждого Файл Из СоответствиеФайлов Цикл - - СтруктураФайла = Новый Структура; - СтруктураФайла.Вставить("type" , "external"); - СтруктураФайла.Вставить("name" , Файл.Ключ); - СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение)); - - МассивФайлов.Добавить(СтруктураФайла); - - КонецЦикла; - - Возврат Новый Структура("files", МассивФайлов); - -КонецФункции - -Функция ПреобразоватьБулево(Знач Булево) - Возврат Новый Структура("checkbox", Булево); -КонецФункции - -Функция ПреобразоватьСсылку(Знач URL) - Возврат Новый Структура("url", URL); -КонецФункции - -Функция ПреобразоватьПочту(Знач Почта) - Возврат Новый Структура("email", Почта); -КонецФункции - -Функция ПреобразоватьТелефон(Знач Телефон) - Возврат Новый Структура("phone_number", Телефон); -КонецФункции - -#КонецОбласти - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Notion.os +// Библиотека: Notion +// Команда CLI: notion + +// 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:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +// @skip-check method-too-many-params + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСоСтраницами + +// Создать страницу +// Создает дочернюю страницу над другой страницей-родителем +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID Родителя - page +// Заголовок - Строка - Заголовок страницы - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Свойства = Новый Структура; + Параметры = Новый Структура; + + ДобавитьЗаголовокСтраницы(Заголовок, Свойства); + ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры); + + Параметры.Вставить("properties", Свойства); + + Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать страницу в базу +// Создает страницу в базе-родителе +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID родительской базы - base +// Данные - Соответствие Из КлючИЗначение - Соответствие свойств - data +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Параметры = Новый Структура; + + ДобавитьРодителяСтраницы(Родитель, Истина, Параметры); + + Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен); + Параметры.Вставить("properties", Свойства); + + Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить страницу +// Получает информацию о странице по ID +// +// Параметры: +// Токен - Строка - Токен - token +// Страница - Строка - ID страницы - page +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(Страница); + + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить свойства страницы. +// +// Параметры: +// Токен - Строка - Токен - token +// Страница - Строка - ID изменяемой страницы - page +// Данные - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров - data +// Иконка - Строка - URL картинки иконки страницы - icon +// Обложка - Строка - URL картинки обложки страницы - cover +// Архивирована - Булево - Архивировать страницу или нет (булево) - archive +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ИзменитьСвойстваСтраницы(Знач Токен + , Знач Страница + , Знач Данные = "" + , Знач Иконка = "" + , Знач Обложка = "" + , Знач Архивирована = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка); + OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Параметры = Новый Структура; + Files = "files"; + + Если ЗначениеЗаполнено(Данные) + И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда + Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); + Иначе + Свойства = Новый Соответствие; + КонецЕсли; + + Если ЗначениеЗаполнено(Иконка) Тогда + СоответствиеИконки = Новый Соответствие; + СоответствиеИконки.Вставить("Icon", Иконка); + + ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки); + ОбъектИконка = ОбъектИконка[Files][0]; + ОбъектИконка.Удалить("name"); + + Параметры.Вставить("icon", ОбъектИконка); + КонецЕсли; + + Если ЗначениеЗаполнено(Обложка) Тогда + СоответствиеОбложки = Новый Соответствие; + СоответствиеОбложки.Вставить("Cover", Обложка); + + ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки); + ОбъектОбложка = ОбъектОбложка[Files][0]; + ОбъектОбложка.Удалить("name"); + + Параметры.Вставить("cover", ОбъектОбложка); + КонецЕсли; + + Параметры.Вставить("properties", Свойства); + Параметры.Вставить("archived" , Архивирована); + + ПреобразоватьИД(Страница); + + Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСБазамиДанных + +// Создать базу данных +// Создает базу данных +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID страницы родителя - page +// Заголовок - Строка - Заголовок базы данных - title +// Свойства - Структура Из Строка - Свойства базы данных - props +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); + + // Пример структуры/соответствия свойств + + // Имя : title + // Описание : rich_text + // В работе : checkbox + // Количество : number + // Дата : date + // Статус : Соответствие + // Активный : green + // Неактивный : red + // Архив : yellow + + // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя + + Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда + Свойства = Новый Структура("Наименование", "title"); + КонецЕсли; + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Параметры = Новый Структура; + + ДобавитьРодителяБазы(Родитель, Ложь, Параметры); + ДобавитьЗаголовокБазы(Заголовок, Параметры); + ДобавитьСвойстваБазы(Свойства, Параметры); + + Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить базу данных +// Получить данные о базе данных +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - ID базы данных - base +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(База); + + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить свойства базы +// Изменяет свойства существующей базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - ID целевой базы - base +// Свойства - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props +// Заголовок - Строка - Новый заголовок базы - title +// Описание - Строка - Новое описание базы - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства); + + Параметры = Новый Структура; + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(База); + + Если ЗначениеЗаполнено(Заголовок) Тогда + ДобавитьЗаголовокБазы(Заголовок, Параметры); + КонецЕсли; + + Если ЗначениеЗаполнено(Описание) Тогда + ДобавитьОписаниеБазы(Описание, Параметры); + КонецЕсли; + + Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда + ДобавитьСвойстваБазы(Свойства, Параметры); + КонецЕсли; + + Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСБлоками + +// Создать блок +// Создает новый блок на основе существующего блока +// +// Параметры: +// Токен - Строка - Токен - token +// Родитель - Строка - ID родительского блока или страницы - page +// Блок - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец - block +// ВставитьПосле - Строка - ID блока, после которого необходимо встаивть новый - prev +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок); + + Если ТипЗнч(Блок) = Тип("Массив") Тогда + Блок = Блок[0]; + КонецЕсли; + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + ПреобразоватьИД(Родитель); + + Если ТипЗнч(Блок) = Тип("Строка") Тогда + ПреобразоватьИД(Блок); + Блок = ВернутьБлок(Токен, Блок); + КонецЕсли; + + МассивБлоков = Новый Массив; + МассивБлоков.Добавить(Блок); + + Параметры = Новый Соответствие; + Параметры.Вставить("children", МассивБлоков); + + Если ЗначениеЗаполнено(ВставитьПосле) Тогда + Параметры.Вставить("after", ВставитьПосле); + КонецЕсли; + + URL = "https://api.notion.com/v1/blocks/" + Родитель + "/children"; + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Вернуть блок. +// +// Параметры: +// Токен - Строка - Токен - token +// ИДБлока - Строка - ID блока - block +// ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок - core +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); + OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова); + + ПреобразоватьИД(ИДБлока); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); + + Если ТолькоОснова Тогда + УдалитьЛишниеПоляБлока(Ответ); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +// Вернуть дочерние блоки +// Созвращает список дочерних блоков блока-родителя +// +// Параметры: +// Токен - Строка - Токен - token +// ИДБлока - Строка - ID блока родителя - block +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); + + ПреобразоватьИД(ИДБлока); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить блок +// Удаляет блок по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДБлока - Строка - ID блока - block +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока); + + ПреобразоватьИД(ИДБлока); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область Пользователи + +// Список пользователей +// Возвращает список пользователей рабочего пространства +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция СписокПользователей(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить данные пользователя +// Получает данные пользователя по ID +// +// Параметры: +// Токен - Строка - Токен - token +// ИДПользователя - Строка - ID целевого пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion +Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя); + + ПреобразоватьИД(ИДПользователя); + + Заголовки = СоздатьЗаголовкиЗапроса(Токен); + Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьЗаголовкиЗапроса(Знач Токен) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization" , "Bearer " + Токен); + Заголовки.Вставить("Notion-Version", "2022-06-28"); + + Возврат Заголовки; + +КонецФункции + +Процедура ПреобразоватьИД(Идентификатор) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); + + Идентификатор = СтрЗаменить(Идентификатор, "-", ""); + +КонецПроцедуры + +Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); + + ПреобразоватьИД(Родитель); + + ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); + СтруктураРодителя = Новый Структура(ПолеИдентификатора, Родитель); + + ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); + +КонецПроцедуры + +Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза); + + ПреобразоватьИД(Родитель); + + ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id"); + + СтруктураРодителя = Новый Структура(); + СтруктураРодителя.Вставить("type" , ПолеИдентификатора); + СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель); + + ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя); + +КонецПроцедуры + +Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + ПодчиненнаяСтруктура = Новый Структура; + СтруктураДанных = Новый Структура; + СтруктураТекста = Новый Структура; + МассивДанных = Новый Массив; + Title = "title"; + + СтруктураТекста.Вставить("content", Заголовок); + СтруктураТекста.Вставить("link" , Неопределено); + + СтруктураДанных.Вставить("text", СтруктураТекста); + СтруктураДанных.Вставить("type", "text"); + + МассивДанных.Добавить(СтруктураДанных); + + ПодчиненнаяСтруктура.Вставить("id" , Title); + ПодчиненнаяСтруктура.Вставить("type" , Title); + ПодчиненнаяСтруктура.Вставить(Title , МассивДанных); + + ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура); + +КонецПроцедуры + +Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + Заголовок = ПреобразоватьЗаголовок(Заголовок); + ОсновнаяСтруктура.Вставить("title", Заголовок["title"]); + +КонецПроцедуры + +Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Заголовок = ПреобразоватьЗаголовок(Описание); + ОсновнаяСтруктура.Вставить("description", Заголовок["title"]); + +КонецПроцедуры + +Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура) + + Если Свойства.Количество() = 0 Тогда + ОсновнаяСтруктура.Вставить("properties", Новый Структура); + Возврат; + КонецЕсли; + + СоответствиеПараметров = Новый Соответствие; + + Для Каждого Свойство Из Свойства Цикл + + Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда + + СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура)); + + ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура") + Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда + + ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение); + СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения)); + + Иначе + + СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение); + + КонецЕсли; + + КонецЦикла; + + ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров); + +КонецПроцедуры + +Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов) + + МассивВариантов = Новый Массив; + + Для Каждого Вариант Из СтруктураВариантов Цикл + + СоответствиеВарианта = Новый Соответствие; + СоответствиеВарианта.Вставить("name" , Вариант.Ключ); + СоответствиеВарианта.Вставить("color", Вариант.Значение); + + МассивВариантов.Добавить(СоответствиеВарианта); + + КонецЦикла; + + Возврат Новый Структура("options", МассивВариантов); + +КонецФункции + +Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина) + + Если ЭтоБаза Тогда + ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема); + Иначе + ДанныеСхемы = ПолучитьСтраницу(Токен, Схема); + КонецЕсли; + + ПоляБазы = ДанныеСхемы["properties"]; + Свойства = Новый Соответствие; + + Если ЗначениеЗаполнено(ПоляБазы) Тогда + + Для Каждого Поле Из ПоляБазы Цикл + + ДанныеПоля = Поле.Значение; + ТипПоля = ДанныеПоля["type"]; + + ЗаполняемыеДанные = Данные.Получить(Поле.Ключ); + + Если ЗаполняемыеДанные = Неопределено Тогда + Продолжить; + КонецЕсли; + + ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные); + + Если ПреобразованныеДанные = Неопределено Тогда + Продолжить; + КонецЕсли; + + Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные); + + КонецЦикла; + + КонецЕсли; + + Возврат Свойства; + +КонецФункции + +Процедура УдалитьЛишниеПоляБлока(Знач Блок) + + МассивЛишних = Новый Массив; + МассивЛишних.Добавить("request_id"); + МассивЛишних.Добавить("archived"); + МассивЛишних.Добавить("created_by"); + МассивЛишних.Добавить("last_edited_time"); + МассивЛишних.Добавить("created_time"); + МассивЛишних.Добавить("has_children"); + МассивЛишних.Добавить("parrent"); + МассивЛишних.Добавить("last_edited_by"); + МассивЛишних.Добавить("id"); + + Для Каждого Поле Из МассивЛишних Цикл + + Если Не Блок.Получить(Поле) = Неопределено Тогда + Блок.Удалить(Поле); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#Область ПреобразованиеТипов + +Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение) + + Если Тип = "title" Тогда + Возврат ПреобразоватьЗаголовок(Значение); + ИначеЕсли Тип = "rich_text" Тогда + Возврат ПреобразоватьТекст(Значение); + ИначеЕсли Тип = "number" Тогда + Возврат ПреобразоватьЧисло(Значение); + ИначеЕсли Тип = "select" Тогда + Возврат ПреобразоватьВариантВыбора(Значение); + ИначеЕсли Тип = "multi_select" Тогда + Возврат ПреобразоватьМножественныйВыбор(Значение); + ИначеЕсли Тип = "status" Тогда + Возврат ПреобразоватьСтатус(Значение); + ИначеЕсли Тип = "date" Тогда + Возврат ПреобразоватьДату(Значение); + ИначеЕсли Тип = "relation" Тогда + Возврат ПреобразоватьСвязь(Значение); + ИначеЕсли Тип = "people" Тогда + Возврат ПреобразоватьПользователей(Значение); + ИначеЕсли Тип = "files" Тогда + Возврат ПреобразоватьФайлы(Значение); + ИначеЕсли Тип = "checkbox" Тогда + Возврат ПреобразоватьБулево(Значение); + ИначеЕсли Тип = "url" Тогда + Возврат ПреобразоватьСсылку(Значение); + ИначеЕсли Тип = "email" Тогда + Возврат ПреобразоватьПочту(Значение); + ИначеЕсли Тип = "phone_number" Тогда + Возврат ПреобразоватьТелефон(Значение); + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция ПреобразоватьЗаголовок(Знач Заголовок) + + СтруктураДанных = Новый Структура; + СтруктураТекста = Новый Структура; + МассивДанных = Новый Массив; + + СтруктураТекста.Вставить("content", Заголовок); + СтруктураТекста.Вставить("link" , Неопределено); + + СтруктураДанных.Вставить("type", "text"); + СтруктураДанных.Вставить("text", СтруктураТекста); + + МассивДанных.Добавить(СтруктураДанных); + + Возврат Новый Структура("title", МассивДанных); + +КонецФункции + +Функция ПреобразоватьТекст(Знач Текст) + + МассивТекста = Новый Массив; + СтруктураТекста = Новый Структура; + + СтруктураТекста.Вставить("type", "text"); + СтруктураТекста.Вставить("text", Новый Структура("content", Текст)); + + МассивТекста.Добавить(СтруктураТекста); + + Возврат Новый Структура("rich_text", МассивТекста); + +КонецФункции + +Функция ПреобразоватьЧисло(Знач Число) + Возврат Новый Структура("number", Число); +КонецФункции + +Функция ПреобразоватьВариантВыбора(Знач Вариант) + + СтруктураВыбора = Новый Структура; + СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант)); + + Возврат СтруктураВыбора; + +КонецФункции + +Функция ПреобразоватьСтатус(Знач Статус) + + СтруктураСтатуса = Новый Структура; + СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус)); + + Возврат СтруктураСтатуса; + +КонецФункции + +Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов) + + МассивВариантовВыбора = Новый Массив; + + Для Каждого Вариант Из МассивВариантов Цикл + МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант)); + КонецЦикла; + + Возврат Новый Структура("multi_select", МассивВариантовВыбора); + +КонецФункции + +Функция ПреобразоватьДату(Знач Дата) + + СтруктураДаты = Новый Структура; + + Если Дата = НачалоДня(Дата) Тогда + ФорматДаты = "ДФ=yyyy-MM-dd"; + Иначе + ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ"; + КонецЕсли; + + Дата = Формат(Дата, ФорматДаты); + СтруктураДаты.Вставить("start", Дата); + + Возврат Новый Структура("date", СтруктураДаты); + +КонецФункции + +Функция ПреобразоватьСвязь(Знач Идентификатор) + + МассивСвязи = Новый Массив; + МассивСвязи.Добавить(Новый Структура("id", Идентификатор)); + + Возврат Новый Структура("relation", МассивСвязи); + +КонецФункции + +Функция ПреобразоватьПользователей(Знач МассивИД) + + Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда + МассивИД_ = Новый Массив; + МассивИД_.Добавить(МассивИД); + МассивИД = МассивИД_; + КонецЕсли; + + МассивПользователей = Новый Массив; + + Для Каждого Идентификатор Из МассивИД Цикл + + СтруктураПользователя = Новый Структура; + СтруктураПользователя.Вставить("object", "user"); + СтруктураПользователя.Вставить("id" , Идентификатор); + МассивПользователей.Добавить(СтруктураПользователя); + + КонецЦикла; + + Возврат Новый Структура("people", МассивПользователей); + +КонецФункции + +Функция ПреобразоватьФайлы(Знач СоответствиеФайлов) + + МассивФайлов = Новый Массив; + + Для Каждого Файл Из СоответствиеФайлов Цикл + + СтруктураФайла = Новый Структура; + СтруктураФайла.Вставить("type" , "external"); + СтруктураФайла.Вставить("name" , Файл.Ключ); + СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение)); + + МассивФайлов.Добавить(СтруктураФайла); + + КонецЦикла; + + Возврат Новый Структура("files", МассивФайлов); + +КонецФункции + +Функция ПреобразоватьБулево(Знач Булево) + Возврат Новый Структура("checkbox", Булево); +КонецФункции + +Функция ПреобразоватьСсылку(Знач URL) + Возврат Новый Структура("url", URL); +КонецФункции + +Функция ПреобразоватьПочту(Знач Почта) + Возврат Новый Структура("email", Почта); +КонецФункции + +Функция ПреобразоватьТелефон(Знач Телефон) + Возврат Новый Структура("phone_number", Телефон); +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Slack.os b/src/ru/OInt/core/Modules/OPI_Slack.os similarity index 98% rename from ru/OInt/core/Modules/OPI_Slack.os rename to src/ru/OInt/core/Modules/OPI_Slack.os index 237f9bc5fd..7ec31af5b4 100644 --- a/ru/OInt/core/Modules/OPI_Slack.os +++ b/src/ru/OInt/core/Modules/OPI_Slack.os @@ -1,1055 +1,1055 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Slack.os -// Библиотека: Slack -// Команда CLI: slack - -// 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:IncorrectLineBreak-off -// BSLLS:Typo-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область УправлениеИНастройки - -// Получить информацию о боте -// Получает основную информацию о боте -// -// Параметры: -// Токен - Строка - Токен бота - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт - - URL = "https://slack.com/api/auth.test"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Ответ = OPI_Инструменты.Get(URL, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список рабочих областей -// Получает список рабочих областей, в которых подключен бот -// -// Параметры: -// Токен - Строка - Токен бота - token -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/auth.teams.list"; - Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); - - Возврат Ответ; - -КонецФункции - -// Получить список пользователей -// Получает список пользователей рабочей области -// -// Параметры: -// Токен - Строка - Токен бота - token -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/users.list"; - Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаССообщениями - -// Отправить сообщение -// Отправляет сообщение в выбранный час -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Текст - Строка - Текст сообщения - text -// ДатаОтправки - Дата - Дата отправки для отложенного сообщения - date -// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт - - Строка_ = "Строка"; - ЕстьДата = ЗначениеЗаполнено(ДатаОтправки); - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки); - - Если ТипЗнч(Блоки) = Тип("Массив") Тогда - - Для Н = 0 По Блоки.ВГраница() Цикл - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]); - КонецЦикла; - - КонецЕсли; - - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив" , Параметры); - - Если ЕстьДата Тогда - - URL = "https://slack.com/api/chat.scheduleMessage"; - OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры); - - Иначе - - URL = "https://slack.com/api/chat.postMessage"; - - КонецЕсли; - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Отправить эфемерное сообщение -// Отправляет сообщение, которое приходит в канал, но видно -// только конкретному пользователю -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Текст - Строка - Текст сообщения - text -// Пользователь - Строка - ID пользователя - user -// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОтправитьЭфемерноеСообщение(Знач Токен - , Знач Канал - , Знач Текст = "" - , Знач Пользователь = "" - , Знач Блоки = "") Экспорт - - Строка_ = "Строка"; - - Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда - OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки); - КонецЕсли; - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("user" , Пользователь, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("blocks" , Блоки , "Коллекция", Параметры); - - URL = "https://slack.com/api/chat.postEphemeral"; - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Изменить сообщение -// Изменяет состав существующего сообщения -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка сообщения - stamp -// Текст - Строка - Новый текст сообщения - text -// МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт - - Строка_ = "Строка"; - URL = "https://slack.com/api/chat.update"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("ts" , Отметка , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить сообщение -// Удаляет сообщение канала по timestamp -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка или ID сообщения - stamp -// ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное); - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Если ЭтоОтложенное Тогда - URL = "https://slack.com/api/chat.deleteScheduledMessage"; - ПолеОтметки = "scheduled_message_id"; - Иначе - URL = "https://slack.com/api/chat.delete"; - ПолеОтметки = "ts"; - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список отложенных сообщений -// Получает список отложенных сообщений канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/chat.scheduledMessages.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить ссылку на сообщение -// Получает постоянный UTL к сообщению канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка или ID сообщения - stamp -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт - - URL = "https://slack.com/api/chat.getPermalink"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список ответов на сообщение -// Получает массив сообщений, которые являются ответом на указанное -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Отметка - Строка - Временная отметка или ID сообщения - stamp -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт - - Строка_ = "Строка"; - URL = "https://slack.com/api/conversations.replies"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("ts" , Отметка, Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСКаналами - -// Получить список каналов -// Получает список доступных каналов -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов - notarchived -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/conversations.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить список пользователей канала -// Получает список пользователей указанного канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Идентификатор канала - channel -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/conversations.members"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать канал -// Создает новый канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Название - Строка - Наименование канала - title -// Приватный - Булево - Создать канал приватным - private -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт - - URL = "https://slack.com/api/conversations.create"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("name" , Название , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Архивировать канал -// Архивирует активный канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.archive"; - Ответ = УправлениеДиалогом(Токен, Канал, URL); - Возврат Ответ; - -КонецФункции - -// Получить канал -// Получает информацию о канале -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.info"; - Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); - Возврат Ответ; - -КонецФункции - -// Получить историю канала -// Получает информацию событиях канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.history"; - Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); - Возврат Ответ; - -КонецФункции - -// Пригласить пользователей в канал -// Добавляет указанных пользователей в канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// МассивПользователей - Массив Из Строка - Массив ID пользователей - users -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт - - URL = "https://slack.com/api/conversations.invite"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); - МассивПользователей = СтрСоединить(МассивПользователей, ","); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("users" , МассивПользователей, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Выгнать пользователя из канала -// Удаляет указанного пользователя из канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Пользователь - Строка - ID пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт - - URL = "https://slack.com/api/conversations.kick"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("user" , Пользователь, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Вступить в канал -// Добавляет текущего бота в канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.join"; - Ответ = УправлениеДиалогом(Токен, Канал, URL); - Возврат Ответ; - -КонецФункции - -// Покинуть канал -// Удаляет текущего бота из канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт - - URL = "https://slack.com/api/conversations.leave"; - Ответ = УправлениеДиалогом(Токен, Канал, URL); - Возврат Ответ; - -КонецФункции - -// Установить тему канала -// Устанавливает тему канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Тема - Строка - Тема канала - theme -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт - - URL = "https://slack.com/api/conversations.setTopic"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("topic" , Тема , "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Установить цель канала -// Устанавливает цель (описание) канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Цель - Строка - Цель канала - purpose -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт - - URL = "https://slack.com/api/conversations.setPurpose"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("purpose", Цель , "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Переименовать канал -// Изменяет название канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - ID канала - channel -// Название - Строка - Новое название канала - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт - - URL = "https://slack.com/api/conversations.rename"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("name" , Название, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСДиалогами - -// Открыть диалог -// Открывает новый диалог с одним или несколькими пользователями -// -// Параметры: -// Токен - Строка - Токен бота - token -// МассивПользователей - Массив из Строка - Массив ID пользователей - users -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт - - URL = "https://slack.com/api/conversations.open"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); - МассивПользователей = СтрСоединить(МассивПользователей, ","); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Закрыть диалог -// Закрывает существующий диалог -// -// Параметры: -// Токен - Строка - Токен бота - token -// Диалог - Строка - ID диалога - conv -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт - - URL = "https://slack.com/api/conversations.close"; - Ответ = УправлениеДиалогом(Токен, Диалог, URL); - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСФайлами - -// Получить список файлов -// Получает список файлов бота или канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Канал для отбора - channel -// НомерСтраницы - Число, Строка - Номер страницы - page -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт - - URL = "https://slack.com/api/files.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("page" , НомерСтраницы, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл -// Загружает файл на сервера Slack -// -// Параметры: -// Токен - Строка - Токен бота - token -// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file -// ИмяФайла - Строка - Имя файла с расширением - filename -// Заголовок - Строка - Имя файла в Slack - title -// Канал - Строка - ID канала - channel -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); - - Строка_ = "Строка"; - Upload_url = "upload_url"; - File_id = "file_id"; - URL = "https://slack.com/api/files.getUploadURLExternal"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - Размер = Файл.Размер(); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - URL = Ответ[Upload_url]; - Идентификатор = Ответ[File_id]; - - Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда - Возврат Ответ; - КонецЕсли; - - Файлы = Новый Соответствие; - Файлы.Вставить(ИмяФайла, Файл); - - Ответ = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки); - URL = "https://slack.com/api/files.completeUploadExternal"; - ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("channel_id", Канал , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры); - - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить данные файла -// Получает информацию о файле -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.info"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET"); - - Возврат Ответ; - -КонецФункции - -// Удалить файл -// Удаляет файл на Slack -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.delete"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -// Сделать файл публичным -// Создает публичный URL для файла. Требует токен пользователя -// -// Параметры: -// Токен - Строка - Токен пользователя - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.sharedPublicURL"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -// Сделать файл приватным -// Удаляет публичный URL у файла. Требует токен пользователя -// -// Параметры: -// Токен - Строка - Токен пользователя - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.revokePublicURL"; - Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСУдаленнымиФайлами - -// Получить список внешних файлов -// Получает список внешних файлов пользователя или канала -// -// Параметры: -// Токен - Строка - Токен бота - token -// Канал - Строка - Канал для отбора - channel -// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт - - URL = "https://slack.com/api/files.remote.list"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить внешний файл -// Получает информацию о внешнем файле -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.remote.info"; - Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -// Добавить внешний файл -// Добавляет новый внешний файл -// -// Параметры: -// Токен - Строка - Токен бота - token -// URL - Строка - URL к внешнему файлу - url -// Заголовок - Строка - Заголовок файла для Slack - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт - - Строка_ = "Строка"; - URL = "https://slack.com/api/files.remote.add"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - UID = Строка(Новый УникальныйИдентификатор()); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("external_url", URL , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("external_id" , UID , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("title" , Заголовок , Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Отправить внешний файл -// Отправляет внейшний файл по списку каналов -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// МассивКаналов - Массив Из Строка - Массив каналов для отправки - channels -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт - - URL = "https://slack.com/api/files.remote.share"; - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов); - МассивКаналов = СтрСоединить(МассивКаналов, ","); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file" , ИдентификаторФайла , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить внешний файл -// Удаляет внешний файл из Slack -// -// Параметры: -// Токен - Строка - Токен бота - token -// ИдентификаторФайла - Строка - Идентификатор файла - fileid -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack -Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт - - URL = "https://slack.com/api/files.remote.remove"; - Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область ФормированиеБлоков - -// Сформировать блок картинку -// Формирует блок с картинкой для добавления в массив блоков сообщения -// -// Параметры: -// URL - Строка - URL картинки - picture -// АльтернативныйТекст - Строка - Альтернативный текст картинки - alt -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Блок картинки -Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт - - Строка_ = "Строка"; - - Блок = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле("type" , "image" , Строка_, Блок); - OPI_Инструменты.ДобавитьПоле("image_url", URL , Строка_, Блок); - OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст , Строка_, Блок); - - Возврат Блок; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьЗаголовокАвторизации(Знач Токен) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization", "Bearer " + Токен); - Возврат Заголовки; - -КонецФункции - -Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST") - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - ВидЗапроса = вРег(ВидЗапроса); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры); - - Если ВидЗапроса = "POST" Тогда - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - Иначе - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST") - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - ВидЗапроса = вРег(ВидЗапроса); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); - - Если ВидЗапроса = "POST" Тогда - Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); - Иначе - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор) - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL) - - Заголовки = ПолучитьЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Slack.os +// Библиотека: Slack +// Команда CLI: slack + +// 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:IncorrectLineBreak-off +// BSLLS:Typo-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область УправлениеИНастройки + +// Получить информацию о боте +// Получает основную информацию о боте +// +// Параметры: +// Токен - Строка - Токен бота - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт + + URL = "https://slack.com/api/auth.test"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список рабочих областей +// Получает список рабочих областей, в которых подключен бот +// +// Параметры: +// Токен - Строка - Токен бота - token +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/auth.teams.list"; + Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); + + Возврат Ответ; + +КонецФункции + +// Получить список пользователей +// Получает список пользователей рабочей области +// +// Параметры: +// Токен - Строка - Токен бота - token +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/users.list"; + Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаССообщениями + +// Отправить сообщение +// Отправляет сообщение в выбранный час +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Текст - Строка - Текст сообщения - text +// ДатаОтправки - Дата - Дата отправки для отложенного сообщения - date +// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт + + Строка_ = "Строка"; + ЕстьДата = ЗначениеЗаполнено(ДатаОтправки); + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки); + + Если ТипЗнч(Блоки) = Тип("Массив") Тогда + + Для Н = 0 По Блоки.ВГраница() Цикл + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]); + КонецЦикла; + + КонецЕсли; + + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив" , Параметры); + + Если ЕстьДата Тогда + + URL = "https://slack.com/api/chat.scheduleMessage"; + OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры); + + Иначе + + URL = "https://slack.com/api/chat.postMessage"; + + КонецЕсли; + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Отправить эфемерное сообщение +// Отправляет сообщение, которое приходит в канал, но видно +// только конкретному пользователю +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Текст - Строка - Текст сообщения - text +// Пользователь - Строка - ID пользователя - user +// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОтправитьЭфемерноеСообщение(Знач Токен + , Знач Канал + , Знач Текст = "" + , Знач Пользователь = "" + , Знач Блоки = "") Экспорт + + Строка_ = "Строка"; + + Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда + OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки); + КонецЕсли; + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("user" , Пользователь, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("blocks" , Блоки , "Коллекция", Параметры); + + URL = "https://slack.com/api/chat.postEphemeral"; + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить сообщение +// Изменяет состав существующего сообщения +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка сообщения - stamp +// Текст - Строка - Новый текст сообщения - text +// МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт + + Строка_ = "Строка"; + URL = "https://slack.com/api/chat.update"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("ts" , Отметка , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить сообщение +// Удаляет сообщение канала по timestamp +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка или ID сообщения - stamp +// ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное); + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Если ЭтоОтложенное Тогда + URL = "https://slack.com/api/chat.deleteScheduledMessage"; + ПолеОтметки = "scheduled_message_id"; + Иначе + URL = "https://slack.com/api/chat.delete"; + ПолеОтметки = "ts"; + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список отложенных сообщений +// Получает список отложенных сообщений канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/chat.scheduledMessages.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить ссылку на сообщение +// Получает постоянный UTL к сообщению канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка или ID сообщения - stamp +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт + + URL = "https://slack.com/api/chat.getPermalink"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список ответов на сообщение +// Получает массив сообщений, которые являются ответом на указанное +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Отметка - Строка - Временная отметка или ID сообщения - stamp +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт + + Строка_ = "Строка"; + URL = "https://slack.com/api/conversations.replies"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("ts" , Отметка, Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСКаналами + +// Получить список каналов +// Получает список доступных каналов +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов - notarchived +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/conversations.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить список пользователей канала +// Получает список пользователей указанного канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Идентификатор канала - channel +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/conversations.members"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать канал +// Создает новый канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Название - Строка - Наименование канала - title +// Приватный - Булево - Создать канал приватным - private +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт + + URL = "https://slack.com/api/conversations.create"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , Название , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Архивировать канал +// Архивирует активный канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.archive"; + Ответ = УправлениеДиалогом(Токен, Канал, URL); + Возврат Ответ; + +КонецФункции + +// Получить канал +// Получает информацию о канале +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.info"; + Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); + Возврат Ответ; + +КонецФункции + +// Получить историю канала +// Получает информацию событиях канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.history"; + Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET"); + Возврат Ответ; + +КонецФункции + +// Пригласить пользователей в канал +// Добавляет указанных пользователей в канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// МассивПользователей - Массив Из Строка - Массив ID пользователей - users +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт + + URL = "https://slack.com/api/conversations.invite"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); + МассивПользователей = СтрСоединить(МассивПользователей, ","); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("users" , МассивПользователей, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Выгнать пользователя из канала +// Удаляет указанного пользователя из канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Пользователь - Строка - ID пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт + + URL = "https://slack.com/api/conversations.kick"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("user" , Пользователь, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Вступить в канал +// Добавляет текущего бота в канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.join"; + Ответ = УправлениеДиалогом(Токен, Канал, URL); + Возврат Ответ; + +КонецФункции + +// Покинуть канал +// Удаляет текущего бота из канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт + + URL = "https://slack.com/api/conversations.leave"; + Ответ = УправлениеДиалогом(Токен, Канал, URL); + Возврат Ответ; + +КонецФункции + +// Установить тему канала +// Устанавливает тему канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Тема - Строка - Тема канала - theme +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт + + URL = "https://slack.com/api/conversations.setTopic"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("topic" , Тема , "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Установить цель канала +// Устанавливает цель (описание) канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Цель - Строка - Цель канала - purpose +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт + + URL = "https://slack.com/api/conversations.setPurpose"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("purpose", Цель , "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Переименовать канал +// Изменяет название канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - ID канала - channel +// Название - Строка - Новое название канала - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт + + URL = "https://slack.com/api/conversations.rename"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("name" , Название, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСДиалогами + +// Открыть диалог +// Открывает новый диалог с одним или несколькими пользователями +// +// Параметры: +// Токен - Строка - Токен бота - token +// МассивПользователей - Массив из Строка - Массив ID пользователей - users +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт + + URL = "https://slack.com/api/conversations.open"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей); + МассивПользователей = СтрСоединить(МассивПользователей, ","); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Закрыть диалог +// Закрывает существующий диалог +// +// Параметры: +// Токен - Строка - Токен бота - token +// Диалог - Строка - ID диалога - conv +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт + + URL = "https://slack.com/api/conversations.close"; + Ответ = УправлениеДиалогом(Токен, Диалог, URL); + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСФайлами + +// Получить список файлов +// Получает список файлов бота или канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Канал для отбора - channel +// НомерСтраницы - Число, Строка - Номер страницы - page +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт + + URL = "https://slack.com/api/files.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("page" , НомерСтраницы, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл +// Загружает файл на сервера Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file +// ИмяФайла - Строка - Имя файла с расширением - filename +// Заголовок - Строка - Имя файла в Slack - title +// Канал - Строка - ID канала - channel +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + + Строка_ = "Строка"; + Upload_url = "upload_url"; + File_id = "file_id"; + URL = "https://slack.com/api/files.getUploadURLExternal"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Размер = Файл.Размер(); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + URL = Ответ[Upload_url]; + Идентификатор = Ответ[File_id]; + + Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда + Возврат Ответ; + КонецЕсли; + + Файлы = Новый Соответствие; + Файлы.Вставить(ИмяФайла, Файл); + + Ответ = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки); + URL = "https://slack.com/api/files.completeUploadExternal"; + ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("channel_id", Канал , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить данные файла +// Получает информацию о файле +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.info"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET"); + + Возврат Ответ; + +КонецФункции + +// Удалить файл +// Удаляет файл на Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.delete"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Сделать файл публичным +// Создает публичный URL для файла. Требует токен пользователя +// +// Параметры: +// Токен - Строка - Токен пользователя - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.sharedPublicURL"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Сделать файл приватным +// Удаляет публичный URL у файла. Требует токен пользователя +// +// Параметры: +// Токен - Строка - Токен пользователя - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.revokePublicURL"; + Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСУдаленнымиФайлами + +// Получить список внешних файлов +// Получает список внешних файлов пользователя или канала +// +// Параметры: +// Токен - Строка - Токен бота - token +// Канал - Строка - Канал для отбора - channel +// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт + + URL = "https://slack.com/api/files.remote.list"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить внешний файл +// Получает информацию о внешнем файле +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.remote.info"; + Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +// Добавить внешний файл +// Добавляет новый внешний файл +// +// Параметры: +// Токен - Строка - Токен бота - token +// URL - Строка - URL к внешнему файлу - url +// Заголовок - Строка - Заголовок файла для Slack - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт + + Строка_ = "Строка"; + URL = "https://slack.com/api/files.remote.add"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + UID = Строка(Новый УникальныйИдентификатор()); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("external_url", URL , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("external_id" , UID , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("title" , Заголовок , Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Отправить внешний файл +// Отправляет внейшний файл по списку каналов +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// МассивКаналов - Массив Из Строка - Массив каналов для отправки - channels +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт + + URL = "https://slack.com/api/files.remote.share"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов); + МассивКаналов = СтрСоединить(МассивКаналов, ","); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file" , ИдентификаторФайла , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить внешний файл +// Удаляет внешний файл из Slack +// +// Параметры: +// Токен - Строка - Токен бота - token +// ИдентификаторФайла - Строка - Идентификатор файла - fileid +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack +Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт + + URL = "https://slack.com/api/files.remote.remove"; + Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область ФормированиеБлоков + +// Сформировать блок картинку +// Формирует блок с картинкой для добавления в массив блоков сообщения +// +// Параметры: +// URL - Строка - URL картинки - picture +// АльтернативныйТекст - Строка - Альтернативный текст картинки - alt +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Блок картинки +Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт + + Строка_ = "Строка"; + + Блок = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле("type" , "image" , Строка_, Блок); + OPI_Инструменты.ДобавитьПоле("image_url", URL , Строка_, Блок); + OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст , Строка_, Блок); + + Возврат Блок; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьЗаголовокАвторизации(Знач Токен) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "Bearer " + Токен); + Возврат Заголовки; + +КонецФункции + +Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST") + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + ВидЗапроса = вРег(ВидЗапроса); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры); + + Если ВидЗапроса = "POST" Тогда + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + Иначе + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST") + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + ВидЗапроса = вРег(ВидЗапроса); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); + + Если ВидЗапроса = "POST" Тогда + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + Иначе + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор) + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL) + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Telegram.os b/src/ru/OInt/core/Modules/OPI_Telegram.os similarity index 98% rename from ru/OInt/core/Modules/OPI_Telegram.os rename to src/ru/OInt/core/Modules/OPI_Telegram.os index 0fd95001d1..0b368450ed 100644 --- a/ru/OInt/core/Modules/OPI_Telegram.os +++ b/src/ru/OInt/core/Modules/OPI_Telegram.os @@ -1,1253 +1,1253 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os -// Библиотека: Telegram -// Команда CLI: telegram - -// 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:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UnreachableCode-off -// BSLLS:CommentedCode-off - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область ПолучениеДанныхИНастройка - -// Получить информацию о боте -// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. -// -// Параметры: -// Токен - Строка - Токен бота - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПолучитьИнформациюБота(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/getMe"; - Ответ = OPI_Инструменты.Get(URL); - - Возврат Ответ; - -КонецФункции - -// Получить обновления -// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме -// -// Параметры: -// Токен - Строка - Токен бота - token -// Таймаут - Строка,Число - Время ожидания новых событий - timeout -// Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/getUpdates"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - Возврат Ответ; - -КонецФункции - -// Установить Webhook -// Устанавливает URL обработчика событий бота для работы в режиме Webhook -// -// Параметры: -// Токен - Строка - Токен бота - token -// URL - Строка - Адрес обработки запросов от Telegram (с https:) - url -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры); - - URL = "api.telegram.org/bot" + Токен + "/setWebHook"; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Удалить Webhook -// Удаляет URL обработчика событий бота для работы в режиме Webhook -// -// Параметры: -// Токен - Строка - Токен бота - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция УдалитьWebhook(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; - Ответ = OPI_Инструменты.Get(URL); - - Возврат Ответ; - -КонецФункции - -// Скачать файл -// Скачивает файл с серверов 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", Ответ); - - Возврат СоответствиеВозврата; - -КонецФункции - -#КонецОбласти - -#Область ОтправкаДанных - -// Отправить текстовое сообщение -// Отправляет текстовое сообщение в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьТекстовоеСообщение(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("text" , Текст , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - URL = "api.telegram.org/bot" + Токен + "/sendMessage"; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Отправить картинку -// Отправляет картинку в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьКартинку(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Картинка - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка); - -КонецФункции - -// Отправить видео -// Отправляет видео в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Видео - ДвоичныеДанные,Строка - Файл видео - video -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьВидео(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Видео - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка); - -КонецФункции - -// Отправить аудио -// Отправляет аудиофайл в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Аудио - ДвоичныеДанные,Строка - Файл аудио - audio -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьАудио(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Аудио - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка); - -КонецФункции - -// Отправить документ -// Отправляет документ в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Документ - ДвоичныеДанные,Строка - Файл документа - doc -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьДокумент(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Документ - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка); - -КонецФункции - -// Отправить гифку -// Отправляет гифку в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// Гифка - ДвоичныеДанные,Строка - Файл гифки - gif -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьГифку(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач Гифка - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка); - -КонецФункции - -// Отправить группу медиафайлов -// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Текст - Строка - Текст сообщения - text -// СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON файлов или путь к .json -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьМедиагруппу(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач СоответствиеФайлов - , Знач Клавиатура = "" - , Знач Разметка = "Markdown") Экспорт - - // СоответствиеФайлов - // Ключ - Файл, Значение - Тип - // Типы: audio, document, photo, video - // Нельзя замешивать разные типы! - - Строка_ = "Строка"; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); - - OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); - - URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup"; - СтруктураФайлов = Новый Структура; - Медиа = Новый Массив; - Параметры = Новый Структура; - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа); - - OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("caption" , Текст , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("media" , Медиа , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); - - Возврат Ответ; - -КонецФункции - -// Отправить местоположение -// Отправляет местоположение по географической широте и долготе в чат или канал -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Широта - Строка,Число - Географическая широта - lat -// Долгота - Строка,Число - Географическая долгота - long -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - - URL = "api.telegram.org/bot" + Токен + "/sendLocation"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("latitude" , Широта , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("longitude" , Долгота , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Отправить контакт -// Отправляет контакт с именем и номером телефона -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Имя - Строка - Имя контакта - name -// Фамилия - Строка - Фамилия контакта - surname -// Телефон - Строка - Телефон контакта - phone -// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - - URL = "api.telegram.org/bot" + Токен + "/sendContact"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown", Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("first_name" , Имя , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("last_name" , Фамилия , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("phone_number", Телефон , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Отправить опрос -// Отправляет опрос с вариантами ответа -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Вопрос - Строка - Вопрос опроса - question -// МассивОтветов - Массив из Строка - Массив вариантов ответа - options -// Анонимный - Булево - Анонимность опроса - anonymous -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); - - OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный); - - URL = "api.telegram.org/bot" + Токен + "/sendPoll"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("question" , Вопрос , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("options" , МассивОтветов, "СтрокаФайла", Параметры); - - Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0)); - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Переслать сообщение -// Пересылает сообщение между чатами или в рамках одного чата -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDОригинала - Строка,Число - ID оригинального сообщения - message -// ОткудаID - Строка,Число - ID чата оригинального сообщения - from -// КудаID - Строка,Число - ID целевого чата или IDЧата*IDТемы - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID); - OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID); - - URL = "api.telegram.org/bot" + Токен + "/forwardMessage"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_id" , IDОригинала, "Строка", Параметры); - - ДобавитьИдентификаторЧата(КудаID, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Сформировать клавиатуру по массиву кнопок -// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели -// -// Параметры: -// МассивКнопок - Массив из Строка - Массив кнопок - buttons -// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under -// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column -// -// Возвращаемое значение: -// Строка - JSON клавиатуры -Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок - , Знач ПодСообщением = Ложь - , Знач ОднаПодОдной = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); - OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); - - Если ОднаПодОдной Тогда - Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); - Иначе - Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); - КонецЕсли; - - Если ПодСообщением Тогда - СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); - Иначе - СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); - КонецЕсли; - - Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра); - - Возврат Клавиатура; - -КонецФункции - -#КонецОбласти - -#Область Администрирование - -// Бан -// Банит пользователя в выбранном чате -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// IDПользователя - Строка,Число - ID целевого пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/banChatMember"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Разбан -// Разбанивает забаненного ранее пользователя -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// IDПользователя - Строка,Число - ID целевого пользователя - user -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/unbanChatMember"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь , "Булево", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Создать ссылку-приглашение -// Создает ссылку для вступления в закрытый чат -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat -// Заголовок - Строка - Заголовок приглашения - title -// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire -// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СоздатьСсылкуПриглашение(Знач Токен - , Знач IDЧата - , Знач Заголовок = "" - , Знач ДатаИстечения = "" - , Знач ЛимитПользователей = 0) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("name" , Заголовок , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("member_limit" , ЛимитПользователей, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("expire_date" , ДатаИстечения , "Дата" , Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Закрепить сообщение -// Закрепляет сообщение в шапке чата -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID целевого чата - chat -// IDСообщения - Строка,Число - ID целевого сообщения - message -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/pinChatMessage"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, Строка_ , Параметры); - OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь , "Булево", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Открепить сообщение -// Открепляет сообщение в шапке чата -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата - chat -// IDСообщения - Строка,Число - ID целевого сообщения - message -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Получить число участников -// Получает общее число участников чата -// -// Параметры: -// Токен - Строка - Токен бота - token -// IDЧата - Строка,Число - ID целевого чата - chat -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТемамиФорума - -// Получить список иконок-аватаров -// Получает соответствие ID Emoji для установки в качестве иконок тем форума -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji -Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Result = "result"; - URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers"; - Ответ = OPI_Инструменты.Get(URL); - Иконки = Ответ[Result]; - - Если Не ЗначениеЗаполнено(Иконки) Тогда - Возврат Ответ; - КонецЕсли; - - Коллекция = Новый Соответствие; - - Для Каждого Иконка Из Иконки Цикл - Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]); - КонецЦикла; - - Возврат Коллекция; - -КонецФункции - -// Создать тему форума -// Создает новую тему в группе с включенным функционалом тем -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата создания темы - forum -// Заголовок - Строка - Заголовок темы - title -// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт - Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки); -КонецФункции - -// Изменить тему форума -// Создает новую тему в группе с включенным функционалом тем -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата создания темы - forum -// IDТемы - Строка,Число - ID темы - topic -// Заголовок - Строка - Новый заголовок - title -// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ИзменитьТемуФорума(Знач Токен - , Знач IDЧата - , Знач IDТемы - , Знач Заголовок = Неопределено - , Знач IDИконки = Неопределено) Экспорт - - Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы); -КонецФункции - -// Закрыть тему форума -// Закрывает тему для новых сообщений -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт - Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы); -КонецФункции - -// Открыть тему форума -// Повторно открывает ранее закрытую тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт - Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы); -КонецФункции - -// Удалить тему форума -// Удаляет тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт - Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы); -КонецФункции - -// Скрыть главную тему форума -// Скрывает главную тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт - Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина); -КонецФункции - -// Показать главную тему форума -// Показывает ранее скрытую главную тему форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт - Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь); -КонецФункции - -// Изменить имя главной темы форума -// Изменяет имя главной темы форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// Заголовок - Строка - Новое имя главной темы - title -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic"; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры); - - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -// Очистить список закрепленных сообщений темы -// Очищает список закрепленных сообщений в теме форума -// -// Параметры: -// Токен - Строка - Токен - token -// IDЧата - Строка,Число - ID чата темы - forum -// IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram -Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); - - Если ЗначениеЗаполнено(IDТемы) Тогда - Метод = "/unpinAllForumTopicMessages"; - Иначе - Метод = "/unpinAllGeneralForumTopicMessages"; - КонецЕсли; - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид); - - Расширение = ""; - Метод = ""; - - ОпределитьМетодОтправки(Вид, Метод, Расширение); - ПреобразоватьДанныеФайла(Файл, Расширение, Вид); - OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры); - OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); - - ДобавитьИдентификаторЧата(IDЧата, Параметры); - - СтруктураФайлов = Новый Структура; - СтруктураФайлов.Вставить(Вид + Расширение, Файл); - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеТемойФорума(Знач Токен - , Знач IDЧата - , Знач Заголовок = Неопределено - , Знач IDИконки = Неопределено - , Знач IDТемы = "") - - Строка_ = "Строка"; - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("name" , Заголовок, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("message_thread_id" , IDТемы , Строка_, Параметры); - - Если ЗначениеЗаполнено(IDТемы) Тогда - Метод = "/editForumTopic"; - Иначе - Метод = "/createForumTopic"; - КонецЕсли; - - OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Если ЗначениеЗаполнено(IDТемы) Тогда - Форум = "Forum"; - Иначе - Форум = "GeneralForum"; - КонецЕсли; - - Метод = ОпределитьМетодУправленияФорумом(Статус, Форум); - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть); - - Если Скрыть Тогда - Метод = "/hideGeneralForumTopic"; - Иначе - Метод = "/unhideGeneralForumTopic"; - КонецЕсли; - - Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры); - - URL = "api.telegram.org/bot" + Токен + Метод; - Ответ = OPI_Инструменты.Get(URL, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) - - Открыть = 1; - Закрыть = 2; - Удалить = 3; - - Если Статус = Открыть Тогда - Метод = "/reopen" + Форум + "Topic"; - ИначеЕсли Статус = Закрыть Тогда - Метод = "/close" + Форум + "Topic"; - ИначеЕсли Статус = Удалить Тогда - Метод = "/deleteForumTopic"; - Иначе - ВызватьИсключение "Некорректный статус управления форумом"; - КонецЕсли; - - Возврат Метод; - -КонецФункции - -Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок) - - Строки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопки = Новый Массив; - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - Строки.Добавить(Кнопки); - КонецЦикла; - - Возврат Строки; - -КонецФункции - -Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок) - - Строки = Новый Массив; - Кнопки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - КонецЦикла; - - Строки.Добавить(Кнопки); - - Возврат Строки; - -КонецФункции - -Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа) - - Счетчик = 0; - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - - Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда - ВызватьИсключение("Не удалось получить информацию из json медиа!"); - Возврат; - КонецЕсли; - - Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл - - Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда - - Двоичные = ТекущийФайл.Ключ; - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные); - - ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); - ИмяМедиа = ТекущийФайл.Значение - + Строка(Счетчик) - + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, ""); - - ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); - - Иначе - Двоичные = ТекущийФайл.Ключ; - ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); - ПолноеИмяМедиа = ИмяМедиа; - КонецЕсли; - - СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные); - - СтруктураМедиа = Новый Структура; - СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение); - СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); - - Если Счетчик = 0 Тогда - СтруктураМедиа.Вставить("caption", Текст); - КонецЕсли; - - Медиа.Добавить(СтруктураМедиа); - - Счетчик = Счетчик + 1; - - КонецЦикла; - - Медиа = OPI_Инструменты.JSONСтрокой(Медиа); - -КонецПроцедуры - -Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры) - - IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); - МассивЧата = СтрРазделить(IDЧата, "*", Ложь); - - Если МассивЧата.Количество() > 1 Тогда - - IDЧата = МассивЧата[0]; - IDТемы = МассивЧата[1]; - - Параметры.Вставить("message_thread_id", IDТемы); - - КонецЕсли; - - Параметры.Вставить("chat_id", IDЧата); - -КонецПроцедуры - -Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение) - - Если Вид = "photo" Тогда - Метод = "/sendPhoto"; - ИначеЕсли Вид = "video" Тогда - Метод = "/sendVideo"; - ИначеЕсли Вид = "audio" Тогда - Метод = "/sendAudio"; - ИначеЕсли Вид = "document" Тогда - Метод = "/sendDocument"; - ИначеЕсли Вид = "animation" Тогда - Метод = "/sendAnimation"; - Расширение = ".gif"; - Иначе - ВызватьИсключение "Некорректный вид отправки"; - КонецЕсли; - -КонецПроцедуры - -Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид) - - Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда - - ТекущийФайл = Новый Файл(Файл); - Расширение = ?(Вид = "document", ТекущийФайл.Расширение, Расширение); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - КонецЕсли; - - Расширение = СтрЗаменить(Расширение, ".", "___"); - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os +// Библиотека: Telegram +// Команда CLI: telegram + +// 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:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnreachableCode-off +// BSLLS:CommentedCode-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область ПолучениеДанныхИНастройка + +// Получить информацию о боте +// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д. +// +// Параметры: +// Токен - Строка - Токен бота - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПолучитьИнформациюБота(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/getMe"; + Ответ = OPI_Инструменты.Get(URL); + + Возврат Ответ; + +КонецФункции + +// Получить обновления +// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме +// +// Параметры: +// Токен - Строка - Токен бота - token +// Таймаут - Строка,Число - Время ожидания новых событий - timeout +// Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/getUpdates"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + Возврат Ответ; + +КонецФункции + +// Установить Webhook +// Устанавливает URL обработчика событий бота для работы в режиме Webhook +// +// Параметры: +// Токен - Строка - Токен бота - token +// URL - Строка - Адрес обработки запросов от Telegram (с https:) - url +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры); + + URL = "api.telegram.org/bot" + Токен + "/setWebHook"; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Удалить Webhook +// Удаляет URL обработчика событий бота для работы в режиме Webhook +// +// Параметры: +// Токен - Строка - Токен бота - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция УдалитьWebhook(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/deleteWebHook"; + Ответ = OPI_Инструменты.Get(URL); + + Возврат Ответ; + +КонецФункции + +// Скачать файл +// Скачивает файл с серверов 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", Ответ); + + Возврат СоответствиеВозврата; + +КонецФункции + +#КонецОбласти + +#Область ОтправкаДанных + +// Отправить текстовое сообщение +// Отправляет текстовое сообщение в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьТекстовоеСообщение(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("text" , Текст , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + URL = "api.telegram.org/bot" + Токен + "/sendMessage"; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Отправить картинку +// Отправляет картинку в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьКартинку(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Картинка + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка); + +КонецФункции + +// Отправить видео +// Отправляет видео в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Видео - ДвоичныеДанные,Строка - Файл видео - video +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьВидео(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Видео + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка); + +КонецФункции + +// Отправить аудио +// Отправляет аудиофайл в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Аудио - ДвоичныеДанные,Строка - Файл аудио - audio +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьАудио(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Аудио + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка); + +КонецФункции + +// Отправить документ +// Отправляет документ в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Документ - ДвоичныеДанные,Строка - Файл документа - doc +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьДокумент(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Документ + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка); + +КонецФункции + +// Отправить гифку +// Отправляет гифку в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// Гифка - ДвоичныеДанные,Строка - Файл гифки - gif +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьГифку(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач Гифка + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка); + +КонецФункции + +// Отправить группу медиафайлов +// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Текст - Строка - Текст сообщения - text +// СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON файлов или путь к .json +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьМедиагруппу(Знач Токен + , Знач IDЧата + , Знач Текст + , Знач СоответствиеФайлов + , Знач Клавиатура = "" + , Знач Разметка = "Markdown") Экспорт + + // СоответствиеФайлов + // Ключ - Файл, Значение - Тип + // Типы: audio, document, photo, video + // Нельзя замешивать разные типы! + + Строка_ = "Строка"; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); + + OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); + + URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup"; + СтруктураФайлов = Новый Структура; + Медиа = Новый Массив; + Параметры = Новый Структура; + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа); + + OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("caption" , Текст , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("media" , Медиа , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); + + Возврат Ответ; + +КонецФункции + +// Отправить местоположение +// Отправляет местоположение по географической широте и долготе в чат или канал +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Широта - Строка,Число - Географическая широта - lat +// Долгота - Строка,Число - Географическая долгота - long +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + + URL = "api.telegram.org/bot" + Токен + "/sendLocation"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("latitude" , Широта , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("longitude" , Долгота , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Отправить контакт +// Отправляет контакт с именем и номером телефона +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Имя - Строка - Имя контакта - name +// Фамилия - Строка - Фамилия контакта - surname +// Телефон - Строка - Телефон контакта - phone +// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + + URL = "api.telegram.org/bot" + Токен + "/sendContact"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown", Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("first_name" , Имя , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("last_name" , Фамилия , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("phone_number", Телефон , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Отправить опрос +// Отправляет опрос с вариантами ответа +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Вопрос - Строка - Вопрос опроса - question +// МассивОтветов - Массив из Строка - Массив вариантов ответа - options +// Анонимный - Булево - Анонимность опроса - anonymous +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); + + OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный); + + URL = "api.telegram.org/bot" + Токен + "/sendPoll"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("question" , Вопрос , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("options" , МассивОтветов, "СтрокаФайла", Параметры); + + Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0)); + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Переслать сообщение +// Пересылает сообщение между чатами или в рамках одного чата +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDОригинала - Строка,Число - ID оригинального сообщения - message +// ОткудаID - Строка,Число - ID чата оригинального сообщения - from +// КудаID - Строка,Число - ID целевого чата или IDЧата*IDТемы - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID); + OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID); + + URL = "api.telegram.org/bot" + Токен + "/forwardMessage"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_id" , IDОригинала, "Строка", Параметры); + + ДобавитьИдентификаторЧата(КудаID, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Сформировать клавиатуру по массиву кнопок +// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели +// +// Параметры: +// МассивКнопок - Массив из Строка - Массив кнопок - buttons +// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under +// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column +// +// Возвращаемое значение: +// Строка - JSON клавиатуры +Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок + , Знач ПодСообщением = Ложь + , Знач ОднаПодОдной = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением); + OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); + + Если ОднаПодОдной Тогда + Строки = СоздатьВысокуюКлавиатуру(МассивКнопок); + Иначе + Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок); + КонецЕсли; + + Если ПодСообщением Тогда + СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); + Иначе + СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина); + КонецЕсли; + + Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра); + + Возврат Клавиатура; + +КонецФункции + +#КонецОбласти + +#Область Администрирование + +// Бан +// Банит пользователя в выбранном чате +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// IDПользователя - Строка,Число - ID целевого пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/banChatMember"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Разбан +// Разбанивает забаненного ранее пользователя +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// IDПользователя - Строка,Число - ID целевого пользователя - user +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/unbanChatMember"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь , "Булево", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Создать ссылку-приглашение +// Создает ссылку для вступления в закрытый чат +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat +// Заголовок - Строка - Заголовок приглашения - title +// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire +// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СоздатьСсылкуПриглашение(Знач Токен + , Знач IDЧата + , Знач Заголовок = "" + , Знач ДатаИстечения = "" + , Знач ЛимитПользователей = 0) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("name" , Заголовок , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("member_limit" , ЛимитПользователей, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("expire_date" , ДатаИстечения , "Дата" , Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Закрепить сообщение +// Закрепляет сообщение в шапке чата +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID целевого чата - chat +// IDСообщения - Строка,Число - ID целевого сообщения - message +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/pinChatMessage"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, Строка_ , Параметры); + OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь , "Булево", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Открепить сообщение +// Открепляет сообщение в шапке чата +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата - chat +// IDСообщения - Строка,Число - ID целевого сообщения - message +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Получить число участников +// Получает общее число участников чата +// +// Параметры: +// Токен - Строка - Токен бота - token +// IDЧата - Строка,Число - ID целевого чата - chat +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТемамиФорума + +// Получить список иконок-аватаров +// Получает соответствие ID Emoji для установки в качестве иконок тем форума +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji +Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Result = "result"; + URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers"; + Ответ = OPI_Инструменты.Get(URL); + Иконки = Ответ[Result]; + + Если Не ЗначениеЗаполнено(Иконки) Тогда + Возврат Ответ; + КонецЕсли; + + Коллекция = Новый Соответствие; + + Для Каждого Иконка Из Иконки Цикл + Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]); + КонецЦикла; + + Возврат Коллекция; + +КонецФункции + +// Создать тему форума +// Создает новую тему в группе с включенным функционалом тем +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата создания темы - forum +// Заголовок - Строка - Заголовок темы - title +// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт + Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки); +КонецФункции + +// Изменить тему форума +// Создает новую тему в группе с включенным функционалом тем +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата создания темы - forum +// IDТемы - Строка,Число - ID темы - topic +// Заголовок - Строка - Новый заголовок - title +// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ИзменитьТемуФорума(Знач Токен + , Знач IDЧата + , Знач IDТемы + , Знач Заголовок = Неопределено + , Знач IDИконки = Неопределено) Экспорт + + Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы); +КонецФункции + +// Закрыть тему форума +// Закрывает тему для новых сообщений +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы); +КонецФункции + +// Открыть тему форума +// Повторно открывает ранее закрытую тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы); +КонецФункции + +// Удалить тему форума +// Удаляет тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт + Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы); +КонецФункции + +// Скрыть главную тему форума +// Скрывает главную тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт + Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина); +КонецФункции + +// Показать главную тему форума +// Показывает ранее скрытую главную тему форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт + Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь); +КонецФункции + +// Изменить имя главной темы форума +// Изменяет имя главной темы форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// Заголовок - Строка - Новое имя главной темы - title +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic"; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +// Очистить список закрепленных сообщений темы +// Очищает список закрепленных сообщений в теме форума +// +// Параметры: +// Токен - Строка - Токен - token +// IDЧата - Строка,Число - ID чата темы - forum +// IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram +Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); + + Если ЗначениеЗаполнено(IDТемы) Тогда + Метод = "/unpinAllForumTopicMessages"; + Иначе + Метод = "/unpinAllGeneralForumTopicMessages"; + КонецЕсли; + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид); + + Расширение = ""; + Метод = ""; + + ОпределитьМетодОтправки(Вид, Метод, Расширение); + ПреобразоватьДанныеФайла(Файл, Расширение, Вид); + OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры); + OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры); + + ДобавитьИдентификаторЧата(IDЧата, Параметры); + + СтруктураФайлов = Новый Структура; + СтруктураФайлов.Вставить(Вид + Расширение, Файл); + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed"); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеТемойФорума(Знач Токен + , Знач IDЧата + , Знач Заголовок = Неопределено + , Знач IDИконки = Неопределено + , Знач IDТемы = "") + + Строка_ = "Строка"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , Заголовок, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("message_thread_id" , IDТемы , Строка_, Параметры); + + Если ЗначениеЗаполнено(IDТемы) Тогда + Метод = "/editForumTopic"; + Иначе + Метод = "/createForumTopic"; + КонецЕсли; + + OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры); + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Если ЗначениеЗаполнено(IDТемы) Тогда + Форум = "Forum"; + Иначе + Форум = "GeneralForum"; + КонецЕсли; + + Метод = ОпределитьМетодУправленияФорумом(Статус, Форум); + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры); + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть); + + Если Скрыть Тогда + Метод = "/hideGeneralForumTopic"; + Иначе + Метод = "/unhideGeneralForumTopic"; + КонецЕсли; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры); + + URL = "api.telegram.org/bot" + Токен + Метод; + Ответ = OPI_Инструменты.Get(URL, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) + + Открыть = 1; + Закрыть = 2; + Удалить = 3; + + Если Статус = Открыть Тогда + Метод = "/reopen" + Форум + "Topic"; + ИначеЕсли Статус = Закрыть Тогда + Метод = "/close" + Форум + "Topic"; + ИначеЕсли Статус = Удалить Тогда + Метод = "/deleteForumTopic"; + Иначе + ВызватьИсключение "Некорректный статус управления форумом"; + КонецЕсли; + + Возврат Метод; + +КонецФункции + +Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок) + + Строки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопки = Новый Массив; + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + Строки.Добавить(Кнопки); + КонецЦикла; + + Возврат Строки; + +КонецФункции + +Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок) + + Строки = Новый Массив; + Кнопки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + КонецЦикла; + + Строки.Добавить(Кнопки); + + Возврат Строки; + +КонецФункции + +Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа) + + Счетчик = 0; + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + + Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда + ВызватьИсключение("Не удалось получить информацию из json медиа!"); + Возврат; + КонецЕсли; + + Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл + + Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда + + Двоичные = ТекущийФайл.Ключ; + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные); + + ЭтотФайл = Новый Файл(ТекущийФайл.Ключ); + ИмяМедиа = ТекущийФайл.Значение + + Строка(Счетчик) + + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, ""); + + ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___"); + + Иначе + Двоичные = ТекущийФайл.Ключ; + ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик); + ПолноеИмяМедиа = ИмяМедиа; + КонецЕсли; + + СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные); + + СтруктураМедиа = Новый Структура; + СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение); + СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); + + Если Счетчик = 0 Тогда + СтруктураМедиа.Вставить("caption", Текст); + КонецЕсли; + + Медиа.Добавить(СтруктураМедиа); + + Счетчик = Счетчик + 1; + + КонецЦикла; + + Медиа = OPI_Инструменты.JSONСтрокой(Медиа); + +КонецПроцедуры + +Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры) + + IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); + МассивЧата = СтрРазделить(IDЧата, "*", Ложь); + + Если МассивЧата.Количество() > 1 Тогда + + IDЧата = МассивЧата[0]; + IDТемы = МассивЧата[1]; + + Параметры.Вставить("message_thread_id", IDТемы); + + КонецЕсли; + + Параметры.Вставить("chat_id", IDЧата); + +КонецПроцедуры + +Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение) + + Если Вид = "photo" Тогда + Метод = "/sendPhoto"; + ИначеЕсли Вид = "video" Тогда + Метод = "/sendVideo"; + ИначеЕсли Вид = "audio" Тогда + Метод = "/sendAudio"; + ИначеЕсли Вид = "document" Тогда + Метод = "/sendDocument"; + ИначеЕсли Вид = "animation" Тогда + Метод = "/sendAnimation"; + Расширение = ".gif"; + Иначе + ВызватьИсключение "Некорректный вид отправки"; + КонецЕсли; + +КонецПроцедуры + +Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид) + + Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда + + ТекущийФайл = Новый Файл(Файл); + Расширение = ?(Вид = "document", ТекущийФайл.Расширение, Расширение); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + КонецЕсли; + + Расширение = СтрЗаменить(Расширение, ".", "___"); + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Twitter.os b/src/ru/OInt/core/Modules/OPI_Twitter.os similarity index 98% rename from ru/OInt/core/Modules/OPI_Twitter.os rename to src/ru/OInt/core/Modules/OPI_Twitter.os index 0e52e5651e..21cd27e345 100644 --- a/ru/OInt/core/Modules/OPI_Twitter.os +++ b/src/ru/OInt/core/Modules/OPI_Twitter.os @@ -1,682 +1,682 @@ -// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os -// Библиотека: Twitter -// Команда CLI: twitter - -// 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:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off - -//@skip-check method-too-many-params - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область ДанныеИНастройка - -// Получить ссылку для авторизации -// Формирует ссылку для авторизации через браузер -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Строка - URL для перехода в браузере -Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - ПараметрыURL = Новый Структура; - - ПараметрыURL.Вставить("response_type" , "code"); - ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]); - ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]); - ПараметрыURL.Вставить("scope" , Параметры_["scope"]); - ПараметрыURL.Вставить("state" , "state"); - ПараметрыURL.Вставить("code_challenge" , "challenge"); - ПараметрыURL.Вставить("code_challenge_method", "plain"); - - ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); - Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL; - - Возврат Линк; - -КонецФункции - -// Получить токен -// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации -// -// Параметры: -// Код - Строка - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Код); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - ПараметрыЗапроса = Новый Структура; - ПараметрыЗапроса.Вставить("code" , Код); - ПараметрыЗапроса.Вставить("grant_type" , "authorization_code"); - ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); - ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]); - ПараметрыЗапроса.Вставить("code_verifier", "challenge"); - - Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" - , ПараметрыЗапроса, , Ложь); - - Возврат Ответ; - -КонецФункции - -// Обновить токен -// Обновляет v2 токен при помощи refresh_token -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция ОбновитьТокен(Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Refresh = "refresh_token"; - - ПараметрыЗапроса = Новый Структура; - ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]); - ПараметрыЗапроса.Вставить("grant_type" , Refresh); - ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); - - Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" - , ПараметрыЗапроса, , Ложь); - - Возврат Ответ; - -КонецФункции - -// !NOCLI -// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri -// Вызывает метод получения токена, так как для получения токена из кода, приходящего -// на redirect_uri после авторизации через браузер есть всего 30 секунд -// -// Параметры: -// Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис -// -// Возвращаемое значение: -// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера -Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт - - Код = Запрос.ПараметрыЗапроса["code"]; - ОтветТокен = ПолучитьТокен(Код); - - // BSLLS:CommentedCode-off - // Предпочтительное хранение токенов - // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]); - // Константы.TwitterToken.Установить(ОтветТокен["access_token"]); - // BSLLS:CommentedCode-on - - Возврат ОтветТокен; - -КонецФункции - -#КонецОбласти - -#Область Твиты - -// !NOCLI -// Создать произвольный твит -// -// Параметры: -// Текст - Строка - Текст твита -// МассивМедиа - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к файлам -// МассивВариантовОпроса - Массив из Строка - Массив вариантов опроса, если необходимо -// ДлительностьОпроса - Строка,Число - Длительность опроса, если необходимо (опрос без длительности не создается) -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьПроизвольныйТвит(Знач Текст = "" - , Знач МассивМедиа = "" - , Знач МассивВариантовОпроса = "" - , Знач ДлительностьОпроса = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса); - - Если ЗначениеЗаполнено(МассивМедиа) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа); - КонецЕсли; - - Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса); - КонецЕсли; - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - URL = "https://api.twitter.com/2/tweets"; - Массив = "Массив"; - Поля = Новый Соответствие; - - Если ЗначениеЗаполнено(Текст) Тогда - Поля.Вставить("text", Текст); - КонецЕсли; - - Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда - - ДлительностьОпроса = Число(ДлительностьОпроса); - - Если МассивВариантовОпроса.Количество() > 0 Тогда - - СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса); - Поля.Вставить("poll", СтруктураВарианта); - - КонецЕсли; - - КонецЕсли; - - Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда - Если МассивМедиа.Количество() > 0 Тогда - Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа)); - КонецЕсли; - КонецЕсли; - - Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_); - Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация); - - Возврат Ответ; - -КонецФункции - -// Создать текстовый твит -// Создает твит без вложений -// -// Параметры: -// Текст - Строка - Текст твита - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт - Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры); -КонецФункции - -// Создать твит картинки -// Создает твит с картинкой вложением -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт - - МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры); - Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); - -КонецФункции - -// Создать твит гифки -// Создает твит с вложением-гифкой -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт - - МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры); - Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); - -КонецФункции - -// Создать твит видео -// Создает твит с видеовложением -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт - - МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры); - Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); - -КонецФункции - -// Создать твит опрос -// Создает твит с опросом -// -// Параметры: -// Текст - Строка - Текст твита - text -// МассивВариантов - Массив из Строка - Массив вариантов опроса - options -// Длительность - Строка,Число - Длительность опроса - duration -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter -Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт - Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры); -КонецФункции - -// Загрузить массив вложений !NOCLI -// Загружает файлы на сервер и возвращает их ID -// -// Параметры: -// МассивФайлов - Массив из Строка, ДвоичныеДанные - Массив файлов -// ТипВложений - Строка - Тип вложений -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Массив Из Строка - Массив ID медиа -Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов); - - МассивМедиа = Новый Массив; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - MIS = "media_id_string"; - - Если ЗначениеЗаполнено(МассивФайлов) Тогда - - Для Каждого ФайлОтправки Из МассивФайлов Цикл - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки); - - Ответ = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_); - IDМедиа = Ответ[MIS]; - - Если Не ЗначениеЗаполнено(IDМедиа) Тогда - Возврат Ответ; - КонецЕсли; - - МассивМедиа.Добавить(IDМедиа); - - КонецЦикла; - - КонецЕсли; - - Возврат МассивМедиа; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - ВидЗапроса = "POST"; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - URL = "https://upload.twitter.com/1.1/media/upload.json"; - - Если Тип = "tweet_image" Тогда - - Поля = Новый Структура; - Поля.Вставить("media_data" , Base64Строка(Файл)); - Поля.Вставить("media_category", Тип); - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL); - Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - - Иначе - - Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_); - - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры) - - Единица = 1024; - Количество = 4; - MediaKey = "media_key"; - MIS = "media_id_string"; - Command = "command"; - Размер = Файл.Размер(); - - СоответствиеMIME = Новый Соответствие; - СоответствиеMIME.Вставить("tweet_image", "image/jpeg"); - СоответствиеMIME.Вставить("tweet_video", "video/mp4"); - СоответствиеMIME.Вставить("tweet_gif" , "image/gif"); - - РазмерЧасти = Количество * Единица * Единица; - МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти); - - Поля = Новый Структура; - Поля.Вставить(Command , "INIT"); - Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер)); - Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип)); - Поля.Вставить("media_category" , Тип); - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL); - - ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - KeyИнициализации = ОтветИнициализации[MediaKey]; - IDИнициализации = ОтветИнициализации[MIS]; - - Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда - Возврат ОтветИнициализации; - КонецЕсли; - - Счетчик = 0; - - Для Каждого Часть Из МассивЧтения Цикл - - Поля = Новый Структура; - Поля.Вставить(Command , "APPEND"); - Поля.Вставить("media_key" , KeyИнициализации); - Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик)); - Поля.Вставить("media" , Часть); - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL); - - OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация); - - Счетчик = Счетчик + 1; - - КонецЦикла; - - Поля = Новый Структура; - Поля.Вставить(Command , "FINALIZE"); - Поля.Вставить("media_id", IDИнициализации); - - СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL); - - Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда - Возврат СтатусОбработки; - КонецЕсли; - - Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры); - - Возврат Ответ; - -КонецФункции - -Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры) - - ProcessingInfo = "processing_info"; - Command = "command"; - Поля = Новый Структура; - - Поля.Вставить(Command , "STATUS"); - Поля.Вставить("media_id", IDИнициализации); - - Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл - - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL); - Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация); - Информация = Ответ[ProcessingInfo]; - - Если Не ЗначениеЗаполнено(Информация) Тогда - Возврат Ответ; - КонецЕсли; - - СтатусОбработки = Информация["state"]; - - Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда - Возврат Ответ; - КонецЕсли; - - КонецЦикла; - - Если СтатусОбработки = "failed" Тогда - ВызватьИсключение "Твиттер не смог обработать загруженное вами видео"; - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") - - // Здесь собрано определение данных, необходимых для работы. - // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API, - // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга. - // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то, - // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести - // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать - // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1, - // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные - - // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;) - - // P.S Далее часто упоминается "страница настроек Twitter Developer" - это - // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем) - - Параметры_ = Новый Соответствие; - Разрешения = "tweet.read tweet.write tweet.moderate.write users.read " - + "follows.read follows.write offline.access space.read mute.read " - + "mute.write like.read like.write list.read list.write block.read " - + "block.write bookmark.read bookmark.write"; - - // Данные для API v2 - - // redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации - // scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен - // client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer - // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer - // access_token - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code) - // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч) - // Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. - // При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить - // не получится (access_token тоже не получится) - - // |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов - // | |refresh_token --| - // |--------[через 2 ч.]-------------------| - - // Данные для API v1.1 - - // oauth_token - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer - // oauth_token_secret - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer - // oauth_consumer_key - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer - // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer - - // Эти токены обновлять не надо - - Параметры_.Вставить("redirect_uri" , ""); - Параметры_.Вставить("scope" , Разрешения); - Параметры_.Вставить("client_id" , ""); - Параметры_.Вставить("client_secret" , ""); - Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить() - Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить() - Параметры_.Вставить("oauth_token" , ""); - Параметры_.Вставить("oauth_token_secret" , ""); - Параметры_.Вставить("oauth_consumer_key" , ""); - Параметры_.Вставить("oauth_consumer_secret", ""); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); - - Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда - Для Каждого ПереданныйПараметр Из Параметры Цикл - Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); - КонецЦикла; - КонецЕсли; - - Возврат Параметры_; - -КонецФункции - -Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL) - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - ЗаголовокАвторизации = ""; - МетодХэширования = "HMAC-SHA1"; - ВерсияАпи = "1.0"; - СтрокаСигнатуры = ""; - Подпись = ""; - OCK = "oauth_consumer_key"; - OTK = "oauth_token"; - ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата); - ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX); - ТаблицаПараметров = Новый ТаблицаЗначений; - ТаблицаПараметров.Колонки.Добавить("Ключ"); - ТаблицаПараметров.Колонки.Добавить("Значение"); - - Для Каждого Поле Из Поля Цикл - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = Поле.Ключ; - НоваяСтрока.Значение = Поле.Значение; - - КонецЦикла; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = OCK; - НоваяСтрока.Значение = Параметры[OCK]; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = OTK; - НоваяСтрока.Значение = Параметры[OTK]; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_version"; - НоваяСтрока.Значение = ВерсияАпи; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_signature_method"; - НоваяСтрока.Значение = МетодХэширования; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_timestamp"; - НоваяСтрока.Значение = ТекущаяДатаUNIX; - - НоваяСтрока = ТаблицаПараметров.Добавить(); - НоваяСтрока.Ключ = "oauth_nonce"; - НоваяСтрока.Значение = ТекущаяДатаUNIX; - - Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл - - СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL); - СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL); - - КонецЦикла; - - ТаблицаПараметров.Сортировать("Ключ"); - - Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл - - СтрокаСигнатуры = СтрокаСигнатуры - + СтрокаТаблицы.Ключ - + "=" - + СтрокаТаблицы.Значение - + "&"; - - КонецЦикла; - - СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1); - СтрокаСигнатуры = вРег(ВидЗапроса) - + "&" - + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL) - + "&" - + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL); - - Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL) - + "&" - + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL); - - Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись) - , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры) - , ХешФункция.SHA1 - , 64); - - Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL); - - Разделитель = ""","; - ЗаголовокАвторизации = ЗаголовокАвторизации - + "OAuth " - + "oauth_consumer_key=""" + Параметры[OCK] + Разделитель - + "oauth_token=""" + Параметры[OTK] + Разделитель - + "oauth_signature_method=""" + МетодХэширования + Разделитель - + "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель - + "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель - + "oauth_version=""" + ВерсияАпи + Разделитель - + "oauth_signature=""" + Сигнатура; - - СоответствиеЗаголовка = Новый Соответствие; - СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации); - - Возврат СоответствиеЗаголовка; - -КонецФункции - -Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры) - - СоответствиеВозврата = Новый Соответствие; - СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]); - - Возврат СоответствиеВозврата; - -КонецФункции - -Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL) - - ProcessingInfo = "processing_info"; - Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL); - - Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); - Информация = Ответ[ProcessingInfo]; - - Если Не ЗначениеЗаполнено(Информация) Тогда - Возврат Ответ; - КонецЕсли; - - СтатусОбработки = Информация["state"]; - - Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда - Возврат Ответ; - Иначе - Возврат СтатусОбработки; - КонецЕсли; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os +// Библиотека: Twitter +// Команда CLI: twitter + +// 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:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +//@skip-check method-too-many-params + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область ДанныеИНастройка + +// Получить ссылку для авторизации +// Формирует ссылку для авторизации через браузер +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Строка - URL для перехода в браузере +Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + ПараметрыURL = Новый Структура; + + ПараметрыURL.Вставить("response_type" , "code"); + ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]); + ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]); + ПараметрыURL.Вставить("scope" , Параметры_["scope"]); + ПараметрыURL.Вставить("state" , "state"); + ПараметрыURL.Вставить("code_challenge" , "challenge"); + ПараметрыURL.Вставить("code_challenge_method", "plain"); + + ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); + Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL; + + Возврат Линк; + +КонецФункции + +// Получить токен +// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации +// +// Параметры: +// Код - Строка - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Код); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("code" , Код); + ПараметрыЗапроса.Вставить("grant_type" , "authorization_code"); + ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); + ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]); + ПараметрыЗапроса.Вставить("code_verifier", "challenge"); + + Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" + , ПараметрыЗапроса, , Ложь); + + Возврат Ответ; + +КонецФункции + +// Обновить токен +// Обновляет v2 токен при помощи refresh_token +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция ОбновитьТокен(Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Refresh = "refresh_token"; + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]); + ПараметрыЗапроса.Вставить("grant_type" , Refresh); + ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]); + + Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token" + , ПараметрыЗапроса, , Ложь); + + Возврат Ответ; + +КонецФункции + +// !NOCLI +// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri +// Вызывает метод получения токена, так как для получения токена из кода, приходящего +// на redirect_uri после авторизации через браузер есть всего 30 секунд +// +// Параметры: +// Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис +// +// Возвращаемое значение: +// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера +Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт + + Код = Запрос.ПараметрыЗапроса["code"]; + ОтветТокен = ПолучитьТокен(Код); + + // BSLLS:CommentedCode-off + // Предпочтительное хранение токенов + // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]); + // Константы.TwitterToken.Установить(ОтветТокен["access_token"]); + // BSLLS:CommentedCode-on + + Возврат ОтветТокен; + +КонецФункции + +#КонецОбласти + +#Область Твиты + +// !NOCLI +// Создать произвольный твит +// +// Параметры: +// Текст - Строка - Текст твита +// МассивМедиа - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к файлам +// МассивВариантовОпроса - Массив из Строка - Массив вариантов опроса, если необходимо +// ДлительностьОпроса - Строка,Число - Длительность опроса, если необходимо (опрос без длительности не создается) +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьПроизвольныйТвит(Знач Текст = "" + , Знач МассивМедиа = "" + , Знач МассивВариантовОпроса = "" + , Знач ДлительностьОпроса = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса); + + Если ЗначениеЗаполнено(МассивМедиа) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа); + КонецЕсли; + + Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса); + КонецЕсли; + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + URL = "https://api.twitter.com/2/tweets"; + Массив = "Массив"; + Поля = Новый Соответствие; + + Если ЗначениеЗаполнено(Текст) Тогда + Поля.Вставить("text", Текст); + КонецЕсли; + + Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда + + ДлительностьОпроса = Число(ДлительностьОпроса); + + Если МассивВариантовОпроса.Количество() > 0 Тогда + + СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса); + Поля.Вставить("poll", СтруктураВарианта); + + КонецЕсли; + + КонецЕсли; + + Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда + Если МассивМедиа.Количество() > 0 Тогда + Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа)); + КонецЕсли; + КонецЕсли; + + Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_); + Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация); + + Возврат Ответ; + +КонецФункции + +// Создать текстовый твит +// Создает твит без вложений +// +// Параметры: +// Текст - Строка - Текст твита - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт + Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры); +КонецФункции + +// Создать твит картинки +// Создает твит с картинкой вложением +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт + + МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры); + Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); + +КонецФункции + +// Создать твит гифки +// Создает твит с вложением-гифкой +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт + + МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры); + Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); + +КонецФункции + +// Создать твит видео +// Создает твит с видеовложением +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт + + МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры); + Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры); + +КонецФункции + +// Создать твит опрос +// Создает твит с опросом +// +// Параметры: +// Текст - Строка - Текст твита - text +// МассивВариантов - Массив из Строка - Массив вариантов опроса - options +// Длительность - Строка,Число - Длительность опроса - duration +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter +Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт + Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры); +КонецФункции + +// Загрузить массив вложений !NOCLI +// Загружает файлы на сервер и возвращает их ID +// +// Параметры: +// МассивФайлов - Массив из Строка, ДвоичныеДанные - Массив файлов +// ТипВложений - Строка - Тип вложений +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Массив Из Строка - Массив ID медиа +Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов); + + МассивМедиа = Новый Массив; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + MIS = "media_id_string"; + + Если ЗначениеЗаполнено(МассивФайлов) Тогда + + Для Каждого ФайлОтправки Из МассивФайлов Цикл + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки); + + Ответ = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_); + IDМедиа = Ответ[MIS]; + + Если Не ЗначениеЗаполнено(IDМедиа) Тогда + Возврат Ответ; + КонецЕсли; + + МассивМедиа.Добавить(IDМедиа); + + КонецЦикла; + + КонецЕсли; + + Возврат МассивМедиа; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) + + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + ВидЗапроса = "POST"; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + URL = "https://upload.twitter.com/1.1/media/upload.json"; + + Если Тип = "tweet_image" Тогда + + Поля = Новый Структура; + Поля.Вставить("media_data" , Base64Строка(Файл)); + Поля.Вставить("media_category", Тип); + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL); + Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); + + Иначе + + Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_); + + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры) + + Единица = 1024; + Количество = 4; + MediaKey = "media_key"; + MIS = "media_id_string"; + Command = "command"; + Размер = Файл.Размер(); + + СоответствиеMIME = Новый Соответствие; + СоответствиеMIME.Вставить("tweet_image", "image/jpeg"); + СоответствиеMIME.Вставить("tweet_video", "video/mp4"); + СоответствиеMIME.Вставить("tweet_gif" , "image/gif"); + + РазмерЧасти = Количество * Единица * Единица; + МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти); + + Поля = Новый Структура; + Поля.Вставить(Command , "INIT"); + Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер)); + Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип)); + Поля.Вставить("media_category" , Тип); + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL); + + ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); + KeyИнициализации = ОтветИнициализации[MediaKey]; + IDИнициализации = ОтветИнициализации[MIS]; + + Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда + Возврат ОтветИнициализации; + КонецЕсли; + + Счетчик = 0; + + Для Каждого Часть Из МассивЧтения Цикл + + Поля = Новый Структура; + Поля.Вставить(Command , "APPEND"); + Поля.Вставить("media_key" , KeyИнициализации); + Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик)); + Поля.Вставить("media" , Часть); + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL); + + OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация); + + Счетчик = Счетчик + 1; + + КонецЦикла; + + Поля = Новый Структура; + Поля.Вставить(Command , "FINALIZE"); + Поля.Вставить("media_id", IDИнициализации); + + СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL); + + Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда + Возврат СтатусОбработки; + КонецЕсли; + + Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры); + + Возврат Ответ; + +КонецФункции + +Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры) + + ProcessingInfo = "processing_info"; + Command = "command"; + Поля = Новый Структура; + + Поля.Вставить(Command , "STATUS"); + Поля.Вставить("media_id", IDИнициализации); + + Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл + + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL); + Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация); + Информация = Ответ[ProcessingInfo]; + + Если Не ЗначениеЗаполнено(Информация) Тогда + Возврат Ответ; + КонецЕсли; + + СтатусОбработки = Информация["state"]; + + Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда + Возврат Ответ; + КонецЕсли; + + КонецЦикла; + + Если СтатусОбработки = "failed" Тогда + ВызватьИсключение "Твиттер не смог обработать загруженное вами видео"; + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") + + // Здесь собрано определение данных, необходимых для работы. + // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API, + // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга. + // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то, + // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести + // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать + // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1, + // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные + + // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;) + + // P.S Далее часто упоминается "страница настроек Twitter Developer" - это + // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем) + + Параметры_ = Новый Соответствие; + Разрешения = "tweet.read tweet.write tweet.moderate.write users.read " + + "follows.read follows.write offline.access space.read mute.read " + + "mute.write like.read like.write list.read list.write block.read " + + "block.write bookmark.read bookmark.write"; + + // Данные для API v2 + + // redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации + // scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен + // client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer + // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer + // access_token - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code) + // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч) + // Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. + // При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить + // не получится (access_token тоже не получится) + + // |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов + // | |refresh_token --| + // |--------[через 2 ч.]-------------------| + + // Данные для API v1.1 + + // oauth_token - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer + // oauth_token_secret - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer + // oauth_consumer_key - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer + // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer + + // Эти токены обновлять не надо + + Параметры_.Вставить("redirect_uri" , ""); + Параметры_.Вставить("scope" , Разрешения); + Параметры_.Вставить("client_id" , ""); + Параметры_.Вставить("client_secret" , ""); + Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить() + Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить() + Параметры_.Вставить("oauth_token" , ""); + Параметры_.Вставить("oauth_token_secret" , ""); + Параметры_.Вставить("oauth_consumer_key" , ""); + Параметры_.Вставить("oauth_consumer_secret", ""); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); + + Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда + Для Каждого ПереданныйПараметр Из Параметры Цикл + Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); + КонецЦикла; + КонецЕсли; + + Возврат Параметры_; + +КонецФункции + +Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL) + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + ЗаголовокАвторизации = ""; + МетодХэширования = "HMAC-SHA1"; + ВерсияАпи = "1.0"; + СтрокаСигнатуры = ""; + Подпись = ""; + OCK = "oauth_consumer_key"; + OTK = "oauth_token"; + ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата); + ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX); + ТаблицаПараметров = Новый ТаблицаЗначений; + ТаблицаПараметров.Колонки.Добавить("Ключ"); + ТаблицаПараметров.Колонки.Добавить("Значение"); + + Для Каждого Поле Из Поля Цикл + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = Поле.Ключ; + НоваяСтрока.Значение = Поле.Значение; + + КонецЦикла; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = OCK; + НоваяСтрока.Значение = Параметры[OCK]; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = OTK; + НоваяСтрока.Значение = Параметры[OTK]; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_version"; + НоваяСтрока.Значение = ВерсияАпи; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_signature_method"; + НоваяСтрока.Значение = МетодХэширования; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_timestamp"; + НоваяСтрока.Значение = ТекущаяДатаUNIX; + + НоваяСтрока = ТаблицаПараметров.Добавить(); + НоваяСтрока.Ключ = "oauth_nonce"; + НоваяСтрока.Значение = ТекущаяДатаUNIX; + + Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл + + СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL); + СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL); + + КонецЦикла; + + ТаблицаПараметров.Сортировать("Ключ"); + + Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл + + СтрокаСигнатуры = СтрокаСигнатуры + + СтрокаТаблицы.Ключ + + "=" + + СтрокаТаблицы.Значение + + "&"; + + КонецЦикла; + + СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1); + СтрокаСигнатуры = вРег(ВидЗапроса) + + "&" + + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL) + + "&" + + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL); + + Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL) + + "&" + + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL); + + Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись) + , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры) + , ХешФункция.SHA1 + , 64); + + Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL); + + Разделитель = ""","; + ЗаголовокАвторизации = ЗаголовокАвторизации + + "OAuth " + + "oauth_consumer_key=""" + Параметры[OCK] + Разделитель + + "oauth_token=""" + Параметры[OTK] + Разделитель + + "oauth_signature_method=""" + МетодХэширования + Разделитель + + "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель + + "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель + + "oauth_version=""" + ВерсияАпи + Разделитель + + "oauth_signature=""" + Сигнатура; + + СоответствиеЗаголовка = Новый Соответствие; + СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации); + + Возврат СоответствиеЗаголовка; + +КонецФункции + +Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры) + + СоответствиеВозврата = Новый Соответствие; + СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]); + + Возврат СоответствиеВозврата; + +КонецФункции + +Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL) + + ProcessingInfo = "processing_info"; + Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL); + + Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь); + Информация = Ответ[ProcessingInfo]; + + Если Не ЗначениеЗаполнено(Информация) Тогда + Возврат Ответ; + КонецЕсли; + + СтатусОбработки = Информация["state"]; + + Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда + Возврат Ответ; + Иначе + Возврат СтатусОбработки; + КонецЕсли; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_VK.os b/src/ru/OInt/core/Modules/OPI_VK.os similarity index 98% rename from ru/OInt/core/Modules/OPI_VK.os rename to src/ru/OInt/core/Modules/OPI_VK.os index deab0f9880..067ed51ce6 100644 --- a/ru/OInt/core/Modules/OPI_VK.os +++ b/src/ru/OInt/core/Modules/OPI_VK.os @@ -1,2190 +1,2190 @@ -// Расположение OS: ./OInt/core/Modules/OPI_VK.os -// Библиотека: VK -// Команда CLI: vk - -// 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:NumberOfOptionalParams-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off -// BSLLS:UnusedLocalVariable-off - -//@skip-check method-too-many-params -//@skip-check wrong-string-literal-content - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область ПолучениеТокена - -// Создать ссылку получения токена -// Получение ссылки для интерактивного получения токена (access_token), который необходим -// для дальнейших действий -// -// Параметры: -// app_id - Строка,Число - app_id из настроек приложения - app -// -// Возвращаемое значение: -// Строка - URL, по которому необходимо перейти в браузере -Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id); - - // access_token нужно будет забрать из параметра в строке адреса браузера - Возврат "https://oauth.vk.com/authorize?client_id=" + App_id - + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video" - + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html"; - -КонецФункции - -#КонецОбласти - -#Область РаботаСГруппой - -// Создать пост -// Создает пост с картинками -// -// Параметры: -// Текст - Строка - Текст поста - text -// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив картинок - pictures -// Реклама - Булево - Признак ""Это реклама"" - ad -// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьПост(Знач Текст - , Знач МассивКартинок - , Знач Реклама = Ложь - , Знач СсылкаПодЗаписью = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивВложений = Новый Массив; - - Для Каждого КартинкаПоста Из МассивКартинок Цикл - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост"); - - OwnerId = ОтветСоответствие.Получить("owner_id"); - ObjectId = ОтветСоответствие.Получить("id"); - - Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда - Возврат ОтветСоответствие; - КонецЕсли; - - OwnerId = OPI_Инструменты.ЧислоВСтроку(OwnerId); - ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId); - - ФотоID = "photo" + OwnerId + "_" + ObjectId; - - МассивВложений.Добавить(ФотоID); - - КонецЦикла; - - Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры); - - Возврат Ответ; - -КонецФункции - -// Создать составной пост -// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.) -// -// Параметры: -// Текст - Строка - Текст поста - text -// Объекты - Массив из Строка - Массив идентификаторов вида photo123_123 - objects -// Реклама - Булево - Признак ""Это реклама"" - ad -// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьСоставнойПост(Знач Текст - , Знач Объекты - , Знач Реклама = Ложь - , Знач СсылкаПодЗаписью = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью); - OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама); - - Параметры = ПолучитьСтандартныеПараметры(Параметры); - СтрокаВложений = СтрСоединить(Объекты, ","); - СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью; - - Параметры.Вставить("message" , Текст); - Параметры.Вставить("attachments" , СтрокаВложений); - Параметры.Вставить("mark_as_ads" , ?(Реклама, 1, 0)); - Параметры.Вставить("close_comments" , ?(Реклама, 1, 0)); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры); - - Возврат Ответ; - -КонецФункции - -// Удалить пост -// Удаляет пост по id -// -// Параметры: -// IDПоста - Строка,Число - ID поста - post -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("post_id", IDПоста); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать опрос -// Создает опрос с вариантами ответа -// -// Параметры: -// Вопрос - Строка - Вопрос опроса - question -// МассивОтветов - Массив из Строка - Массив вариантов ответа - options -// Картинка - Строка,ДвоичныеДанные - Картинка опроса - picture -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Response = "response"; - - Если ЗначениеЗаполнено(Картинка) Тогда - - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос"); - - Фото = Ответ.Получить(Response); - - Если ЗначениеЗаполнено(Фото) Тогда - - IDФото = Фото["id"]; - - Если Не ЗначениеЗаполнено(IDФото) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - КонецЕсли; - - Параметры_.Вставить("is_anonymous", 1); - Параметры_.Вставить("is_multiple" , 0); - - Ответы = СтрСоединить(МассивОтветов, ""","""); - Ответы = "[""" + Ответы + """]"; - - Параметры_.Вставить("add_answers", Ответы); - Параметры_.Вставить("photo_id" , OPI_Инструменты.ЧислоВСтроку(IDФото)); - Параметры_.Вставить("question" , Вопрос); - - Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_); - ОпросСоответствие = Опрос.Получить(Response); - - Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда - Возврат Опрос; - КонецЕсли; - - OwnerId = ОпросСоответствие.Получить("owner_id"); - ObjectId = ОпросСоответствие.Получить("id"); - - Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда - Возврат Опрос; - КонецЕсли; - - ОпросID = "poll" - + OPI_Инструменты.ЧислоВСтроку(OwnerId) - + "_" - + OPI_Инструменты.ЧислоВСтроку(ObjectId); - - Параметры_.Вставить("attachments", ОпросID); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать альбом -// Создает альбом для хранения картинок -// -// Параметры: -// Наименование - Строка - Наименование альбома - title -// Описание - Строка - Описание альбома - description -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("title" , Наименование); - Параметры_.Вставить("description" , Описание); - Параметры_.Вставить("upload_by_admins_only", 1); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить альбом -// Удаляет ранее созданный альбом -// -// Параметры: -// IDАльбома - Строка,Число - ID альбома - album -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома)); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать историю -// Создает историю из картинки -// -// Параметры: -// Картинка - Строка,ДвоичныеДанные - Фон истории - picture -// URL - Строка - URL для кнопки под историей - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("link_text" , "more"); - Параметры_.Вставить("link_url" , URL); - Параметры_.Вставить("add_to_news", "1"); - - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История"); - Возврат Ответ; - -КонецФункции - -// Сохранить картинку в альбом -// Сохраняет картинку в альбом сообщества -// -// Параметры: -// IDАльбома - Строка,Число - ID альбома - album -// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture -// Описание - Строка - Описание картинки - description -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("album_id", IDАльбома); - Параметры_.Вставить("caption" , Описание); - - Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом"); - -КонецФункции - -// Удалить картинку -// Удалить картинку из альбома -// -// Параметры: -// IDКартинки - Строка,Число - ID картинки - pictureid -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("photo_id", IDКартинки); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Загрузить видео на сервер -// Загружает видео в группу с возможностью его дальнейшего использования -// -// Параметры: -// Видео - Строка, ДвоичныеДанные - Файл видео - file -// Наименование - Строка - Наименование видео - title -// Описание - Строка - Описание видео - description -// Альбом - Строка - ID альбома, если необходимо - album -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ЗагрузитьВидеоНаСервер(Знач Видео - , Знач Наименование - , Знач Описание = "" - , Знач Альбом = "" - , Знач Параметры = "") Экспорт - - Строка_ = "Строка"; - Параметры = ПолучитьСтандартныеПараметры(Параметры); - - OPI_Инструменты.ДобавитьПоле("name" , Наименование, Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("description", Описание , Строка_, Параметры); - OPI_Инструменты.ДобавитьПоле("album_id" , Альбом , Строка_, Параметры); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры); - - Результат = Ответ["response"]; - - Если Не ЗначениеЗаполнено(Результат) Тогда - Возврат Ответ; - КонецЕсли; - - URL = Результат["upload_url"]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - СоответствиеФайлов = Новый Соответствие; - OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов); - - РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер(); - РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных); - - Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4"); - - Возврат Ответ; - -КонецФункции - -// Загрузить фото на сервер -// Загружает фото на сервер для его дальнейшего использования -// -// Параметры: -// Картинка - Строка, ДвоичныеДанные - Файл картинки - file -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// Вид - Строка - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт - - Параметры = ПолучитьСтандартныеПараметры(Параметры); - Метод = ОпределитьМетодЗагрузкиИзображений(Вид); - Файлы = Новый Соответствие; - - Response = "response"; - URL = "api.vk.com/method/"; - Загрузка = URL + Метод["Загрузка"]; - Сохранение = URL + Метод["Сохранение"]; - - Если ТипЗнч(Картинка) = Тип("Строка") Тогда - КлючКартинка = СтрЗаменить(Картинка, ".", "___"); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); - Иначе - КлючКартинка = "image___jpeg"; - КонецЕсли; - - Файлы.Вставить(КлючКартинка, Картинка); - - Для Н = 1 По 5 Цикл - - Ответ = OPI_Инструменты.Get(Загрузка, Параметры); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - URL = Результат["upload_url"]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - Параметры.Вставить("upload_url", URL); - Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы); - - Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда - Прервать; - КонецЕсли; - - КонецЦикла; - - Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда - Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ); - КонецЕсли; - - ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры); - - Ответ = OPI_Инструменты.Get(Сохранение, Параметры); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСОбсуждениями - -// Создать обсуждение -// Создает новое обсуждение -// -// Параметры: -// Наименование - Строка - Наименование обсуждения - title -// ТекстПервогоСообщения - Строка - Текст первого сообщения - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("title", Наименование); - Параметры_.Вставить("text" , ТекстПервогоСообщения); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Закрыть обсуждение -// Закрывает или удаляет обсуждение -// -// Параметры: -// IDОбсуждения - Строка,Число - ID обсуждения - topic -// УдалитьПолностью - Булево - Удалить полностью (Истина) или закрыть - remove -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); - OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("topic_id", IDОбсуждения); - - Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic"); - Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_); - - Возврат Ответ; - -КонецФункции - -// Открыть обсуждение -// Открывает ранее закрытое обсуждение -// -// Параметры: -// IDОбсуждения - Строка,Число - ID обсуждения - topic -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("topic_id", IDОбсуждения); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Написать в обсуждение -// Добавляет сообщение в обсуждение от имени группы -// -// Параметры: -// IDОбсуждения - Строка,Число - ID обсуждения - topic -// Текст - Строка - Текст сообщения - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("topic_id", IDОбсуждения); - Параметры_.Вставить("message" , Текст); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область ИнтерактивныеДействия - -// Поставить лайк -// Ставит лайк на пост -// -// Параметры: -// IDПоста - Строка,Число - ID поста - post -// IDСтены - Строка,Число - ID стены расположения поста - wall -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]); - ОбъектВК = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста); - - Параметры_.Вставить("type" , "post"); - Параметры_.Вставить("object" , ОбъектВК); - Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста)); - Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены)); - Параметры_.Вставить("from_group" , 0); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Сделать репост -// Делает репост записи -// -// Параметры: -// IDПоста - Строка,Число - ID поста - post -// IDСтены - Строка,Число - ID стены расположения поста - from -// ЦелеваяСтена - Строка,Число - ID целевой стены или группы - to -// Рекламный - Булево - Признак рекламного поста - ad -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СделатьРепост(Знач IDПоста - , Знач IDСтены = "" - , Знач ЦелеваяСтена = "" - , Знач Рекламный = Ложь - , Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - GroupId = Параметры_["group_id"]; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена); - OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный); - - Источник = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId); - Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId); - - Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста)); - Параметры_.Вставить("group_id" , СтрЗаменить(Приемник, "-", "")); - Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0)); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Написать сообщение -// Написать сообщение пользователю в диалоге сообщества -// -// Параметры: -// Текст - Строка - Текст сообщения - text -// IDПользователя - Строка - ID пользователя адресата - user -// Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках - ct -// Клавиатура - Строка - JSON клавиатуры. См.СформироватьКлавиатуру - keyboard -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция НаписатьСообщение(Знач Текст - , Знач IDПользователя - , Знач Communitytoken - , Знач Клавиатура = "" - , Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("access_token", Communitytoken); - - Параметры_.Вставить("user_id" , IDПользователя); - Параметры_.Вставить("peer_id" , IDПользователя); - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("random_id" , 0); - Параметры_.Вставить("message" , Текст); - - Если ЗначениеЗаполнено(Клавиатура) Тогда - Параметры_.Вставить("keyboard", Клавиатура); - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Написать комментарий -// Создает комментарий под выбранной записью -// -// Параметры: -// IDПоста - Строка,Число - ID целевого поста - post -// IDСтены - Строка,Число - ID стены расположения поста - wall -// Текст - Строка - Текст комментария - text -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - GroupId = Параметры_["group_id"]; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); - - Параметры_.Вставить("owner_id" , IDСтены); - Параметры_.Вставить("from_group" , GroupId); - Параметры_.Вставить("post_id" , IDПоста); - Параметры_.Вставить("message" , Текст); - - Параметры_.Удалить("group_id"); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Сократить ссылку -// Создает сокращенный URL из обычного -// -// Параметры: -// URL - Строка - URL для сокращения - url -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Строка - Сокращенный URL -Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - - Response = "response"; - Параметры_ = Новый Структура; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("url", URL); - - Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - URL = Результат["short_url"]; - - Если ЗначениеЗаполнено(URL) Тогда - Возврат URL; - Иначе - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - -КонецФункции - -#КонецОбласти - -#Область Статистика - -// Получить статистику -// Получает общую статистику сообщества за период -// -// Параметры: -// ДатаНачала - Дата - Дата начала периода - datefrom -// ДатаОкончания - Дата - Дата окончания периода - dateto -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала); - OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - ДатаНачала = OPI_Инструменты.UNIXTime(ДатаНачала); - ДатаОкончания = OPI_Инструменты.UNIXTime(ДатаОкончания); - - Параметры_.Вставить("timestamp_from", ДатаНачала); - Параметры_.Вставить("timestamp_to" , ДатаОкончания); - Параметры_.Вставить("stats_groups" , "visitors, reach, activity"); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Получить статистику по постам -// Получает статистику в разрезе постов -// -// Параметры: -// МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Массив из Произвольный - Массив данных статистики по постам -Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивОтветов = Новый Массив; - МассивНабора = Новый Массив; - МаксимумПостов = 30; - Response = "response"; - - Для Каждого Пост Из МассивИДПостов Цикл - - МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост)); - - Если МассивНабора.Количество() = МаксимумПостов Тогда - - СтрокаНомеров = СтрСоединить(МассивНабора, ","); - Параметры_.Вставить("post_ids", СтрокаНомеров); - - Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); - МассивСтатистики = Статистика[Response]; - - Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл - МассивОтветов.Добавить(ЭлементСтатистики); - КонецЦикла; - - МассивНабора = Новый Массив; - - КонецЕсли; - - КонецЦикла; - - СтрокаНомеров = СтрСоединить(МассивНабора, ","); - Параметры_.Вставить("post_ids", СтрокаНомеров); - - Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); - МассивСтатистики = Статистика[Response]; - - Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда - Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл - МассивОтветов.Добавить(ЭлементСтатистики); - КонецЦикла; - КонецЕсли; - - Возврат МассивОтветов; - -КонецФункции - -#КонецОбласти - -#Область РаботаСРекламнымКабинетом - -// Создать рекламную кампанию -// Создает кампанию в выбранном рекламном кабинете -// -// Параметры: -// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet -// Наименование - Строка - Наименование кампании - title -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("account_id", IDКабинета); - - МассивСтруктур = Новый Массив; - ДатаСтарт = OPI_Инструменты.UNIXTime(ТекущаяДата); - ДатаСтоп = OPI_Инструменты.UNIXTime(КонечнаяДата); - - СтруктураКампании = Новый Структура; - СтруктураКампании.Вставить("type" , "promoted_posts"); - СтруктураКампании.Вставить("name" , Наименование); - СтруктураКампании.Вставить("day_limit" , 0); - СтруктураКампании.Вставить("all_limit" , 0); - СтруктураКампании.Вставить("start_time" , ДатаСтарт); - СтруктураКампании.Вставить("stop_time" , ДатаСтоп); - СтруктураКампании.Вставить("status" , 1); - - МассивСтруктур.Добавить(СтруктураКампании); - - JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур); - - Параметры_.Вставить("data", JSONДата); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать рекламное объявление -// Создает рекламное объявление на основе поста -// -// Параметры: -// НомерКампании - Строка,Число - ID рекламной кампании - campaign -// ДневнойЛимит - Строка,Число - Дневной лимит в рублях - limit -// НомерКатегории - Строка,Число - Номер рекламной категории - category -// IDПоста - Строка,Число - ID поста, используемого в качетсве рекламы - post -// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьРекламноеОбъявление(Знач НомерКампании - , Знач ДневнойЛимит - , Знач НомерКатегории - , Знач IDПоста - , Знач IDКабинета - , Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - GroupId = Параметры_["group_id"]; - - OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит); - OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); - - Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста; - - МассивСтруктур = Новый Массив; - СтруктураКампании = Новый Структура; - СтруктураКампании.Вставить("campaign_id" , НомерКампании); - СтруктураКампании.Вставить("ad_format" , 9); - СтруктураКампании.Вставить("conversion_event_id" , 1); - СтруктураКампании.Вставить("autobidding" , 1); - СтруктураКампании.Вставить("cost_type" , 3); - СтруктураКампании.Вставить("goal_type" , 2); - СтруктураКампании.Вставить("ad_platform" , "all"); - СтруктураКампании.Вставить("publisher_platforms" , "vk"); - СтруктураКампании.Вставить("publisher_platforms_auto" , "1"); - СтруктураКампании.Вставить("day_limit" , ДневнойЛимит); - СтруктураКампании.Вставить("all_limit" , "0"); - СтруктураКампании.Вставить("category1_id" , НомерКатегории); - СтруктураКампании.Вставить("age_restriction" , 0); - СтруктураКампании.Вставить("status" , 1); - СтруктураКампании.Вставить("name" , "Объявление"); - СтруктураКампании.Вставить("link_url" , Линк); - - МассивСтруктур.Добавить(СтруктураКампании); - - OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); - - Параметры_.Вставить("data" , МассивСтруктур); - Параметры_.Вставить("account_id" , IDКабинета); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Приостановить рекламное объявление -// Приостанавливает показ рекламного объявления -// -// Параметры: -// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet -// IDОбъявления - Строка,Число - ID объявления - adv -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); - OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("account_id", IDКабинета); - - МассивСтруктур = Новый Массив; - СтруктураКампании = Новый Структура; - - СтруктураКампании.Вставить("ad_id" , IDОбъявления); - СтруктураКампании.Вставить("status" , 0); - - МассивСтруктур.Добавить(СтруктураКампании); - - OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); - - Параметры_.Вставить("data", МассивСтруктур); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Получить список рекламных категорий -// Получает список id рекламных категорий для создания рекламного объявления -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСТоварами - -// Получить список категорий товаров -// Получает список ID товарных категорий для указания при создании товара -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из Строка - Ключ - ID, Значение - Имя -Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт - - Response = "response"; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - Количество = Результат["count"]; - - Если Не ЗначениеЗаполнено(Количество) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - Параметры_.Вставить("count", Количество); - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - Категории = Результат["items"]; - - Если Не ЗначениеЗаполнено(Категории) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - СоответствиеКатегорий = Новый Соответствие; - - Для Каждого Категория Из Категории Цикл - СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]); - КонецЦикла; - - Возврат СоответствиеКатегорий; - -КонецФункции - -// Получить список товаров -// Получает список товаров сообщества -// -// Параметры: -// Подборка - Строка,Число - ID подборки, если нужен отбор - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий товаров -Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("count" , 200); - Параметры_.Вставить("extended" , 1); - Параметры_.Вставить("with_disabled", 1); - - Если ЗначениеЗаполнено(Подборка) Тогда - Параметры_.Вставить("album_id", Подборка); - КонецЕсли; - - МассивТоваров = Новый Массив; - ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_); - - Возврат МассивТоваров; - -КонецФункции - -// Получить товары по ID -// Получает информацию о товарах по массиву ID -// -// Параметры: -// Товары - Строка, Массив Из Строка - Массив ID товаров - items -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - СтрокаТоваров = ""; - Owner = "owner_id"; - - Для Каждого Товар Из Товары Цикл - ТекущийТовар = Параметры_[Owner] + "_" + Товар; - ТекущийТовар = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар); - СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ","; - КонецЦикла; - - СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1); - Параметры_.Вставить("item_ids", СтрокаТоваров); - Параметры_.Вставить("extended", 1); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Добавить товар -// Добавляет новый товар в каталог сообщества -// -// Параметры: -// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь -// Подборка - Строка - ID подборка для помещения товара, если необходимо - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт - Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры); -КонецФункции - -// Изменить товар -// Изменяет ранее созданный товар -// -// Параметры: -// Товар - Число,Строка - Идентификатор изменяемого товара - item -// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь -// Подборка - Строка - Идентификатор новой подборки, если необходимо - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт - Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры); -КонецФункции - -// Удалить товар -// Удаляет ранее созданный товар -// -// Параметры: -// Товар - Строка,Число - ID товара - item -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("item_id", Товар); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Сгруппировать товары -// Группирует товары на основе одинаковых наборов свойств -// -// Параметры: -// МассивТоваров - Массив Из Строка - Массив ID товаров - items -// СуществующаяГруппа - Строка - ID существующей группы, если необходимо - sellgroup -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивТоваров_ = Новый Массив; - - Для Каждого Товар Из МассивТоваров Цикл - МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); - КонецЦикла; - - Товары = СтрСоединить(МассивТоваров_, ","); - - Параметры_.Вставить("item_ids", Товары); - - Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда - Параметры_.Вставить("item_group_id", СуществующаяГруппа); - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Получить описание товара. !NOCLI -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Пустое описание товара: -// *Имя - Строка - Имя товара -// *Описание - Строка - Описание товара -// *Категория - Строка - См. ПолучитьСписокКатегорийТоваров -// *Цена - Число - Цена товара -// *СтараяЦена - Число - Для отображения скидки/изменения цены -// *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото -// *URL - Строка - Ссылка на страницу сайта магазина -// *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото -// *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара -// *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе -// *Ширина - Число - Ширина товара в мм. -// *Высота - Число - Высота товара в мм. -// *Глубина - Число - Глубина товара в мм. -// *Вес - Число - Вес в гр. -// *SKU - Строка - SKU -// *ДоступныйОстаток - Число - Остаток. -1 - не ограничено -Функция ПолучитьОписаниеТовара() Экспорт - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Новый товар"); // Имя товара - Товар.Вставить("Описание" , "Описание товара"); // Описание товара - Товар.Вставить("Категория" , "20173"); // См ПолучитьСписокКатегорийТоваров() - Товар.Вставить("Цена" , 1); // Цена. - Товар.Вставить("СтараяЦена" , Неопределено); // Для отражения изменения цены - Товар.Вставить("ОсновноеФото" , Неопределено); // ДД или путь к осн. фото - Товар.Вставить("URL" , Неопределено); // Ссылка на страницу магазина - Товар.Вставить("ДополнительныеФото" , Новый Массив); // Массив путей или ДД для доп. фото - Товар.Вставить("ЗначенияСвойств" , Новый Массив); // Значения свойств (варианты). Максимум 2 - Товар.Вставить("ГлавныйВГруппе" , Ложь); // Сделать главным в своей группе - Товар.Вставить("Ширина" , Неопределено); // В миллиметрах - Товар.Вставить("Высота" , Неопределено); // В миллиметрах - Товар.Вставить("Глубина" , Неопределено); // В миллиметрах - Товар.Вставить("Вес" , Неопределено); // В граммах - Товар.Вставить("SKU" , Неопределено); // Артикул - Товар.Вставить("ДоступныйОстаток" , 1); - - Возврат Товар; - -КонецФункции - -#КонецОбласти - -#Область РаботаСПодборкамиТоваров - -// Получить список подборок -// Получает список подборок товаров -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - Массив соответствий подборок -Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("count", 100); - - МассивАльбомов = Новый Массив; - ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_); - - Возврат МассивАльбомов; - -КонецФункции - -// Получить подборки по ID -// Получить список подборок по массиву ID -// -// Параметры: -// Подборки - Строка, Массив Из Строка - ID подборок - sels -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Подборки_ = Новый Массив; - СтрокаПодборок = ""; - - Для Каждого Подборка Из Подборки Цикл - Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка)); - КонецЦикла; - - СтрокаПодборок = СтрСоединить(Подборки_, ","); - - Параметры_.Вставить("album_ids", СтрокаПодборок); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Создать подборку товаров -// Создает пустую подборку товаров -// -// Параметры: -// Название - Строка - Название подборки - title -// Картинка - Строка,ДвоичныеДанные - Файл картинки - picture -// Основная - Булево - Основная - main -// Скрытая - Булево - Скрытая - hidden -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьПодборкуТоваров(Знач Название - , Знач Картинка - , Знач Основная = Ложь - , Знач Скрытая = Ложь - , Знач Параметры = "") Экспорт - - Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры); - -КонецФункции - -// Изменить подборку товаров -// Изменяет свойства подборки товаров -// -// Параметры: -// Название - Строка - Новое название подборки - title -// Подборка - Строка - ID подборки - sel -// Картинка - Строка,ДвоичныеДанные - Новая картинка подборки - picture -// Основная - Булево - Основная - main -// Скрытая - Булево - Скрытая - hidden -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьПодборкуТоваров(Знач Название - , Знач Подборка - , Знач Картинка = "" - , Знач Основная = Ложь - , Знач Скрытая = Ложь - , Знач Параметры = "") Экспорт - - Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры); - -КонецФункции - -// Добавить товар в подборку -// Добавляет товар в подборку -// -// Параметры: -// МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items -// Подборка - Строка - ID подборки - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - МассивТоваров_ = Новый Массив; - - Для Каждого Товар Из МассивТоваров Цикл - МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); - КонецЦикла; - - СписокТоваров = СтрСоединить(МассивТоваров_, ","); - - Параметры_.Вставить("item_ids" , СписокТоваров); - Параметры_.Вставить("album_ids", Подборка); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить товар из подборки -// Удаляет ранее добавленный товар из подборки -// -// Параметры: -// Товар - Строка - ID товара - item -// Подборка - Строка - ID подборки - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Параметры_.Вставить("item_id" , Товар); - Параметры_.Вставить("album_ids", Подборка); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить подборку -// Удаляет подборку по ID -// -// Параметры: -// Подборка - Строка - ID подборки - sel -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("album_id", Подборка); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСоСвойствамиТоваров - -// Получить список свойств -// Получает список свойств товаров группы -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт - - Response = "response"; - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_); - Свойства = Ответ[Response]["items"]; - - Возврат Свойства; - -КонецФункции - -// Создать свойство товара -// Создает новое свойство для использования в товарах -// -// Параметры: -// Название - Строка - Название свойства - title -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("title", Название); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Изменить свойство товара -// Изменяет существующее свойство товара -// -// Параметры: -// Название - Строка - Новое название - title -// Свойство - Строка,Число - ID свойства - prop -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("title" , Название); - Параметры_.Вставить("property_id", Свойство); - Параметры_.Вставить("type" , "text"); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить свойство товара -// Удаляет существующее свойство товара -// -// Параметры: -// Свойство - Строка,Число - ID свойства - prop -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("property_id", Свойство); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Добавить вариант свойства товара -// Добавляет вариант для существующего свойства -// -// Параметры: -// Значение - Строка - Значение свойства - value -// Свойство - Строка,Число - ID свойства, куда добавляется вариант - prop -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("property_id", Свойство); - Параметры_.Вставить("title" , Значение); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Изменить вариант свойства товара -// Изменяет значение варианта существующего свойства товара -// -// Параметры: -// Значение - Строка - Новое значение свойства - value -// Свойство - Строка,Число - ID свойства - prop -// Вариант - Строка,Число - ID варианта - option -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("property_id", Свойство); - Параметры_.Вставить("variant_id" , Вариант); - Параметры_.Вставить("title" , Значение); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_); - - Возврат Ответ; - -КонецФункции - -// Удалить вариант свойства товара -// Удаляет ранее созданный вариант свойства -// -// Параметры: -// Вариант - Строка,Число - ID варианта - option -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("variant_id", Вариант); - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область РаботаСЗаказами - -// Получить список заказов -// Возвращает список заказов сообщества -// -// Параметры: -// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK -Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт - - Параметры = ПолучитьСтандартныеПараметры(Параметры); - Параметры.Вставить("count", 50); - - МассивЗаказов = Новый Массив; - ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры); - - Возврат МассивЗаказов; - -КонецФункции - -#КонецОбласти - -#Область Прочие - -// Сформировать клавиатуру -// Формирует клавиатуру по массиву кнопок -// -// Параметры: -// МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons -// -// Возвращаемое значение: -// Строка - JSON клавиатуры -Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); - - Клавиатура = Новый Структура; - МассивКлавиатуры = Новый Массив; - МассивБлока = Новый Массив; - - Для Каждого Действие Из МассивКнопок Цикл - - Кнопка = Новый Структура; - Выражение = Новый Структура; - - Выражение.Вставить("type" , "text"); - Выражение.Вставить("label", Действие); - - Кнопка.Вставить("action", Выражение); - МассивБлока.Добавить(Кнопка); - - КонецЦикла; - - МассивКлавиатуры.Добавить(МассивБлока); - - Клавиатура.Вставить("buttons" , МассивКлавиатуры); - Клавиатура.Вставить("one_time", Ложь); - - Возврат OPI_Инструменты.JSONСтрокой(Клавиатура); - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") - - // Здесь собрано определение данных для работы с VK API - // Вы можете переопределять их, передавая в качестве параметра - // Совпадающие поля будут перезаписаны с приоритетом параметра функции - - Параметры_ = Новый Структура; - - // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена() - // from_group - действия будут выполняться от лица группы - // owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был - // установлен свой - // app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков - // group_id - owner_id, но без "-" - - Параметры_.Вставить("access_token" , ""); - Параметры_.Вставить("from_group" , "1"); - Параметры_.Вставить("owner_id" , ""); - Параметры_.Вставить("v" , "5.131"); - Параметры_.Вставить("app_id" , ""); - Параметры_.Вставить("group_id" , ""); - - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); - - Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда - Для Каждого ПереданныйПараметр Из Параметры Цикл - Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); - КонецЦикла; - КонецЕсли; - - Возврат Параметры_; - -КонецФункции - -Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид) - - Response = "response"; - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - ИДФото = Результат["photo_id"]; - - Если Не ЗначениеЗаполнено(ИДФото) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); - Возврат ИДФото; - -КонецФункции - -Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид) - - Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); - ОтветМассив = Ответ.Получить("response"); - - Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда - Возврат Ответ; - Иначе - Если ОтветМассив.Количество() = 0 Тогда - Возврат Ответ; - Иначе - ОтветСоответствие = ОтветМассив[0]; - КонецЕсли; - КонецЕсли; - - Возврат ОтветСоответствие; - -КонецФункции - -Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "") - - Response = "response"; - Подборки = ПолучитьПодборкиПоИД(Подборки, Параметры); - Результат = Подборки[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - - МассивПодборок = Результат["items"]; - - Если Не ЗначениеЗаполнено(МассивПодборок) Тогда - Возврат Подборки; - КонецЕсли; - - Иначе - Возврат Подборки; - КонецЕсли; - - Возврат МассивПодборок; - -КонецФункции - -Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид) - - СоответствиеМетодов = Новый Соответствие; - Загрузка = "Загрузка"; - Сохранение = "Сохранение"; - Способ = "Способ"; - Фото = "Фото"; - - Если Вид = "Пост" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "photos.getWallUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto"); - СоответствиеМетодов.Вставить(Фото , "photo"); - СоответствиеМетодов.Вставить(Способ , 1); - - ИначеЕсли Вид = "Товар" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "market.getProductPhotoUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto"); - СоответствиеМетодов.Вставить(Способ , 2); - - ИначеЕсли Вид = "История" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "stories.getPhotoUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "stories.save"); - СоответствиеМетодов.Вставить(Способ , 3); - - ИначеЕсли Вид = "Опрос" Тогда - - СоответствиеМетодов.Вставить(Загрузка , "polls.getPhotoUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto"); - СоответствиеМетодов.Вставить(Фото , "photo"); - СоответствиеМетодов.Вставить(Способ , 1); - - Иначе - - СоответствиеМетодов.Вставить(Загрузка , "photos.getUploadServer"); - СоответствиеМетодов.Вставить(Сохранение, "photos.save"); - СоответствиеМетодов.Вставить(Фото , "photos_list"); - СоответствиеМетодов.Вставить(Способ , 1); - - КонецЕсли; - - Возврат СоответствиеМетодов; - -КонецФункции - -Функция ПолучитьСоответствиеПараметровТовара() - - Поля = Новый Соответствие(); - Поля.Вставить("Имя" , "name"); - Поля.Вставить("Описание" , "description"); - Поля.Вставить("Категория" , "category_id"); - Поля.Вставить("Цена" , "price"); - Поля.Вставить("СтараяЦена" , "old_price"); - Поля.Вставить("URL" , "url"); - Поля.Вставить("ГлавныйВГруппе" , "is_main_variant"); - Поля.Вставить("Ширина" , "dimension_width"); - Поля.Вставить("Высота" , "dimension_height"); - Поля.Вставить("Глубина" , "dimension_length"); - Поля.Вставить("Вес" , "weight"); - Поля.Вставить("SKU" , "sku"); - Поля.Вставить("ДоступныйОстаток" , "stock_amount"); - - Возврат Поля; - -КонецФункции - -Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Параметры_.Вставить("v", "5.199"); - - Response = "response"; - - ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_); - - Если ЗначениеЗаполнено(ИДТовара) Тогда - Параметры_.Вставить("item_id", ИДТовара); - Метод = "edit"; - Иначе - Метод = "add"; - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); - Результат = Ответ[Response]; - - Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда - - ИДТовара = Результат["market_item_id"]; - - Если Не ЗначениеЗаполнено(ИДТовара) Тогда - Возврат Ответ; - КонецЕсли; - - Иначе - Возврат Ответ; - КонецЕсли; - - Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда - ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция УправлениеПодборкой(Знач Название - , Знач Картинка = "" - , Знач ИДПодборки = "" - , Знач Основная = Ложь - , Знач Скрытая = Ложь - , Знач Параметры = "") - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки); - OPI_ПреобразованиеТипов.ПолучитьБулево(Основная); - OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая); - - Параметры_ = ПолучитьСтандартныеПараметры(Параметры); - Ответ = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_); - - Если ЗначениеЗаполнено(Ответ) Тогда - Возврат Ответ; - КонецЕсли; - - Параметры_.Вставить("title" , Название); - Параметры_.Вставить("main_album" , ?(Основная, 1, 0)); - Параметры_.Вставить("is_hidden" , ?(Скрытая, 1, 0)); - - Если ЗначениеЗаполнено(ИДПодборки) Тогда - Параметры_.Вставить("album_id", ИДПодборки); - Метод = "editAlbum"; - Иначе - Метод = "addAlbum"; - КонецЕсли; - - Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); - - Возврат Ответ; - -КонецФункции - -Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры) - - PhotoID = "photo_id"; - - Если ЗначениеЗаполнено(Картинка) Тогда - - ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар"); - - Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда - Возврат ИДФото; - КонецЕсли; - - Параметры.Вставить(PhotoID, ИДФото); - - Иначе - - Если ЗначениеЗаполнено(ИДПодборки) Тогда - - Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры); - - Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда - Возврат Подборки; - КонецЕсли; - - Если Не Подборки.Количество() = 0 Тогда - ИДФото = Подборки[0]["photo"]["id"]; - OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото); - Параметры.Вставить(PhotoID, ИДФото); - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - Возврат ""; - -КонецФункции - -Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры) - - Response = "response"; - Способ = Метод["Способ"]; - СтандартныйСпособ = 1; - НовыйСпособ = 2; - - Если Способ = СтандартныйСпособ Тогда - - Hash = "hash"; - Serv = "server"; - Aid = "aid"; - Фото = Метод["Фото"]; - - Параметры.Вставить(Hash, Ответ[Hash]); - Параметры.Вставить(Фото, Ответ[Фото]); - - СерверФото = Ответ.Получить(Serv); - - Если ЗначениеЗаполнено(СерверФото) Тогда - СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото); - Параметры.Вставить(Serv, СерверФото); - КонецЕсли; - - Идентификатор = Ответ.Получить(Aid); - - Если ЗначениеЗаполнено(Идентификатор) Тогда - Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор); - Параметры.Вставить(Aid , Идентификатор); - КонецЕсли; - - ИначеЕсли Способ = НовыйСпособ Тогда - - ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ); - Параметры.Вставить("upload_response", ОтветСтрокой); - - Иначе - - Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]); - - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры) - - Response = "response"; - ОсновноеФото = ОписаниеТовара["ОсновноеФото"]; - ДопФото = ОписаниеТовара["ДополнительныеФото"]; - Свойства = ОписаниеТовара["ЗначенияСвойств"]; - - Если ЗначениеЗаполнено(ОсновноеФото) Тогда - - Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар"); - Результат = Ответ[Response]; - - Если ЗначениеЗаполнено(Результат) Тогда - ИДФото = Результат["photo_id"]; - - Если Не ЗначениеЗаполнено(ИДФото) Тогда - Возврат; - КонецЕсли; - - Иначе - Возврат; - КонецЕсли; - - ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); - Параметры.Вставить("main_photo_id", ИДФото); - - КонецЕсли; - - Если ТипЗнч(Свойства) = Тип("Массив") Тогда - - Свойства_ = Новый Массив; - - Для Каждого Свойство Из Свойства Цикл - Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство)); - КонецЦикла; - - Свойства = СтрСоединить(Свойства_, ","); - - КонецЕсли; - - Если ЗначениеЗаполнено(Свойства) Тогда - Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства)); - КонецЕсли; - - ДобавитьДополнительныеФотоТовара(ДопФото, Параметры); - - Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл - - Значение = ОписаниеТовара[Поле.Ключ]; - - Если Значение <> Неопределено Тогда - Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры) - - Если ТипЗнч(МассивФото) = Тип("Массив") Тогда - Если МассивФото.Количество() > 0 Тогда - - СтрокаФотографий = ""; - - Для Каждого Фото Из МассивФото Цикл - - ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар"); - - Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда - Возврат; - КонецЕсли; - - СтрокаФотографий = СтрокаФотографий + ИДФото + ","; - - КонецЦикла; - - СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1); - Параметры.Вставить("photo_ids", СтрокаФотографий); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0) - - Response = "response"; - МаксимумВЗапросе = 200; - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры); - Товары = Ответ[Response]["items"]; - - Если Товары.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого Товар Из Товары Цикл - МассивТоваров.Добавить(Товар); - КонецЦикла; - - Сдвиг = Сдвиг + МаксимумВЗапросе; - Параметры.Вставить("offset", Сдвиг); - ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг); - -КонецПроцедуры - -Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0) - - Response = "response"; - МаксимумВЗапросе = 100; - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры); - Альбомы = Ответ[Response]["items"]; - - Если Альбомы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого Альбом Из Альбомы Цикл - МассивАльбомов.Добавить(Альбом); - КонецЦикла; - - Сдвиг = Сдвиг + МаксимумВЗапросе; - Параметры.Вставить("offset", Сдвиг); - ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг); - -КонецПроцедуры - -Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0) - - Response = "response"; - МаксимумВЗапросе = 50; - Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры); - Заказы = Ответ[Response]["items"]; - - Если Заказы.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого Заказ Из Заказы Цикл - МассивЗаказов.Добавить(Заказ); - КонецЦикла; - - Сдвиг = Сдвиг + МаксимумВЗапросе; - Параметры.Вставить("offset", Сдвиг); - ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг); - -КонецПроцедуры - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_VK.os +// Библиотека: VK +// Команда CLI: vk + +// 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:NumberOfOptionalParams-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off +// BSLLS:UnusedLocalVariable-off + +//@skip-check method-too-many-params +//@skip-check wrong-string-literal-content + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область ПолучениеТокена + +// Создать ссылку получения токена +// Получение ссылки для интерактивного получения токена (access_token), который необходим +// для дальнейших действий +// +// Параметры: +// app_id - Строка,Число - app_id из настроек приложения - app +// +// Возвращаемое значение: +// Строка - URL, по которому необходимо перейти в браузере +Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id); + + // access_token нужно будет забрать из параметра в строке адреса браузера + Возврат "https://oauth.vk.com/authorize?client_id=" + App_id + + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video" + + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html"; + +КонецФункции + +#КонецОбласти + +#Область РаботаСГруппой + +// Создать пост +// Создает пост с картинками +// +// Параметры: +// Текст - Строка - Текст поста - text +// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив картинок - pictures +// Реклама - Булево - Признак ""Это реклама"" - ad +// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьПост(Знач Текст + , Знач МассивКартинок + , Знач Реклама = Ложь + , Знач СсылкаПодЗаписью = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивВложений = Новый Массив; + + Для Каждого КартинкаПоста Из МассивКартинок Цикл + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост"); + + OwnerId = ОтветСоответствие.Получить("owner_id"); + ObjectId = ОтветСоответствие.Получить("id"); + + Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда + Возврат ОтветСоответствие; + КонецЕсли; + + OwnerId = OPI_Инструменты.ЧислоВСтроку(OwnerId); + ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId); + + ФотоID = "photo" + OwnerId + "_" + ObjectId; + + МассивВложений.Добавить(ФотоID); + + КонецЦикла; + + Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры); + + Возврат Ответ; + +КонецФункции + +// Создать составной пост +// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.) +// +// Параметры: +// Текст - Строка - Текст поста - text +// Объекты - Массив из Строка - Массив идентификаторов вида photo123_123 - objects +// Реклама - Булево - Признак ""Это реклама"" - ad +// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьСоставнойПост(Знач Текст + , Знач Объекты + , Знач Реклама = Ложь + , Знач СсылкаПодЗаписью = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью); + OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама); + + Параметры = ПолучитьСтандартныеПараметры(Параметры); + СтрокаВложений = СтрСоединить(Объекты, ","); + СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью; + + Параметры.Вставить("message" , Текст); + Параметры.Вставить("attachments" , СтрокаВложений); + Параметры.Вставить("mark_as_ads" , ?(Реклама, 1, 0)); + Параметры.Вставить("close_comments" , ?(Реклама, 1, 0)); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры); + + Возврат Ответ; + +КонецФункции + +// Удалить пост +// Удаляет пост по id +// +// Параметры: +// IDПоста - Строка,Число - ID поста - post +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("post_id", IDПоста); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать опрос +// Создает опрос с вариантами ответа +// +// Параметры: +// Вопрос - Строка - Вопрос опроса - question +// МассивОтветов - Массив из Строка - Массив вариантов ответа - options +// Картинка - Строка,ДвоичныеДанные - Картинка опроса - picture +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Response = "response"; + + Если ЗначениеЗаполнено(Картинка) Тогда + + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос"); + + Фото = Ответ.Получить(Response); + + Если ЗначениеЗаполнено(Фото) Тогда + + IDФото = Фото["id"]; + + Если Не ЗначениеЗаполнено(IDФото) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + КонецЕсли; + + Параметры_.Вставить("is_anonymous", 1); + Параметры_.Вставить("is_multiple" , 0); + + Ответы = СтрСоединить(МассивОтветов, ""","""); + Ответы = "[""" + Ответы + """]"; + + Параметры_.Вставить("add_answers", Ответы); + Параметры_.Вставить("photo_id" , OPI_Инструменты.ЧислоВСтроку(IDФото)); + Параметры_.Вставить("question" , Вопрос); + + Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_); + ОпросСоответствие = Опрос.Получить(Response); + + Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда + Возврат Опрос; + КонецЕсли; + + OwnerId = ОпросСоответствие.Получить("owner_id"); + ObjectId = ОпросСоответствие.Получить("id"); + + Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда + Возврат Опрос; + КонецЕсли; + + ОпросID = "poll" + + OPI_Инструменты.ЧислоВСтроку(OwnerId) + + "_" + + OPI_Инструменты.ЧислоВСтроку(ObjectId); + + Параметры_.Вставить("attachments", ОпросID); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать альбом +// Создает альбом для хранения картинок +// +// Параметры: +// Наименование - Строка - Наименование альбома - title +// Описание - Строка - Описание альбома - description +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("title" , Наименование); + Параметры_.Вставить("description" , Описание); + Параметры_.Вставить("upload_by_admins_only", 1); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить альбом +// Удаляет ранее созданный альбом +// +// Параметры: +// IDАльбома - Строка,Число - ID альбома - album +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома)); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать историю +// Создает историю из картинки +// +// Параметры: +// Картинка - Строка,ДвоичныеДанные - Фон истории - picture +// URL - Строка - URL для кнопки под историей - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("link_text" , "more"); + Параметры_.Вставить("link_url" , URL); + Параметры_.Вставить("add_to_news", "1"); + + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История"); + Возврат Ответ; + +КонецФункции + +// Сохранить картинку в альбом +// Сохраняет картинку в альбом сообщества +// +// Параметры: +// IDАльбома - Строка,Число - ID альбома - album +// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture +// Описание - Строка - Описание картинки - description +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("album_id", IDАльбома); + Параметры_.Вставить("caption" , Описание); + + Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом"); + +КонецФункции + +// Удалить картинку +// Удалить картинку из альбома +// +// Параметры: +// IDКартинки - Строка,Число - ID картинки - pictureid +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("photo_id", IDКартинки); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Загрузить видео на сервер +// Загружает видео в группу с возможностью его дальнейшего использования +// +// Параметры: +// Видео - Строка, ДвоичныеДанные - Файл видео - file +// Наименование - Строка - Наименование видео - title +// Описание - Строка - Описание видео - description +// Альбом - Строка - ID альбома, если необходимо - album +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ЗагрузитьВидеоНаСервер(Знач Видео + , Знач Наименование + , Знач Описание = "" + , Знач Альбом = "" + , Знач Параметры = "") Экспорт + + Строка_ = "Строка"; + Параметры = ПолучитьСтандартныеПараметры(Параметры); + + OPI_Инструменты.ДобавитьПоле("name" , Наименование, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("album_id" , Альбом , Строка_, Параметры); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры); + + Результат = Ответ["response"]; + + Если Не ЗначениеЗаполнено(Результат) Тогда + Возврат Ответ; + КонецЕсли; + + URL = Результат["upload_url"]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + СоответствиеФайлов = Новый Соответствие; + OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов); + + РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер(); + РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных); + + Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4"); + + Возврат Ответ; + +КонецФункции + +// Загрузить фото на сервер +// Загружает фото на сервер для его дальнейшего использования +// +// Параметры: +// Картинка - Строка, ДвоичныеДанные - Файл картинки - file +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// Вид - Строка - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт + + Параметры = ПолучитьСтандартныеПараметры(Параметры); + Метод = ОпределитьМетодЗагрузкиИзображений(Вид); + Файлы = Новый Соответствие; + + Response = "response"; + URL = "api.vk.com/method/"; + Загрузка = URL + Метод["Загрузка"]; + Сохранение = URL + Метод["Сохранение"]; + + Если ТипЗнч(Картинка) = Тип("Строка") Тогда + КлючКартинка = СтрЗаменить(Картинка, ".", "___"); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); + Иначе + КлючКартинка = "image___jpeg"; + КонецЕсли; + + Файлы.Вставить(КлючКартинка, Картинка); + + Для Н = 1 По 5 Цикл + + Ответ = OPI_Инструменты.Get(Загрузка, Параметры); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + URL = Результат["upload_url"]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + Параметры.Вставить("upload_url", URL); + Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы); + + Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда + Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ); + КонецЕсли; + + ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры); + + Ответ = OPI_Инструменты.Get(Сохранение, Параметры); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСОбсуждениями + +// Создать обсуждение +// Создает новое обсуждение +// +// Параметры: +// Наименование - Строка - Наименование обсуждения - title +// ТекстПервогоСообщения - Строка - Текст первого сообщения - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("title", Наименование); + Параметры_.Вставить("text" , ТекстПервогоСообщения); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Закрыть обсуждение +// Закрывает или удаляет обсуждение +// +// Параметры: +// IDОбсуждения - Строка,Число - ID обсуждения - topic +// УдалитьПолностью - Булево - Удалить полностью (Истина) или закрыть - remove +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); + OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("topic_id", IDОбсуждения); + + Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic"); + Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_); + + Возврат Ответ; + +КонецФункции + +// Открыть обсуждение +// Открывает ранее закрытое обсуждение +// +// Параметры: +// IDОбсуждения - Строка,Число - ID обсуждения - topic +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("topic_id", IDОбсуждения); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Написать в обсуждение +// Добавляет сообщение в обсуждение от имени группы +// +// Параметры: +// IDОбсуждения - Строка,Число - ID обсуждения - topic +// Текст - Строка - Текст сообщения - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("topic_id", IDОбсуждения); + Параметры_.Вставить("message" , Текст); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область ИнтерактивныеДействия + +// Поставить лайк +// Ставит лайк на пост +// +// Параметры: +// IDПоста - Строка,Число - ID поста - post +// IDСтены - Строка,Число - ID стены расположения поста - wall +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]); + ОбъектВК = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста); + + Параметры_.Вставить("type" , "post"); + Параметры_.Вставить("object" , ОбъектВК); + Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста)); + Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены)); + Параметры_.Вставить("from_group" , 0); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Сделать репост +// Делает репост записи +// +// Параметры: +// IDПоста - Строка,Число - ID поста - post +// IDСтены - Строка,Число - ID стены расположения поста - from +// ЦелеваяСтена - Строка,Число - ID целевой стены или группы - to +// Рекламный - Булево - Признак рекламного поста - ad +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СделатьРепост(Знач IDПоста + , Знач IDСтены = "" + , Знач ЦелеваяСтена = "" + , Знач Рекламный = Ложь + , Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + GroupId = Параметры_["group_id"]; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена); + OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный); + + Источник = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId); + Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId); + + Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста)); + Параметры_.Вставить("group_id" , СтрЗаменить(Приемник, "-", "")); + Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0)); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Написать сообщение +// Написать сообщение пользователю в диалоге сообщества +// +// Параметры: +// Текст - Строка - Текст сообщения - text +// IDПользователя - Строка - ID пользователя адресата - user +// Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках - ct +// Клавиатура - Строка - JSON клавиатуры. См.СформироватьКлавиатуру - keyboard +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция НаписатьСообщение(Знач Текст + , Знач IDПользователя + , Знач Communitytoken + , Знач Клавиатура = "" + , Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("access_token", Communitytoken); + + Параметры_.Вставить("user_id" , IDПользователя); + Параметры_.Вставить("peer_id" , IDПользователя); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("random_id" , 0); + Параметры_.Вставить("message" , Текст); + + Если ЗначениеЗаполнено(Клавиатура) Тогда + Параметры_.Вставить("keyboard", Клавиатура); + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Написать комментарий +// Создает комментарий под выбранной записью +// +// Параметры: +// IDПоста - Строка,Число - ID целевого поста - post +// IDСтены - Строка,Число - ID стены расположения поста - wall +// Текст - Строка - Текст комментария - text +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + GroupId = Параметры_["group_id"]; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); + + Параметры_.Вставить("owner_id" , IDСтены); + Параметры_.Вставить("from_group" , GroupId); + Параметры_.Вставить("post_id" , IDПоста); + Параметры_.Вставить("message" , Текст); + + Параметры_.Удалить("group_id"); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Сократить ссылку +// Создает сокращенный URL из обычного +// +// Параметры: +// URL - Строка - URL для сокращения - url +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Строка - Сокращенный URL +Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + + Response = "response"; + Параметры_ = Новый Структура; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("url", URL); + + Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + URL = Результат["short_url"]; + + Если ЗначениеЗаполнено(URL) Тогда + Возврат URL; + Иначе + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область Статистика + +// Получить статистику +// Получает общую статистику сообщества за период +// +// Параметры: +// ДатаНачала - Дата - Дата начала периода - datefrom +// ДатаОкончания - Дата - Дата окончания периода - dateto +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала); + OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + ДатаНачала = OPI_Инструменты.UNIXTime(ДатаНачала); + ДатаОкончания = OPI_Инструменты.UNIXTime(ДатаОкончания); + + Параметры_.Вставить("timestamp_from", ДатаНачала); + Параметры_.Вставить("timestamp_to" , ДатаОкончания); + Параметры_.Вставить("stats_groups" , "visitors, reach, activity"); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Получить статистику по постам +// Получает статистику в разрезе постов +// +// Параметры: +// МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Массив из Произвольный - Массив данных статистики по постам +Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивОтветов = Новый Массив; + МассивНабора = Новый Массив; + МаксимумПостов = 30; + Response = "response"; + + Для Каждого Пост Из МассивИДПостов Цикл + + МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост)); + + Если МассивНабора.Количество() = МаксимумПостов Тогда + + СтрокаНомеров = СтрСоединить(МассивНабора, ","); + Параметры_.Вставить("post_ids", СтрокаНомеров); + + Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); + МассивСтатистики = Статистика[Response]; + + Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл + МассивОтветов.Добавить(ЭлементСтатистики); + КонецЦикла; + + МассивНабора = Новый Массив; + + КонецЕсли; + + КонецЦикла; + + СтрокаНомеров = СтрСоединить(МассивНабора, ","); + Параметры_.Вставить("post_ids", СтрокаНомеров); + + Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_); + МассивСтатистики = Статистика[Response]; + + Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда + Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл + МассивОтветов.Добавить(ЭлементСтатистики); + КонецЦикла; + КонецЕсли; + + Возврат МассивОтветов; + +КонецФункции + +#КонецОбласти + +#Область РаботаСРекламнымКабинетом + +// Создать рекламную кампанию +// Создает кампанию в выбранном рекламном кабинете +// +// Параметры: +// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet +// Наименование - Строка - Наименование кампании - title +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("account_id", IDКабинета); + + МассивСтруктур = Новый Массив; + ДатаСтарт = OPI_Инструменты.UNIXTime(ТекущаяДата); + ДатаСтоп = OPI_Инструменты.UNIXTime(КонечнаяДата); + + СтруктураКампании = Новый Структура; + СтруктураКампании.Вставить("type" , "promoted_posts"); + СтруктураКампании.Вставить("name" , Наименование); + СтруктураКампании.Вставить("day_limit" , 0); + СтруктураКампании.Вставить("all_limit" , 0); + СтруктураКампании.Вставить("start_time" , ДатаСтарт); + СтруктураКампании.Вставить("stop_time" , ДатаСтоп); + СтруктураКампании.Вставить("status" , 1); + + МассивСтруктур.Добавить(СтруктураКампании); + + JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур); + + Параметры_.Вставить("data", JSONДата); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать рекламное объявление +// Создает рекламное объявление на основе поста +// +// Параметры: +// НомерКампании - Строка,Число - ID рекламной кампании - campaign +// ДневнойЛимит - Строка,Число - Дневной лимит в рублях - limit +// НомерКатегории - Строка,Число - Номер рекламной категории - category +// IDПоста - Строка,Число - ID поста, используемого в качетсве рекламы - post +// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьРекламноеОбъявление(Знач НомерКампании + , Знач ДневнойЛимит + , Знач НомерКатегории + , Знач IDПоста + , Знач IDКабинета + , Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + GroupId = Параметры_["group_id"]; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит); + OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); + + Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста; + + МассивСтруктур = Новый Массив; + СтруктураКампании = Новый Структура; + СтруктураКампании.Вставить("campaign_id" , НомерКампании); + СтруктураКампании.Вставить("ad_format" , 9); + СтруктураКампании.Вставить("conversion_event_id" , 1); + СтруктураКампании.Вставить("autobidding" , 1); + СтруктураКампании.Вставить("cost_type" , 3); + СтруктураКампании.Вставить("goal_type" , 2); + СтруктураКампании.Вставить("ad_platform" , "all"); + СтруктураКампании.Вставить("publisher_platforms" , "vk"); + СтруктураКампании.Вставить("publisher_platforms_auto" , "1"); + СтруктураКампании.Вставить("day_limit" , ДневнойЛимит); + СтруктураКампании.Вставить("all_limit" , "0"); + СтруктураКампании.Вставить("category1_id" , НомерКатегории); + СтруктураКампании.Вставить("age_restriction" , 0); + СтруктураКампании.Вставить("status" , 1); + СтруктураКампании.Вставить("name" , "Объявление"); + СтруктураКампании.Вставить("link_url" , Линк); + + МассивСтруктур.Добавить(СтруктураКампании); + + OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); + + Параметры_.Вставить("data" , МассивСтруктур); + Параметры_.Вставить("account_id" , IDКабинета); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Приостановить рекламное объявление +// Приостанавливает показ рекламного объявления +// +// Параметры: +// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet +// IDОбъявления - Строка,Число - ID объявления - adv +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета); + OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("account_id", IDКабинета); + + МассивСтруктур = Новый Массив; + СтруктураКампании = Новый Структура; + + СтруктураКампании.Вставить("ad_id" , IDОбъявления); + СтруктураКампании.Вставить("status" , 0); + + МассивСтруктур.Добавить(СтруктураКампании); + + OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина); + + Параметры_.Вставить("data", МассивСтруктур); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Получить список рекламных категорий +// Получает список id рекламных категорий для создания рекламного объявления +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТоварами + +// Получить список категорий товаров +// Получает список ID товарных категорий для указания при создании товара +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из Строка - Ключ - ID, Значение - Имя +Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт + + Response = "response"; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + Количество = Результат["count"]; + + Если Не ЗначениеЗаполнено(Количество) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + Параметры_.Вставить("count", Количество); + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + Категории = Результат["items"]; + + Если Не ЗначениеЗаполнено(Категории) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + СоответствиеКатегорий = Новый Соответствие; + + Для Каждого Категория Из Категории Цикл + СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]); + КонецЦикла; + + Возврат СоответствиеКатегорий; + +КонецФункции + +// Получить список товаров +// Получает список товаров сообщества +// +// Параметры: +// Подборка - Строка,Число - ID подборки, если нужен отбор - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий товаров +Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("count" , 200); + Параметры_.Вставить("extended" , 1); + Параметры_.Вставить("with_disabled", 1); + + Если ЗначениеЗаполнено(Подборка) Тогда + Параметры_.Вставить("album_id", Подборка); + КонецЕсли; + + МассивТоваров = Новый Массив; + ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_); + + Возврат МассивТоваров; + +КонецФункции + +// Получить товары по ID +// Получает информацию о товарах по массиву ID +// +// Параметры: +// Товары - Строка, Массив Из Строка - Массив ID товаров - items +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + СтрокаТоваров = ""; + Owner = "owner_id"; + + Для Каждого Товар Из Товары Цикл + ТекущийТовар = Параметры_[Owner] + "_" + Товар; + ТекущийТовар = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар); + СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ","; + КонецЦикла; + + СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1); + Параметры_.Вставить("item_ids", СтрокаТоваров); + Параметры_.Вставить("extended", 1); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Добавить товар +// Добавляет новый товар в каталог сообщества +// +// Параметры: +// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь +// Подборка - Строка - ID подборка для помещения товара, если необходимо - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт + Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры); +КонецФункции + +// Изменить товар +// Изменяет ранее созданный товар +// +// Параметры: +// Товар - Число,Строка - Идентификатор изменяемого товара - item +// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь +// Подборка - Строка - Идентификатор новой подборки, если необходимо - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт + Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры); +КонецФункции + +// Удалить товар +// Удаляет ранее созданный товар +// +// Параметры: +// Товар - Строка,Число - ID товара - item +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("item_id", Товар); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Сгруппировать товары +// Группирует товары на основе одинаковых наборов свойств +// +// Параметры: +// МассивТоваров - Массив Из Строка - Массив ID товаров - items +// СуществующаяГруппа - Строка - ID существующей группы, если необходимо - sellgroup +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивТоваров_ = Новый Массив; + + Для Каждого Товар Из МассивТоваров Цикл + МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); + КонецЦикла; + + Товары = СтрСоединить(МассивТоваров_, ","); + + Параметры_.Вставить("item_ids", Товары); + + Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда + Параметры_.Вставить("item_group_id", СуществующаяГруппа); + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Получить описание товара. !NOCLI +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Пустое описание товара: +// *Имя - Строка - Имя товара +// *Описание - Строка - Описание товара +// *Категория - Строка - См. ПолучитьСписокКатегорийТоваров +// *Цена - Число - Цена товара +// *СтараяЦена - Число - Для отображения скидки/изменения цены +// *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото +// *URL - Строка - Ссылка на страницу сайта магазина +// *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото +// *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара +// *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе +// *Ширина - Число - Ширина товара в мм. +// *Высота - Число - Высота товара в мм. +// *Глубина - Число - Глубина товара в мм. +// *Вес - Число - Вес в гр. +// *SKU - Строка - SKU +// *ДоступныйОстаток - Число - Остаток. -1 - не ограничено +Функция ПолучитьОписаниеТовара() Экспорт + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Новый товар"); // Имя товара + Товар.Вставить("Описание" , "Описание товара"); // Описание товара + Товар.Вставить("Категория" , "20173"); // См ПолучитьСписокКатегорийТоваров() + Товар.Вставить("Цена" , 1); // Цена. + Товар.Вставить("СтараяЦена" , Неопределено); // Для отражения изменения цены + Товар.Вставить("ОсновноеФото" , Неопределено); // ДД или путь к осн. фото + Товар.Вставить("URL" , Неопределено); // Ссылка на страницу магазина + Товар.Вставить("ДополнительныеФото" , Новый Массив); // Массив путей или ДД для доп. фото + Товар.Вставить("ЗначенияСвойств" , Новый Массив); // Значения свойств (варианты). Максимум 2 + Товар.Вставить("ГлавныйВГруппе" , Ложь); // Сделать главным в своей группе + Товар.Вставить("Ширина" , Неопределено); // В миллиметрах + Товар.Вставить("Высота" , Неопределено); // В миллиметрах + Товар.Вставить("Глубина" , Неопределено); // В миллиметрах + Товар.Вставить("Вес" , Неопределено); // В граммах + Товар.Вставить("SKU" , Неопределено); // Артикул + Товар.Вставить("ДоступныйОстаток" , 1); + + Возврат Товар; + +КонецФункции + +#КонецОбласти + +#Область РаботаСПодборкамиТоваров + +// Получить список подборок +// Получает список подборок товаров +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Массив соответствий подборок +Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("count", 100); + + МассивАльбомов = Новый Массив; + ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_); + + Возврат МассивАльбомов; + +КонецФункции + +// Получить подборки по ID +// Получить список подборок по массиву ID +// +// Параметры: +// Подборки - Строка, Массив Из Строка - ID подборок - sels +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Подборки_ = Новый Массив; + СтрокаПодборок = ""; + + Для Каждого Подборка Из Подборки Цикл + Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка)); + КонецЦикла; + + СтрокаПодборок = СтрСоединить(Подборки_, ","); + + Параметры_.Вставить("album_ids", СтрокаПодборок); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Создать подборку товаров +// Создает пустую подборку товаров +// +// Параметры: +// Название - Строка - Название подборки - title +// Картинка - Строка,ДвоичныеДанные - Файл картинки - picture +// Основная - Булево - Основная - main +// Скрытая - Булево - Скрытая - hidden +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьПодборкуТоваров(Знач Название + , Знач Картинка + , Знач Основная = Ложь + , Знач Скрытая = Ложь + , Знач Параметры = "") Экспорт + + Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры); + +КонецФункции + +// Изменить подборку товаров +// Изменяет свойства подборки товаров +// +// Параметры: +// Название - Строка - Новое название подборки - title +// Подборка - Строка - ID подборки - sel +// Картинка - Строка,ДвоичныеДанные - Новая картинка подборки - picture +// Основная - Булево - Основная - main +// Скрытая - Булево - Скрытая - hidden +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьПодборкуТоваров(Знач Название + , Знач Подборка + , Знач Картинка = "" + , Знач Основная = Ложь + , Знач Скрытая = Ложь + , Знач Параметры = "") Экспорт + + Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры); + +КонецФункции + +// Добавить товар в подборку +// Добавляет товар в подборку +// +// Параметры: +// МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items +// Подборка - Строка - ID подборки - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + МассивТоваров_ = Новый Массив; + + Для Каждого Товар Из МассивТоваров Цикл + МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар)); + КонецЦикла; + + СписокТоваров = СтрСоединить(МассивТоваров_, ","); + + Параметры_.Вставить("item_ids" , СписокТоваров); + Параметры_.Вставить("album_ids", Подборка); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить товар из подборки +// Удаляет ранее добавленный товар из подборки +// +// Параметры: +// Товар - Строка - ID товара - item +// Подборка - Строка - ID подборки - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Параметры_.Вставить("item_id" , Товар); + Параметры_.Вставить("album_ids", Подборка); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить подборку +// Удаляет подборку по ID +// +// Параметры: +// Подборка - Строка - ID подборки - sel +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("album_id", Подборка); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСоСвойствамиТоваров + +// Получить список свойств +// Получает список свойств товаров группы +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт + + Response = "response"; + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_); + Свойства = Ответ[Response]["items"]; + + Возврат Свойства; + +КонецФункции + +// Создать свойство товара +// Создает новое свойство для использования в товарах +// +// Параметры: +// Название - Строка - Название свойства - title +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("title", Название); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Изменить свойство товара +// Изменяет существующее свойство товара +// +// Параметры: +// Название - Строка - Новое название - title +// Свойство - Строка,Число - ID свойства - prop +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("title" , Название); + Параметры_.Вставить("property_id", Свойство); + Параметры_.Вставить("type" , "text"); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить свойство товара +// Удаляет существующее свойство товара +// +// Параметры: +// Свойство - Строка,Число - ID свойства - prop +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("property_id", Свойство); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Добавить вариант свойства товара +// Добавляет вариант для существующего свойства +// +// Параметры: +// Значение - Строка - Значение свойства - value +// Свойство - Строка,Число - ID свойства, куда добавляется вариант - prop +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("property_id", Свойство); + Параметры_.Вставить("title" , Значение); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Изменить вариант свойства товара +// Изменяет значение варианта существующего свойства товара +// +// Параметры: +// Значение - Строка - Новое значение свойства - value +// Свойство - Строка,Число - ID свойства - prop +// Вариант - Строка,Число - ID варианта - option +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("property_id", Свойство); + Параметры_.Вставить("variant_id" , Вариант); + Параметры_.Вставить("title" , Значение); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_); + + Возврат Ответ; + +КонецФункции + +// Удалить вариант свойства товара +// Удаляет ранее созданный вариант свойства +// +// Параметры: +// Вариант - Строка,Число - ID варианта - option +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("variant_id", Вариант); + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСЗаказами + +// Получить список заказов +// Возвращает список заказов сообщества +// +// Параметры: +// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK +Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт + + Параметры = ПолучитьСтандартныеПараметры(Параметры); + Параметры.Вставить("count", 50); + + МассивЗаказов = Новый Массив; + ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры); + + Возврат МассивЗаказов; + +КонецФункции + +#КонецОбласти + +#Область Прочие + +// Сформировать клавиатуру +// Формирует клавиатуру по массиву кнопок +// +// Параметры: +// МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons +// +// Возвращаемое значение: +// Строка - JSON клавиатуры +Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); + + Клавиатура = Новый Структура; + МассивКлавиатуры = Новый Массив; + МассивБлока = Новый Массив; + + Для Каждого Действие Из МассивКнопок Цикл + + Кнопка = Новый Структура; + Выражение = Новый Структура; + + Выражение.Вставить("type" , "text"); + Выражение.Вставить("label", Действие); + + Кнопка.Вставить("action", Выражение); + МассивБлока.Добавить(Кнопка); + + КонецЦикла; + + МассивКлавиатуры.Добавить(МассивБлока); + + Клавиатура.Вставить("buttons" , МассивКлавиатуры); + Клавиатура.Вставить("one_time", Ложь); + + Возврат OPI_Инструменты.JSONСтрокой(Клавиатура); + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьСтандартныеПараметры(Знач Параметры = "") + + // Здесь собрано определение данных для работы с VK API + // Вы можете переопределять их, передавая в качестве параметра + // Совпадающие поля будут перезаписаны с приоритетом параметра функции + + Параметры_ = Новый Структура; + + // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена() + // from_group - действия будут выполняться от лица группы + // owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был + // установлен свой + // app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков + // group_id - owner_id, но без "-" + + Параметры_.Вставить("access_token" , ""); + Параметры_.Вставить("from_group" , "1"); + Параметры_.Вставить("owner_id" , ""); + Параметры_.Вставить("v" , "5.131"); + Параметры_.Вставить("app_id" , ""); + Параметры_.Вставить("group_id" , ""); + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры); + + Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда + Для Каждого ПереданныйПараметр Из Параметры Цикл + Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение)); + КонецЦикла; + КонецЕсли; + + Возврат Параметры_; + +КонецФункции + +Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид) + + Response = "response"; + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + ИДФото = Результат["photo_id"]; + + Если Не ЗначениеЗаполнено(ИДФото) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); + Возврат ИДФото; + +КонецФункции + +Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид) + + Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид); + ОтветМассив = Ответ.Получить("response"); + + Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда + Возврат Ответ; + Иначе + Если ОтветМассив.Количество() = 0 Тогда + Возврат Ответ; + Иначе + ОтветСоответствие = ОтветМассив[0]; + КонецЕсли; + КонецЕсли; + + Возврат ОтветСоответствие; + +КонецФункции + +Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "") + + Response = "response"; + Подборки = ПолучитьПодборкиПоИД(Подборки, Параметры); + Результат = Подборки[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + + МассивПодборок = Результат["items"]; + + Если Не ЗначениеЗаполнено(МассивПодборок) Тогда + Возврат Подборки; + КонецЕсли; + + Иначе + Возврат Подборки; + КонецЕсли; + + Возврат МассивПодборок; + +КонецФункции + +Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид) + + СоответствиеМетодов = Новый Соответствие; + Загрузка = "Загрузка"; + Сохранение = "Сохранение"; + Способ = "Способ"; + Фото = "Фото"; + + Если Вид = "Пост" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "photos.getWallUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto"); + СоответствиеМетодов.Вставить(Фото , "photo"); + СоответствиеМетодов.Вставить(Способ , 1); + + ИначеЕсли Вид = "Товар" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "market.getProductPhotoUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto"); + СоответствиеМетодов.Вставить(Способ , 2); + + ИначеЕсли Вид = "История" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "stories.getPhotoUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "stories.save"); + СоответствиеМетодов.Вставить(Способ , 3); + + ИначеЕсли Вид = "Опрос" Тогда + + СоответствиеМетодов.Вставить(Загрузка , "polls.getPhotoUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto"); + СоответствиеМетодов.Вставить(Фото , "photo"); + СоответствиеМетодов.Вставить(Способ , 1); + + Иначе + + СоответствиеМетодов.Вставить(Загрузка , "photos.getUploadServer"); + СоответствиеМетодов.Вставить(Сохранение, "photos.save"); + СоответствиеМетодов.Вставить(Фото , "photos_list"); + СоответствиеМетодов.Вставить(Способ , 1); + + КонецЕсли; + + Возврат СоответствиеМетодов; + +КонецФункции + +Функция ПолучитьСоответствиеПараметровТовара() + + Поля = Новый Соответствие(); + Поля.Вставить("Имя" , "name"); + Поля.Вставить("Описание" , "description"); + Поля.Вставить("Категория" , "category_id"); + Поля.Вставить("Цена" , "price"); + Поля.Вставить("СтараяЦена" , "old_price"); + Поля.Вставить("URL" , "url"); + Поля.Вставить("ГлавныйВГруппе" , "is_main_variant"); + Поля.Вставить("Ширина" , "dimension_width"); + Поля.Вставить("Высота" , "dimension_height"); + Поля.Вставить("Глубина" , "dimension_length"); + Поля.Вставить("Вес" , "weight"); + Поля.Вставить("SKU" , "sku"); + Поля.Вставить("ДоступныйОстаток" , "stock_amount"); + + Возврат Поля; + +КонецФункции + +Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Параметры_.Вставить("v", "5.199"); + + Response = "response"; + + ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_); + + Если ЗначениеЗаполнено(ИДТовара) Тогда + Параметры_.Вставить("item_id", ИДТовара); + Метод = "edit"; + Иначе + Метод = "add"; + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); + Результат = Ответ[Response]; + + Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда + + ИДТовара = Результат["market_item_id"]; + + Если Не ЗначениеЗаполнено(ИДТовара) Тогда + Возврат Ответ; + КонецЕсли; + + Иначе + Возврат Ответ; + КонецЕсли; + + Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда + ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция УправлениеПодборкой(Знач Название + , Знач Картинка = "" + , Знач ИДПодборки = "" + , Знач Основная = Ложь + , Знач Скрытая = Ложь + , Знач Параметры = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Название); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки); + OPI_ПреобразованиеТипов.ПолучитьБулево(Основная); + OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая); + + Параметры_ = ПолучитьСтандартныеПараметры(Параметры); + Ответ = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_); + + Если ЗначениеЗаполнено(Ответ) Тогда + Возврат Ответ; + КонецЕсли; + + Параметры_.Вставить("title" , Название); + Параметры_.Вставить("main_album" , ?(Основная, 1, 0)); + Параметры_.Вставить("is_hidden" , ?(Скрытая, 1, 0)); + + Если ЗначениеЗаполнено(ИДПодборки) Тогда + Параметры_.Вставить("album_id", ИДПодборки); + Метод = "editAlbum"; + Иначе + Метод = "addAlbum"; + КонецЕсли; + + Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_); + + Возврат Ответ; + +КонецФункции + +Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры) + + PhotoID = "photo_id"; + + Если ЗначениеЗаполнено(Картинка) Тогда + + ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар"); + + Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда + Возврат ИДФото; + КонецЕсли; + + Параметры.Вставить(PhotoID, ИДФото); + + Иначе + + Если ЗначениеЗаполнено(ИДПодборки) Тогда + + Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры); + + Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда + Возврат Подборки; + КонецЕсли; + + Если Не Подборки.Количество() = 0 Тогда + ИДФото = Подборки[0]["photo"]["id"]; + OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото); + Параметры.Вставить(PhotoID, ИДФото); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат ""; + +КонецФункции + +Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры) + + Response = "response"; + Способ = Метод["Способ"]; + СтандартныйСпособ = 1; + НовыйСпособ = 2; + + Если Способ = СтандартныйСпособ Тогда + + Hash = "hash"; + Serv = "server"; + Aid = "aid"; + Фото = Метод["Фото"]; + + Параметры.Вставить(Hash, Ответ[Hash]); + Параметры.Вставить(Фото, Ответ[Фото]); + + СерверФото = Ответ.Получить(Serv); + + Если ЗначениеЗаполнено(СерверФото) Тогда + СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото); + Параметры.Вставить(Serv, СерверФото); + КонецЕсли; + + Идентификатор = Ответ.Получить(Aid); + + Если ЗначениеЗаполнено(Идентификатор) Тогда + Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор); + Параметры.Вставить(Aid , Идентификатор); + КонецЕсли; + + ИначеЕсли Способ = НовыйСпособ Тогда + + ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ); + Параметры.Вставить("upload_response", ОтветСтрокой); + + Иначе + + Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]); + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры) + + Response = "response"; + ОсновноеФото = ОписаниеТовара["ОсновноеФото"]; + ДопФото = ОписаниеТовара["ДополнительныеФото"]; + Свойства = ОписаниеТовара["ЗначенияСвойств"]; + + Если ЗначениеЗаполнено(ОсновноеФото) Тогда + + Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар"); + Результат = Ответ[Response]; + + Если ЗначениеЗаполнено(Результат) Тогда + ИДФото = Результат["photo_id"]; + + Если Не ЗначениеЗаполнено(ИДФото) Тогда + Возврат; + КонецЕсли; + + Иначе + Возврат; + КонецЕсли; + + ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото); + Параметры.Вставить("main_photo_id", ИДФото); + + КонецЕсли; + + Если ТипЗнч(Свойства) = Тип("Массив") Тогда + + Свойства_ = Новый Массив; + + Для Каждого Свойство Из Свойства Цикл + Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство)); + КонецЦикла; + + Свойства = СтрСоединить(Свойства_, ","); + + КонецЕсли; + + Если ЗначениеЗаполнено(Свойства) Тогда + Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства)); + КонецЕсли; + + ДобавитьДополнительныеФотоТовара(ДопФото, Параметры); + + Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл + + Значение = ОписаниеТовара[Поле.Ключ]; + + Если Значение <> Неопределено Тогда + Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры) + + Если ТипЗнч(МассивФото) = Тип("Массив") Тогда + Если МассивФото.Количество() > 0 Тогда + + СтрокаФотографий = ""; + + Для Каждого Фото Из МассивФото Цикл + + ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар"); + + Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда + Возврат; + КонецЕсли; + + СтрокаФотографий = СтрокаФотографий + ИДФото + ","; + + КонецЦикла; + + СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1); + Параметры.Вставить("photo_ids", СтрокаФотографий); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0) + + Response = "response"; + МаксимумВЗапросе = 200; + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры); + Товары = Ответ[Response]["items"]; + + Если Товары.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Товар Из Товары Цикл + МассивТоваров.Добавить(Товар); + КонецЦикла; + + Сдвиг = Сдвиг + МаксимумВЗапросе; + Параметры.Вставить("offset", Сдвиг); + ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг); + +КонецПроцедуры + +Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0) + + Response = "response"; + МаксимумВЗапросе = 100; + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры); + Альбомы = Ответ[Response]["items"]; + + Если Альбомы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Альбом Из Альбомы Цикл + МассивАльбомов.Добавить(Альбом); + КонецЦикла; + + Сдвиг = Сдвиг + МаксимумВЗапросе; + Параметры.Вставить("offset", Сдвиг); + ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг); + +КонецПроцедуры + +Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0) + + Response = "response"; + МаксимумВЗапросе = 50; + Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры); + Заказы = Ответ[Response]["items"]; + + Если Заказы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого Заказ Из Заказы Цикл + МассивЗаказов.Добавить(Заказ); + КонецЦикла; + + Сдвиг = Сдвиг + МаксимумВЗапросе; + Параметры.Вставить("offset", Сдвиг); + ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг); + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_Viber.os b/src/ru/OInt/core/Modules/OPI_Viber.os similarity index 98% rename from ru/OInt/core/Modules/OPI_Viber.os rename to src/ru/OInt/core/Modules/OPI_Viber.os index 1d2dd91c96..7443cbf692 100644 --- a/ru/OInt/core/Modules/OPI_Viber.os +++ b/src/ru/OInt/core/Modules/OPI_Viber.os @@ -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", Токен); + Возврат СтруктураЗаголовков; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_YandexDisk.os b/src/ru/OInt/core/Modules/OPI_YandexDisk.os similarity index 98% rename from ru/OInt/core/Modules/OPI_YandexDisk.os rename to src/ru/OInt/core/Modules/OPI_YandexDisk.os index 2b3d69eed2..bdef59a75d 100644 --- a/ru/OInt/core/Modules/OPI_YandexDisk.os +++ b/src/ru/OInt/core/Modules/OPI_YandexDisk.os @@ -1,635 +1,635 @@ -// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os -// Библиотека: Yandex Disk -// Команда CLI: yadisk - -// 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:NumberOfOptionalParams-off -// BSLLS:UsingServiceTag-off - -//@skip-check method-too-many-params - -// Раскомментировать, если выполняется OneScript -#Использовать "../../tools" - -#Область ПрограммныйИнтерфейс - -#Область РаботаСФайламиИПапками - -// Получить информацию о диске -// Получает информацию о текущем диске -// -// Параметры: -// Токен - Строка - Токен - token -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - - Заголовки = ЗаголовокАвторизации(Токен); - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать папку -// Создает каталог на диске -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к созаваемой папке - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить объект -// Получает информацию об объекте диска по заданному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к папке или файлу - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Удалить объект -// Удаляет объект по заданному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к удаляемой папке или файлу - path -// ВКорзину - Булево - В корзину - can -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - Параметры.Вставить("path" , Путь); - Параметры.Вставить("permanently", Не ВКорзину); - - Ответ = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Создать копию объекта -// Создает копию объекта по заданному пути и пути к оригиналу -// -// Параметры: -// Токен - Строка - Токен - token -// Оригинал - Строка - Путь к оригинальному файлу или каталогу - from -// Путь - Строка - Путь назначения для копии - to -// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources/copy"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("from" , Оригинал); - Параметры.Вставить("path" , Путь); - Параметры.Вставить("overwrite" , Перезаписывать); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить ссылку для скачивания -// Получает ссылку для скачивания файла -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к файлу для скачивания - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Скачать файл -// Скачивает файл по указанному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к файлу для скачивания - path -// ПутьСохранения - Строка - Путь сохранения файла - out -// -// Возвращаемое значение: -// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения -Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения); - Ответ = ПолучитьСсылкуДляСкачивания(Токен, Путь); - URL = Ответ["href"]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения); - - Возврат Ответ; - -КонецФункции - -// Получить список файлов -// Получает список файлов с или без отбора по типу -// Список доступных типов: audio, backup, book, compressed, data, development, -// diskimage, document, encoded, executable, flash, font, -// mage, settings, spreadsheet, text, unknown, video, web -// -// Параметры: -// Токен - Строка - Токен - token -// Количество - Число,Строка - Количество возвращаемых объектов - amount -// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset -// ОтборПоТипу - Строка - Отбор по типу файла - type -// СортироватьПоДате - Булево - Истина > сортировать по дате, Ложь > по алфавиту - datesort -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСписокФайлов(Знач Токен - , Знач Количество = 0 - , Знач СмещениеОтНачала = 0 - , Знач ОтборПоТипу = "" - , Знач СортироватьПоДате = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); - OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу); - OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Количество) Тогда - Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); - КонецЕсли; - - Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда - Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); - КонецЕсли; - - Если ЗначениеЗаполнено(ОтборПоТипу) Тогда - Параметры.Вставить("media_type", ОтборПоТипу); - КонецЕсли; - - Если СортироватьПоДате Тогда - Назначение = "last-uploaded"; - Иначе - Назначение = "files"; - КонецЕсли; - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Переместить объект -// Перемещает объект по заданному пути и пути к оригиналу -// -// Параметры: -// Токен - Строка - Токен - token -// Оригинал - Строка - Путь к оригинальному файлу или папке - from -// Путь - Строка - Путь назначение для перемещения - to -// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources/move"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("from" , Оригинал); - Параметры.Вставить("path" , Путь); - Параметры.Вставить("overwrite" , Перезаписывать); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл -// Загружает файл на диск по заданному пути -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь для сохранение файла на Диске - path -// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file -// Перезаписывать - Булево - Перезаписывать, если файл с таким именем уже существует - rewrite -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); - - Заголовки = ЗаголовокАвторизации(Токен); - Href = "href"; - Файл = Новый Структура("file", Файл); - - Параметры = Новый Структура; - Параметры.Вставить("path" , Путь); - Параметры.Вставить("overwrite" , Перезаписывать); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки); - URL = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URL) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки); - - Возврат Ответ; - -КонецФункции - -// Загрузить файл по URL -// Загружает файл на диск, забирая его по заданному URL -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь помещения загруженного файла - path -// Адрес - Строка - URL файла - url -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес); - - Заголовки = ЗаголовокАвторизации(Токен); - URL = "https://cloud-api.yandex.net/v1/disk/resources/upload"; - - Параметры = Новый Структура; - Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL)); - Параметры.Вставить("path", Путь); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#Область УправлениеПубличнымДоступом - -// Опубликовать объект -// Публикует объект диска в публичный доступ -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к публикуемому объекту - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт - Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина); -КонецФункции - -// Отменить публикацию объекта -// Отменяет публикацию ранее опубликованного объекта -// -// Параметры: -// Токен - Строка - Токен - token -// Путь - Строка - Путь к опубликованному ранее объекту - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт - Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь); -КонецФункции - -// Получить список опубликованных объектов. -// Получает список опубликованных объектов -// -// Параметры: -// Токен - Строка - Токен - token -// Количество - Число - Количество возвращаемых объектов - amount -// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Количество) Тогда - Параметры.Вставить("limit", Количество); - КонецЕсли; - - Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда - Параметры.Вставить("offset", СмещениеОтНачала); - КонецЕсли; - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить публичный объект -// Получает информацию об опубликованном объекте по его URL -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - Адрес объекта - url -// Количество - Число - Количество возвращаемых вложенных объектов (для каталога) - amount -// СмещениеОтНачала - Число - Смещение для получение вложенных объектов не из начала списка - offset -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); - OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Количество) Тогда - Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); - КонецЕсли; - - Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда - Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); - КонецЕсли; - - Параметры.Вставить("public_key", URL); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Получить ссылку скачивания публичного объекта -// Получает прямую ссылку для скачивания публичного объекта -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - Адрес объекта - url -// Путь - Строка - Путь внутри объекта - path -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - - Заголовки = ЗаголовокАвторизации(Токен); - - Параметры = Новый Структура; - - Если ЗначениеЗаполнено(Путь) Тогда - Параметры.Вставить("path", Путь); - КонецЕсли; - - Параметры.Вставить("public_key", URL); - - Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки); - - Возврат Ответ; - -КонецФункции - -// Сохранить публичный объект на диск -// Сохраняет публичный объект на ваш диск -// -// Параметры: -// Токен - Строка - Токен - token -// URL - Строка - Адрес объекта - url -// Откуда - Строка - Путь внутри публичного каталога (только для папок) - from -// Куда - Строка - Путь сохранения файла - to -// -// Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex -Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда); - - Заголовки = ЗаголовокАвторизации(Токен); - Адрес = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk"; - Href = "href"; - - Параметры = Новый Структура; - Параметры.Вставить("public_key", URL); - - Если ЗначениеЗаполнено(Откуда) Тогда - Параметры.Вставить("path", Откуда); - КонецЕсли; - - Если ЗначениеЗаполнено(Куда) Тогда - Параметры.Вставить("save_path", Куда); - КонецЕсли; - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЗаголовокАвторизации(Знач Токен) - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Authorization", "OAuth " + Токен); - - Возврат Заголовки; - -КонецФункции - -Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ) - - OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); - OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); - OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ); - - Заголовки = ЗаголовокАвторизации(Токен); - Назначение = ?(ОбщийДоступ, "publish", "unpublish"); - Href = "href"; - - URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение; - - Параметры = Новый Структура; - Параметры.Вставить("path", Путь); - - Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); - Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); - - URLОтвета = Ответ[Href]; - - Если Не ЗначениеЗаполнено(URLОтвета) Тогда - Возврат Ответ; - КонецЕсли; - - Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); - - Возврат Ответ; - -КонецФункции - -#КонецОбласти +// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os +// Библиотека: Yandex Disk +// Команда CLI: yadisk + +// 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:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off + +//@skip-check method-too-many-params + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСФайламиИПапками + +// Получить информацию о диске +// Получает информацию о текущем диске +// +// Параметры: +// Токен - Строка - Токен - token +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = ЗаголовокАвторизации(Токен); + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать папку +// Создает каталог на диске +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к созаваемой папке - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить объект +// Получает информацию об объекте диска по заданному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к папке или файлу - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Удалить объект +// Удаляет объект по заданному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к удаляемой папке или файлу - path +// ВКорзину - Булево - В корзину - can +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + Параметры.Вставить("path" , Путь); + Параметры.Вставить("permanently", Не ВКорзину); + + Ответ = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать копию объекта +// Создает копию объекта по заданному пути и пути к оригиналу +// +// Параметры: +// Токен - Строка - Токен - token +// Оригинал - Строка - Путь к оригинальному файлу или каталогу - from +// Путь - Строка - Путь назначения для копии - to +// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources/copy"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("from" , Оригинал); + Параметры.Вставить("path" , Путь); + Параметры.Вставить("overwrite" , Перезаписывать); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить ссылку для скачивания +// Получает ссылку для скачивания файла +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к файлу для скачивания - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Скачать файл +// Скачивает файл по указанному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к файлу для скачивания - path +// ПутьСохранения - Строка - Путь сохранения файла - out +// +// Возвращаемое значение: +// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения +Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения); + Ответ = ПолучитьСсылкуДляСкачивания(Токен, Путь); + URL = Ответ["href"]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения); + + Возврат Ответ; + +КонецФункции + +// Получить список файлов +// Получает список файлов с или без отбора по типу +// Список доступных типов: audio, backup, book, compressed, data, development, +// diskimage, document, encoded, executable, flash, font, +// mage, settings, spreadsheet, text, unknown, video, web +// +// Параметры: +// Токен - Строка - Токен - token +// Количество - Число,Строка - Количество возвращаемых объектов - amount +// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset +// ОтборПоТипу - Строка - Отбор по типу файла - type +// СортироватьПоДате - Булево - Истина > сортировать по дате, Ложь > по алфавиту - datesort +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСписокФайлов(Знач Токен + , Знач Количество = 0 + , Знач СмещениеОтНачала = 0 + , Знач ОтборПоТипу = "" + , Знач СортироватьПоДате = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); + OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу); + OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Количество) Тогда + Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); + КонецЕсли; + + Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда + Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); + КонецЕсли; + + Если ЗначениеЗаполнено(ОтборПоТипу) Тогда + Параметры.Вставить("media_type", ОтборПоТипу); + КонецЕсли; + + Если СортироватьПоДате Тогда + Назначение = "last-uploaded"; + Иначе + Назначение = "files"; + КонецЕсли; + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Переместить объект +// Перемещает объект по заданному пути и пути к оригиналу +// +// Параметры: +// Токен - Строка - Токен - token +// Оригинал - Строка - Путь к оригинальному файлу или папке - from +// Путь - Строка - Путь назначение для перемещения - to +// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources/move"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("from" , Оригинал); + Параметры.Вставить("path" , Путь); + Параметры.Вставить("overwrite" , Перезаписывать); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл +// Загружает файл на диск по заданному пути +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь для сохранение файла на Диске - path +// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file +// Перезаписывать - Булево - Перезаписывать, если файл с таким именем уже существует - rewrite +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать); + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + Заголовки = ЗаголовокАвторизации(Токен); + Href = "href"; + Файл = Новый Структура("file", Файл); + + Параметры = Новый Структура; + Параметры.Вставить("path" , Путь); + Параметры.Вставить("overwrite" , Перезаписывать); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки); + URL = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URL) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки); + + Возврат Ответ; + +КонецФункции + +// Загрузить файл по URL +// Загружает файл на диск, забирая его по заданному URL +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь помещения загруженного файла - path +// Адрес - Строка - URL файла - url +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес); + + Заголовки = ЗаголовокАвторизации(Токен); + URL = "https://cloud-api.yandex.net/v1/disk/resources/upload"; + + Параметры = Новый Структура; + Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL)); + Параметры.Вставить("path", Путь); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область УправлениеПубличнымДоступом + +// Опубликовать объект +// Публикует объект диска в публичный доступ +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к публикуемому объекту - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт + Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина); +КонецФункции + +// Отменить публикацию объекта +// Отменяет публикацию ранее опубликованного объекта +// +// Параметры: +// Токен - Строка - Токен - token +// Путь - Строка - Путь к опубликованному ранее объекту - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт + Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь); +КонецФункции + +// Получить список опубликованных объектов. +// Получает список опубликованных объектов +// +// Параметры: +// Токен - Строка - Токен - token +// Количество - Число - Количество возвращаемых объектов - amount +// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Количество) Тогда + Параметры.Вставить("limit", Количество); + КонецЕсли; + + Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда + Параметры.Вставить("offset", СмещениеОтНачала); + КонецЕсли; + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить публичный объект +// Получает информацию об опубликованном объекте по его URL +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - Адрес объекта - url +// Количество - Число - Количество возвращаемых вложенных объектов (для каталога) - amount +// СмещениеОтНачала - Число - Смещение для получение вложенных объектов не из начала списка - offset +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество); + OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Количество) Тогда + Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество)); + КонецЕсли; + + Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда + Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала)); + КонецЕсли; + + Параметры.Вставить("public_key", URL); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить ссылку скачивания публичного объекта +// Получает прямую ссылку для скачивания публичного объекта +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - Адрес объекта - url +// Путь - Строка - Путь внутри объекта - path +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + + Заголовки = ЗаголовокАвторизации(Токен); + + Параметры = Новый Структура; + + Если ЗначениеЗаполнено(Путь) Тогда + Параметры.Вставить("path", Путь); + КонецЕсли; + + Параметры.Вставить("public_key", URL); + + Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Сохранить публичный объект на диск +// Сохраняет публичный объект на ваш диск +// +// Параметры: +// Токен - Строка - Токен - token +// URL - Строка - Адрес объекта - url +// Откуда - Строка - Путь внутри публичного каталога (только для папок) - from +// Куда - Строка - Путь сохранения файла - to +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex +Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда); + + Заголовки = ЗаголовокАвторизации(Токен); + Адрес = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk"; + Href = "href"; + + Параметры = Новый Структура; + Параметры.Вставить("public_key", URL); + + Если ЗначениеЗаполнено(Откуда) Тогда + Параметры.Вставить("path", Откуда); + КонецЕсли; + + Если ЗначениеЗаполнено(Куда) Тогда + Параметры.Вставить("save_path", Куда); + КонецЕсли; + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ЗаголовокАвторизации(Знач Токен) + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "OAuth " + Токен); + + Возврат Заголовки; + +КонецФункции + +Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ) + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь); + OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ); + + Заголовки = ЗаголовокАвторизации(Токен); + Назначение = ?(ОбщийДоступ, "publish", "unpublish"); + Href = "href"; + + URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение; + + Параметры = Новый Структура; + Параметры.Вставить("path", Путь); + + Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); + Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь); + + URLОтвета = Ответ[Href]; + + Если Не ЗначениеЗаполнено(URLОтвета) Тогда + Возврат Ответ; + КонецЕсли; + + Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/core/Modules/OPI_YandexID.os b/src/ru/OInt/core/Modules/OPI_YandexID.os similarity index 98% rename from ru/OInt/core/Modules/OPI_YandexID.os rename to src/ru/OInt/core/Modules/OPI_YandexID.os index 053dc4e64e..10d9cc743b 100644 --- a/ru/OInt/core/Modules/OPI_YandexID.os +++ b/src/ru/OInt/core/Modules/OPI_YandexID.os @@ -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", Параметры, , Ложь); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os b/src/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os similarity index 100% rename from ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os rename to src/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os diff --git a/ru/OInt/coverage/data/genericCoverage.xml b/src/ru/OInt/coverage/data/genericCoverage.xml similarity index 100% rename from ru/OInt/coverage/data/genericCoverage.xml rename to src/ru/OInt/coverage/data/genericCoverage.xml diff --git a/ru/OInt/lib.config b/src/ru/OInt/lib.config similarity index 98% rename from ru/OInt/lib.config rename to src/ru/OInt/lib.config index 6747b15fc1..742bdb7b7c 100644 --- a/ru/OInt/lib.config +++ b/src/ru/OInt/lib.config @@ -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> diff --git a/ru/OInt/packagedef b/src/ru/OInt/packagedef similarity index 97% rename from ru/OInt/packagedef rename to src/ru/OInt/packagedef index 24c3199fdc..9c0ce97c17 100644 --- a/ru/OInt/packagedef +++ b/src/ru/OInt/packagedef @@ -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") diff --git a/ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os b/src/ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os similarity index 100% rename from ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os rename to src/ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os diff --git a/ru/OInt/tests/Modules/internal/OPI_Тесты.os b/src/ru/OInt/tests/Modules/internal/OPI_Тесты.os similarity index 98% rename from ru/OInt/tests/Modules/internal/OPI_Тесты.os rename to src/ru/OInt/tests/Modules/internal/OPI_Тесты.os index b47c90b90c..e9233bdb73 100644 --- a/ru/OInt/tests/Modules/internal/OPI_Тесты.os +++ b/src/ru/OInt/tests/Modules/internal/OPI_Тесты.os @@ -1,5307 +1,5307 @@ -// Расположение OS: ./OInt/tests/Modules/internal/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 - -// Набор тестов для YAxUnit - -// BSLLS:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UsingServiceTag-off -// BSLLS:UnusedParameters-off -// BSLLS:DuplicateStringLiteral-off - -// @skip-check undefined-variable -// @skip-check wrong-string-literal-content - -// Раскомментировать, если выполняется OneScript -#Использовать oint -#Использовать asserts - -#Область СлужебныйПрограммныйИнтерфейс - -// Для YaxUnit - -Процедура ИсполняемыеСценарии() Экспорт - - OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс(); - -КонецПроцедуры - -// Для Asserts - -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс(); - -КонецФункции - -#Область ЗапускаемыеТесты - -#Область Telegram - -Процедура Телеграм_ПолучитьИнформациюБота() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - - Telegram_ПолучитьИнформациюБота(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПолучитьОбновления() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - - Telegram_УдалитьWebhook(ПараметрыТеста); - Telegram_ПолучитьОбновления(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_УстановитьWebhook() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL" , ПараметрыТеста); - - Telegram_УстановитьWebhook(ПараметрыТеста); - Telegram_УдалитьWebhook(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - - Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьКартинку() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - - Telegram_ОтправитьКартинку(ПараметрыТеста); - Telegram_СкачатьФайл(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьВидео() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); - - Telegram_ОтправитьВидео(ПараметрыТеста); - Telegram_СкачатьФайл(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьАудио() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio" , ПараметрыТеста); - - Telegram_ОтправитьАудио(ПараметрыТеста); - Telegram_СкачатьФайл(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьДокумент() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document" , ПараметрыТеста); - - Telegram_ОтправитьДокумент(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьГифку() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF" , ПараметрыТеста); - - Telegram_ОтправитьГифку(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьМедиагруппу() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); - - Telegram_ОтправитьМеидагруппу(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьМестоположение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat" , ПараметрыТеста); - - Telegram_ОтправитьМестоположение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьКонтакт() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone" , ПараметрыТеста); - - Telegram_ОтправитьКонтакт(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ОтправитьОпрос() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - - Telegram_ОтправитьОпрос(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПереслатьСообщение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); - - Telegram_ПереслатьСообщение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_БанРазбан() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); - - Telegram_Бан(ПараметрыТеста); - Telegram_Разбан(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - - Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); - - Telegram_ЗакрепитьСообщение(ПараметрыТеста); - Telegram_ОткрепитьСообщение(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); - - Telegram_ПолучитьЧислоУчастников(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); - - Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); - - Telegram_СоздатьТемуФорума(ПараметрыТеста); - Telegram_ИзменитьТемуФорума(ПараметрыТеста); - Telegram_ЗакрытьТемуФорума(ПараметрыТеста); - Telegram_ОткрытьТемуФорума(ПараметрыТеста); - Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста); - Telegram_УдалитьТемуФорума(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); - - Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста); - Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста); - -КонецПроцедуры - -Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); - - Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста); - -КонецПроцедуры - -#КонецОбласти - -#Область VK - -Процедура ВК_СоздатьСсылкуТокена() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста); - - VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьУдалитьПост() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста); - - VK_СоздатьПост(ПараметрыТеста); - VK_УдалитьПост(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьСоставнойПост() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); - - VK_СоздатьСоставнойПост(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьОпрос() Экспорт - - VK_СоздатьОпрос(); - -КонецПроцедуры - -Процедура ВК_СохранитьУдалитьКартинку() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - - VK_СоздатьАльбом(ПараметрыТеста); - VK_СохранитьКартинкуВАльбом(ПараметрыТеста); - VK_УдалитьКартинку(ПараметрыТеста); - VK_УдалитьАльбом(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_СоздатьИсторию() Экспорт - - ПараметрыТеста = Новый Соответствие; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); - - VK_СоздатьИсторию(ПараметрыТеста); - -КонецПроцедуры - -Процедура ВК_МетодыОбсуждений() Экспорт - - ПараметрыТеста = Новый Структура; - Параметры = ПолучитьПараметрыВК(); - - VK_СоздатьОбсуждение(ПараметрыТеста); - VK_ЗакрытьОбсуждение(ПараметрыТеста); - VK_ОткрытьОбсуждение(ПараметрыТеста); - VK_НаписатьВОбсуждение(ПараметрыТеста); - - OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ЛайкРепостКоммент() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Текст = "Пост из автотеста"; - Сообщение = "Сообщение из автотеста"; - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - Response = "response"; - - Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры); - - ИДПоста = Результат[Response]["post_id"]; - Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено(); - - ВнешнийПост = 2571; - ВнешняяСтена = -218704372; - - Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1); - - Результат = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - OPI_VK.УдалитьПост(ИДПоста, Параметры); - OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСтатистику() Экспорт - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - Параметры = ПолучитьПараметрыВК(); - Дата0 = НачалоДня(ТекущаяДата); - Дата1 = КонецДня(Дата0); - ТипСоответствие = Тип("Соответствие"); - - Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСтатистикуПостов() Экспорт - - Параметры = ПолучитьПараметрыВК(); - - МассивПостов = Новый Массив; - МассивПостов.Добавить(214); - МассивПостов.Добавить(215); - - Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_СоздатьРекламнуюКампанию() Экспорт - - Параметры = ПолучитьПараметрыВК(); - ИДКабинета = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID"); - Наименование = "Тестовая кампания"; - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - Response = "response"; - UID = "id"; - - Результат = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию"); - - Результат = Результат[Response][0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДКампании = Результат[UID]; - ИДКатегории = 126; - Лимит = 150; - - Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры); - ИДПоста = Результат[Response]["post_id"]; - - Результат = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании - , Лимит - , ИДКатегории - , ИДПоста - , ИДКабинета - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление"); - - Результат = Результат[Response][0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДОбъявления = Результат[UID]; - Результат = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление"); - - Результат = Результат[Response][0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); - - OPI_VK.УдалитьПост(ИДПоста, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ОтправитьСообщение() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID"); - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken"); - Текст = "Сообщение из автотеста"; - - МассивКнопок = Новый Массив; - МассивКнопок.Добавить("Кнопка 1"); - МассивКнопок.Добавить("Кнопка 2"); - - Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок); - Результат = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьКатегорииТоваров() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Соответствие") - .Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_СоздатьТоварПодборку() Экспорт - - Параметры = ПолучитьПараметрыВК(); - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - Response = "response"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" - , Картинка - , Истина - , Ложь - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДПодборки = Результат[Response]["market_album_id"]; - - Результат = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1); - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture")); - МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2")); - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Тестовый товар"); - Товар.Вставить("Описание" , "Описание товара"); - Товар.Вставить("Категория" , "20173"); - Товар.Вставить("Цена" , 1); - Товар.Вставить("СтараяЦена" , 15); - Товар.Вставить("ОсновноеФото" , Картинка); - Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); - Товар.Вставить("ДополнительныеФото" , МассивКартинок); - Товар.Вставить("ГлавныйВГруппе" , Истина); - Товар.Вставить("Ширина" , 20); - Товар.Вставить("Высота" , 30); - Товар.Вставить("Глубина" , 40); - Товар.Вставить("Вес" , 100); - Товар.Вставить("SKU" , "12345"); - Товар.Вставить("ДоступныйОстаток" , "10"); - - Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры); // Добавление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДТовара = Результат[Response]["market_item_id"]; - - Товар = Новый Соответствие; - Товар.Вставить("Имя", "Тестовый товар измененный"); - - Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры); // Изменение товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар"); - - Проверка_ВКИстина(Результат); - - Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры); // Добавление в подборку - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено(); - - Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры); // Удаляет из подборки - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Результат); - - Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры); // Удаление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Результат); - - Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); // Уадление подборки - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Результат); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_СоздатьТоварСоСвойствами() Экспорт - - Параметры = ПолучитьПараметрыВК(); - ТипСоответствие = Тип("Соответствие"); - ТипЧисло = Тип("Число"); - MII = "market_item_id"; - Response = "response"; - Желтый = "Желтый"; - Красный = "Красный"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - МассивВариантов = Новый Массив; - МассивВариантов.Добавить(Желтый); - МассивВариантов.Добавить("Синий"); - МассивВариантов.Добавить(Красный); - - Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара"); - - OPI_Инструменты.Пауза(5); - - Свойство = Результат[Response]["property_id"]; - Свойство = OPI_Инструменты.ЧислоВСтроку(Свойство); - - СоответствиеСвойств = Новый Соответствие; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара"); - - OPI_Инструменты.Пауза(5); - - Проверка_ВКИстина(Результат); - - Для Каждого Вариант Из МассивВариантов Цикл - - Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - ИДВарианта = Результат[Response]["variant_id"]; - СоответствиеСвойств.Вставить(Вариант, ИДВарианта); - - Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор()) - , Свойство - , ИДВарианта - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара"); - - Проверка_ВКИстина(Результат); - - КонецЦикла; - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(ИВФ); - МассивКартинок.Добавить(Картинка); - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Тестовый товар (" + Желтый + ")"); - Товар.Вставить("Описание" , "Описание товара"); - Товар.Вставить("Категория" , "20173"); - Товар.Вставить("Цена" , 1); - Товар.Вставить("СтараяЦена" , 15); - Товар.Вставить("ОсновноеФото" , Картинка); - Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); - Товар.Вставить("ДополнительныеФото" , МассивКартинок); - Товар.Вставить("ГлавныйВГруппе" , Истина); - Товар.Вставить("НомерГруппы" , Неопределено); - Товар.Вставить("Ширина" , 20); - Товар.Вставить("Высота" , 30); - Товар.Вставить("Глубина" , 40); - Товар.Вставить("Вес" , 100); - Товар.Вставить("SKU" , 12345); - Товар.Вставить("ДоступныйОстаток" , "10"); - Товар.Вставить("ЗначенияСвойств" , СоответствиеСвойств[Желтый]); - - Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); - - OPI_Инструменты.Пауза(5); - - ИДЖелтого = Результат[Response]["market_item_id"]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); - - Товар.Вставить("Имя" , "Тестовый товар (" + Красный + ")"); - Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]); - - Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); - - OPI_Инструменты.Пауза(5); - - ИДКрасного = Результат[Response][MII]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); - - МассивТоваров = Новый Массив; - МассивТоваров.Добавить(ИДЖелтого); - МассивТоваров.Добавить(ИДКрасного); - - Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2); - - Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено(); - - OPI_VK.УдалитьТовар(ИДЖелтого , Параметры); - OPI_VK.УдалитьТовар(ИДКрасного, Параметры); - - Для Каждого Вариант Из СоответствиеСвойств Цикл - - Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара"); - - OPI_Инструменты.Пауза(5); - Проверка_ВКИстина(Удаление); - - КонецЦикла; - - Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара"); - - OPI_Инструменты.Пауза(5); - - Проверка_ВКИстина(Удаление); - - УдалитьФайлы(ИВФ); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокТоваров() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(Картинка); - - Товар = Новый Соответствие(); - Товар.Вставить("Имя" , "Тестовый товар 2"); - Товар.Вставить("Описание" , "Описание товара"); - Товар.Вставить("Категория" , "20173"); - Товар.Вставить("Цена" , 1); - Товар.Вставить("СтараяЦена" , 15); - Товар.Вставить("ОсновноеФото" , Картинка); - Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); - Товар.Вставить("ДополнительныеФото" , МассивКартинок); - Товар.Вставить("ГлавныйВГруппе" , Истина); - Товар.Вставить("НомерГруппы" , Неопределено); - Товар.Вставить("Ширина" , 20); - Товар.Вставить("Высота" , 30); - Товар.Вставить("Глубина" , 40); - Товар.Вставить("Вес" , 100); - Товар.Вставить("SKU" , 12345); - Товар.Вставить("ДоступныйОстаток" , "10"); - - Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); - ИДТовара = Результат["response"]["market_item_id"]; - OPI_Инструменты.Пауза(5); - - Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_VK.УдалитьТовар(ИДТовара, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокПодборок() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" - , Картинка - , Истина - , Ложь - , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); - - ИДПодборки = Результат["response"]["market_album_id"]; - Результат = OPI_VK.ПолучитьСписокПодборок(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокСвойств() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Результат = OPI_VK.ПолучитьСписокСвойств(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ПолучитьСписокЗаказов() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Результат = OPI_VK.ПолучитьСписокЗаказов(Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ВК_ЗагрузитьВидео() Экспорт - - Параметры = ПолучитьПараметрыВК(); - Видео = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video"); - Наименование = "Новое видео"; - Описание = "Описание видео"; - - Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область YandexDisk - -Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Соответствие = "Соответствие"; - - Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_СоздатьПапку() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор); - - Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - Проверка_Пусто(Результат); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); - - Проверка_Пусто(Результат); - - Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - Проверка_Пусто(Результат); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); - - Проверка_Пусто(Результат); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/" - + "OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); - - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); - OPI_Инструменты.Пауза(5); - - Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); - - URL = Результат["href"]; - - Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено(); - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - -КонецПроцедуры - -Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Количество = 2; - Отступ = 1; - - Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ПереместитьОбъект() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/" - + "OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); - OPI_Инструменты.Пауза(15); - - Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); - - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); - OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт - - PUrl = "public_url"; - Соответствие = "Соответствие"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; - URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; - - OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); - OPI_Инструменты.Пауза(5); - - МассивРезультатов = Новый Массив; - - МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь)); - ПубличныйURL = МассивРезультатов[0][PUrl]; - - Результат = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); - - Результат = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/"); - - МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL)); - - МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь)); - - Счетчик = 0; - Для Каждого Результат Из МассивРезультатов Цикл - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено(); - - Если Счетчик = 0 Тогда - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено(); - Иначе - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено"); - КонецЕсли; - - Счетчик = Счетчик + 1; - - КонецЦикла; - - OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); - Количество = 2; - Отступ = 1; - - Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область Viber - -Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале"); - - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - Результат = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено(); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Результат = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив"); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт - - Текст = "Тестовое сообщение"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - МассивКнопок = Новый Массив; - МассивКнопок.Добавить("Кнопка 1"); - МассивКнопок.Добавить("Кнопка 2"); - МассивКнопок.Добавить("Кнопка 3"); - - Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок); - - Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьКартинку() Экспорт - - Текст = "Тестовое сообщение"; - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьФайл() Экспорт - - Документ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьКонтакт() Экспорт - - Имя = "Петр Петров"; - Телефон = "+123456789"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьЛокацию() Экспорт - - Широта = "48.87373649724122"; - Долгота = "2.2954639195323967"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Вайбер_ОтправитьСсылку() Экспорт - - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); - ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); - Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); - - Результат = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - Результат = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); - Проверка_ВайберОк(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleWorkspace - -Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт - - ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); - Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Строка") - .Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГВ_ПолучитьТокен() Экспорт - - ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); - ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); - Code = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code"); - - Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code); - - Если ЗначениеЗаполнено(Результат["access_token"]) - И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token" , Результат["access_token"]); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]); - - КонецЕсли; - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГВ_ОбновитьТокен() Экспорт - - ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); - ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); - RefreshToken = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh"); - - Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleCalendar - -Процедура ГК_ПолучитьСписокКалендарей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) - .ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГК_СоздатьУдалитьКалендарь() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Наименование = "Тестовый календарь"; - Описание = "Тестовое описание"; - НаименованиеИзмененное = Наименование + " (изм.)"; - ТипСоответствие = Тип("Соответствие"); - ТипСтрока = Тип("Строка"); - Summary = "summary"; - Черный = "#000000"; - Желтый = "#ffd800"; - - Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено(); - - Календарь = Результат["id"]; - - Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен - , Календарь - , НаименованиеИзмененное - , Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря"); - - Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); - - Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря"); - - Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); - - Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок"); - - Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); - - Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); - - Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); - - Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь"); - - Проверка_Пусто(Результат); - - Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка"); - - Проверка_Пусто(Результат); - - Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГК_СоздатьУдалитьСобытие() Экспорт - - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); - Наименование = "Новое событие"; - Описание = "Описание тестового события"; - ОписаниеИзм = "Описание тестового события (изм.)"; - UID = "id"; - Час = 3600; - - Вложения = Новый Соответствие; - - Вложения.Вставить("Картинка1" - , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); - Вложения.Вставить("Картинка2" - , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); - - СоответствиеСобытия = Новый Соответствие; - СоответствиеСобытия.Вставить("Описание" , Описание); - СоответствиеСобытия.Вставить("Заголовок" , Наименование); - СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе"); - СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДата); - СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + Час); - СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения); - СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); - - Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие"); - - Событие = Результат[UID]; - - Проверка_ГКОбъект(Результат, Наименование, Описание); - - СоответствиеСобытия = Новый Соответствие; - СоответствиеСобытия.Вставить("Описание", ОписаниеИзм); - - Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие"); - - Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); - - Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие"); - - Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); - - Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие"); - - Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); - - Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГК_ПолучитьСписокСобытий() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); - - Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив"); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleDrive - -Процедура ГД_ПолучитьСписокКаталогов() Экспорт - - MimeType = "mimeType"; - Name = "name"; - Имя = "Тестовая папка"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов"); - - Результат = Результат[0]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); - - OPI_Инструменты.Пауза(5); - Идентификатор = Результат["id"]; - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор); - - Результат = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт - - ЛишниеБайты = 2; - - Kind = "kind"; - Content = "content"; - MIME = "MIME"; - MimeType = "mimeType"; - Name = "name"; - Id_ = "id"; - - МассивУдаляемых = Новый Массив; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - КартинкаЗамены = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"); - Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); - - Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); - Описание.Вставить("Родитель", Каталог); - - Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]); - - Идентификатор = Результат[Id_]; - МассивУдаляемых.Добавить(Идентификатор); - - НовоеИмя = "Скопированный файл.jpeg"; - Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект"); - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); - - МассивУдаляемых.Добавить(Результат[Id_]); - - Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты); - OPI_Инструменты.Пауза(5); - - НовоеИмя = "Обновленный файл.jpg"; - Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); - - OPI_Инструменты.Пауза(5); - - Комментарий = "Yo"; - Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); - - OPI_Инструменты.Пауза(5); - - Для Каждого Удаляемый Из МассивУдаляемых Цикл - Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); - OPI_Инструменты.Пауза(2); - КонецЦикла; - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура ГД_СоздатьУдалитьКомментарий() Экспорт - - Kind = "kind"; - Content = "content"; - Id_ = "id"; - Comments = "comments"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - - Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); - Описание.Вставить("Родитель", Каталог); - - Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); - Идентификатор = Результат[Id_]; - - Комментарий = "Новый комментарий"; - МассивРезультатов = Новый Массив; - Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); - - ИДКомментария = Результат[Id_]; - - МассивРезультатов.Добавить(Результат); - - Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий"); - - МассивРезультатов.Добавить(Результат); - - Результат = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев"); - - Комментарии = Результат[Comments]; - ОбъектКомментарий = Комментарии[Комментарии.ВГраница()]; - - МассивРезультатов.Добавить(ОбъектКомментарий); - - Для Каждого Результат Из МассивРезультатов Цикл - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); - КонецЦикла; - - Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); - - OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор); - -КонецПроцедуры - -Процедура ГД_СоздатьКаталог() Экспорт - - Name = "name"; - Имя = "Тестовая папка"; - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); - - МассивРезультатов = Новый Массив; - - МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя)); - МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог)); - - Для Каждого Результат Из МассивРезультатов Цикл - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); - - ИДКаталога = Результат["id"]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя); - - OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога); - - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область GoogleSheets - -Процедура ГТ_СоздатьТаблицу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Наименование = "Тестовая таблица"; - - МассивЛистов = Новый Массив; - МассивЛистов.Добавить("Лист1"); - МассивЛистов.Добавить("Лист2"); - - Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); - - Для Н = 0 По МассивЛистов.ВГраница() Цикл - - ИмяЛиста = Результат["sheets"][Н]["properties"]["title"]; - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]); - Лист = Результат["sheets"][Н]["properties"]["sheetId"]; - Лист = OPI_Инструменты.ЧислоВСтроку(Лист); - - КонецЦикла; - - Книга = Результат["spreadsheetId"]; - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet" , Лист); - - Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); - Книга2 = Результат["spreadsheetId"]; - - Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)"); - - Наименование = "Тестовый лист"; - - Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист"); - - НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"]; - НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - - Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - - Наименование = "Тестовая таблица (изм.)"; - - Результат = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - -КонецПроцедуры - -Процедура ГТ_ПолучитьТаблицу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); - Наименование = "Тестовая таблица (изм.)"; - - Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); - -КонецПроцедуры - -Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); - Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); - Лист = "Лист2"; - - СтруктураЯчеек = Новый Соответствие; - СтруктураЯчеек.Вставить("A1", "Это A1"); - СтруктураЯчеек.Вставить("A2", "Это A2"); - СтруктураЯчеек.Вставить("B2", "Это B2"); - СтруктураЯчеек.Вставить("B3", "Это B3"); - СтруктураЯчеек.Вставить("A3", "Это A3"); - СтруктураЯчеек.Вставить("A4", "Это A4"); - СтруктураЯчеек.Вставить("B1", "Это B1"); - СтруктураЯчеек.Вставить("B4", "Это B4"); - - МассивЯчеек = Новый Массив; - МассивЯчеек.Добавить("B2"); - МассивЯчеек.Добавить("A3"); - МассивЯчеек.Добавить("B4"); - - Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество()); - - Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество()); - - Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - - МассивЯчеек = Новый Массив; - МассивЯчеек.Добавить("B2"); - МассивЯчеек.Добавить("A3"); - МассивЯчеек.Добавить("B4"); - - Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество()); - -КонецПроцедуры - -#КонецОбласти - -#Область Twitter - -Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Твиттер_ОбновитьТокен() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Результат = OPI_Twitter.ОбновитьТокен(Параметры); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено(); - - Рефреш = Результат["refresh_token"]; - Токен = Результат["access_token"]; - - Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш); - КонецЕсли; - - Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token" , Токен); - КонецЕсли; - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - - Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит"); - - Проверка_ТвиттерТекст(Результат, Текст); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); - ИВФ = ПолучитьИмяВременногоФайла("png"); - Картинка.Записать(ИВФ); - - Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСВидео() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - Видео = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video"); - ИВФ = ПолучитьИмяВременногоФайла("mp4"); - Видео.Записать(ИВФ); - - Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); - - Проверка_ТвиттерТекст(Результат, Текст); - - Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); - - Проверка_ТвиттерТекст(Результат, Текст); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСГиф() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - Гифка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF"); - ИВФ = ПолучитьИмяВременногоФайла("gif"); - Гифка.Записать(ИВФ); - - Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); - - Проверка_ТвиттерТекст(Результат, Текст); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -Процедура Твиттер_СоздатьТвитСОпросом() Экспорт - - Параметры = ПолучитьПараметрыТвиттер(); - Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); - МассивОтветов = Новый Массив; - МассивОтветов.Добавить("Вариант 1"); - МассивОтветов.Добавить("Вариант 2"); - - Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос"); - - Проверка_ТвиттерТекст(Результат, Текст); - - OPI_Инструменты.Пауза(20); - -КонецПроцедуры - -#КонецОбласти - -#Область Notion - -Процедура Ноушн_СоздатьСтраницу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); - Заголовок = "Тестовый заголовок"; - - Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу"); - - Проверка_НоушнОбъект(Результат); - -КонецПроцедуры - -Процедура Ноушн_СоздатьИзменитьБазу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); - Заголовок = "Тестовый заголовок"; - - Свойства = Новый Соответствие; - Свойства.Вставить("Имя" , "title"); - Свойства.Вставить("Описание" , "rich_text"); - Свойства.Вставить("Номер" , "number"); - Свойства.Вставить("Статус" , "status"); - Свойства.Вставить("Дата создания" , "date"); - Свойства.Вставить("Картинка" , "files"); - Свойства.Вставить("Активен" , "checkbox"); - Свойства.Вставить("Сайт" , "url"); - Свойства.Вставить("Почта" , "email"); - Свойства.Вставить("Телефон" , "phone_number"); - Свойства.Вставить("Пользователь" , "people"); - - ВыборЗначения = Новый Соответствие; - ВыборЗначения.Вставить("Новый", "green"); - ВыборЗначения.Вставить("В работе", "yellow"); - ВыборЗначения.Вставить("Удаленный", "red"); - Свойства.Вставить("Статус", ВыборЗначения); - - Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных"); - - Проверка_НоушнОбъект(Результат, "database"); - - База = Результат["id"]; - Заголовок = "Тестовый заголовок"; - Описание = "Тестовое описание"; - - Свойства = Новый Соответствие; - Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст - Свойства.Вставить("Сайт"); // Поле "Сайт" будет удалено - - Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы"); - - Проверка_НоушнОбъект(Результат, "database"); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); - - Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу"); - - Проверка_НоушнОбъект(Результат); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); - - Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных"); - - Проверка_НоушнОбъект(Результат, "database"); - -КонецПроцедуры - -Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); - - Картинка = Новый Соответствие; - Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture")); - - Свойства = Новый Соответствие; - Свойства.Вставить("Имя" , "ООО Вектор"); - Свойства.Вставить("Описание" , "Наш первый клиент"); - Свойства.Вставить("Номер" , 1); - Свойства.Вставить("Статус" , "Обычный"); - Свойства.Вставить("Дата создания" , OPI_Инструменты.ПолучитьТекущуюДату()); - Свойства.Вставить("Картинка" , Картинка); - Свойства.Вставить("Активен" , Истина); - Свойства.Вставить("Сайт" , "https://vector.ru"); - Свойства.Вставить("Почта" , "mail@vector.ru"); - Свойства.Вставить("Телефон" , "88005553535"); - Свойства.Вставить("Статус" , "Новый"); - - Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу"); - - Проверка_НоушнОбъект(Результат); - - Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", ""); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База); - -КонецПроцедуры - -Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); - Иконка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); - Обложка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2"); - Архивировать = Ложь; - - Свойства = Новый Соответствие; - Свойства.Вставить("Активен" , Ложь); - Свойства.Вставить("Почта" , "vector@mail.ru"); - - Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен - , Страница - , Свойства - , Иконка - , Обложка - , Архивировать); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы"); - - Проверка_НоушнОбъект(Результат); - -КонецПроцедуры - -Процедура Ноушн_СоздатьУдалитьБлок() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); - Блок = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block"); - - Результат = OPI_Notion.ВернутьБлок(Токен, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок"); - - Проверка_НоушнОбъект(Результат, "block"); - - Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок"); - - Проверка_НоушнОбъект(Результат, "list"); - - Блок = Результат["results"][0]["id"]; - Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки"); - - Проверка_НоушнОбъект(Результат, "list"); - - Результат = OPI_Notion.УдалитьБлок(Токен, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок"); - - Проверка_НоушнОбъект(Результат, "block"); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьПользователей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Результат = OPI_Notion.СписокПользователей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей"); - - Проверка_НоушнОбъект(Результат, "list"); - -КонецПроцедуры - -Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User"); - Результат = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); - - Проверка_НоушнОбъект(Результат, "user"); - -КонецПроцедуры - -#КонецОбласти - -#Область Slack - -Процедура Слак_ПолучитьИнформациюОБоте() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено(); - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокПользователей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Результат = OPI_Slack.ПолучитьСписокПользователей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокОбластей() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ОтправитьУдалитьСообщение() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - Текст = "Тестовое сообщение 1"; - Текст2 = "Тестовое сообщение 2"; - Отметки = Новый Массив; - Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст); - - Отметка = Результат["ts"]; - - Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2); - - Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); - - Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено(); - - Проверка_СлакОк(Результат); - - Отметки.Добавить(Отметка); - - МассивБлоков = Новый Массив; - Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); - МассивБлоков.Добавить(Блок); - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - Отметки.Добавить(Результат["ts"]); - - Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); - БлокJSON = OPI_Инструменты.JSONСтрокой(Блок); - - ИВФ = ПолучитьИмяВременногоФайла("json"); - - ТекстовыйДокумент = Новый ТекстовыйДокумент(); - ТекстовыйДокумент.УстановитьТекст(БлокJSON); - ТекстовыйДокумент.Записать(ИВФ); - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - Отметки.Добавить(Результат["ts"]); - - Блоки = "['" + ИВФ + "','" + ИВФ + "']"; - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - Отметки.Добавить(Результат["ts"]); - - УдалитьФайлы(ИВФ); - - Для Каждого Отметка Из Отметки Цикл - - Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); - - КонецЦикла; - - Час = 3600; - Сутки = 24; - Отправка = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час); - Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено(); - - Отметка = Результат["scheduled_message_id"]; - Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); - - Проверка_СлакОк(Результат); - -КонецПроцедуры - -Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); - Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; - Текст = "Тестовое сообщение 1"; - - Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); - Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено(); - -КонецПроцедуры - -Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - - Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_СоздатьАрхивироватьКанал() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); - Имя = "testconv" + Строка(Новый УникальныйИдентификатор); - Тема = "Тестовая тема"; - Цель = "Тестовая цель"; - - #Область СоздатьКанал - Результат = OPI_Slack.СоздатьКанал(Токен, Имя); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область УстановитьТемуКанала - Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема); - #КонецОбласти - - #Область УстановитьЦельКанала - Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала"); - - Проверка_СлакОк(Результат); - #КонецОбласти - - #Область ПолучитьКанал - Результат = OPI_Slack.ПолучитьКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область ПригласитьПользователейВКанал - Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область ВыгнатьПользователяИзКанала - Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала"); - - Проверка_СлакОк(Результат); - #КонецОбласти - - #Область ПолучитьИсториюКанала - Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); - #КонецОбласти - - #Область ПолучитьСписокПользователейКанала - Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); - #КонецОбласти - - #Область ПокинутьКанал - Результат = OPI_Slack.ПокинутьКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал"); - - Проверка_СлакОк(Результат); - #КонецОбласти - - #Область ВступитьВКанал - Результат = OPI_Slack.ВступитьВКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); - #КонецОбласти - - #Область ПереименоватьКанал - НовоеИмя = "testconv" + Строка(Новый УникальныйИдентификатор); - Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал"); - - Данные = Результат["channel"]; - Канал = Данные["id"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя); - #КонецОбласти - - #Область АрхивироватьКанал - Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал"); - - Проверка_СлакОк(Результат); - #КонецОбласти - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокКаналов() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - - Результат = OPI_Slack.ПолучитьСписокКаналов(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); - Текст = "Yo, dude"; - - Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог"); - - Диалог = Результат["channel"]["id"]; - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено(); - - Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); - - Проверка_СлакОк(Результат); - - Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог"); - - Проверка_СлакОк(Результат); - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокФайлов() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - - Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - МассивФайлов = Новый Массив; - ИмяФайла = "megadoc.docx"; - Заголовок = "Новый файл"; - - Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); - - ЗагруженныйФайл = Результат["files"][0]; - МассивФайлов.Добавить(ЗагруженныйФайл["id"]); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); - - Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)"); - - ЗагруженныйФайл = Результат["files"][0]; - МассивФайлов.Добавить(ЗагруженныйФайл["id"]); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); - - Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл"); - - ЗагруженныйФайл = Результат["file"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); - - Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл - - Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл"); - - Проверка_СлакОк(Результат); - - КонецЦикла; - -КонецПроцедуры - -Процедура Слак_ПолучитьСписокВФ() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - - Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - - Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); - Файл = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); - Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); - Заголовок = "Новый файл"; - - Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл"); - - ЗагруженныйФайл = Результат["file"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); - - Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл"); - - ЗагруженныйФайл = Результат["file"]; - - Проверка_СлакОк(Результат); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); - - Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); - - Проверка_СлакОк(Результат); - - Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); - - Проверка_СлакОк(Результат); - -КонецПроцедуры - -#КонецОбласти - -#Область Airtable - -Процедура АТ_СоздатьБазу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace"); - Наименование = "Тестовая база"; - - МассивПолей = Новый Массив; - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); - - ИмяТаблицы = "Тестовая таблица"; - - СоответствиеТаблиц = Новый Соответствие; - СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей); - - Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы); - - База = Результат["id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База); - - Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив"); - - Результат = OPI_Airtable.ПолучитьСписокБаз(Токен); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура АТ_СоздатьТаблицу() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); - - МассивПолей = Новый Массив; - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты"); - - МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка")); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки"); - - ИмяТаблицы = "Тестовая таблица 2"; - Описание = "Новая таблица"; - - Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - - Таблица = Результат["id"]; - ИмяТаблицы = "Тестовая таблица 2 (изм.)"; - Описание = "Новая таблица (изм.)"; - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица); - - Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - -КонецПроцедуры - -Процедура АТ_СоздатьПоле() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); - Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); - Имя = Строка(Новый УникальныйИдентификатор); - - Поле = OPI_Airtable.ПолучитьПолеНомера(Имя); - - Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); - - Поле = Результат["id"]; - Имя = Имя + "(изм.)"; - Описание = "Новое описание"; - - Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - -КонецПроцедуры - -Процедура АТ_СоздатьУдалитьЗаписи() Экспорт - - Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); - База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); - Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); - - Числовой = 10; - Строчный = "Привет"; - - ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный); - ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный); - - МассивУдаляемых = Новый Массив; - МассивОписаний = Новый Массив; - МассивОписаний.Добавить(ОписаниеСтроки1); - МассивОписаний.Добавить(ОписаниеСтроки2); - - Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2); - - Для Каждого Запись Из Результат["records"] Цикл - МассивУдаляемых.Добавить(Запись["id"]); - КонецЦикла; - - Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)"); - - ОдиночнаяЗапись = Результат["id"]; - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный); - - Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись); - - Текст = "Тестовый комментарий"; - Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); - - Коммент = Результат["id"]; - Текст = "Тестовый комментарий (изм.)"; - Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); - - Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив"); - - Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент); - - Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); - - Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); - - Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); - -КонецПроцедуры - -#КонецОбласти - -#Область Dropbox - -Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста); - - Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста); - - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста); - - Dropbox_ПолучитьТокен(ПараметрыТеста); - - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста); - - Dropbox_ОбновитьТокен(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ЗагрузитьФайл() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста); - - Dropbox_ЗагрузитьФайл(ПараметрыТеста); - Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста); - Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста); - Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста); - Dropbox_ПолучитьПревью(ПараметрыТеста); - Dropbox_СкачатьФайл(ПараметрыТеста); - Dropbox_ПереместитьОбъект(ПараметрыТеста); - Dropbox_КопироватьОбъект(ПараметрыТеста); - Dropbox_УдалитьОбъект(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_СоздатьКаталог() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_СоздатьПапку(ПараметрыТеста); - Dropbox_СкачатьПапку(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста); - - Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста); - Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_СоздатьУдалитьТег() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_ДобавитьТег(ПараметрыТеста); - Dropbox_ПолчитьСписокТегов(ПараметрыТеста); - Dropbox_УдалитьТег(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_ПолучитьАккаунт() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); - - Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста); - Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста); - -КонецПроцедуры - -Процедура ДропБокс_РаботаСДоступами() Экспорт - - ПараметрыТеста = Новый Структура; - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token" , ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста); - OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID" , ПараметрыТеста); - - Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста); - Dropbox_ОпубликоватьПапку(ПараметрыТеста); - Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста); - Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста); - Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста); - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ПолучитьПараметрыВК() - - Параметры = Новый Структура; - НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID"); - - Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token")); - Параметры.Вставить("owner_id" , "-" + НомерГруппы); - Параметры.Вставить("app_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID")); - Параметры.Вставить("group_id" , НомерГруппы); - - Возврат Параметры; - -КонецФункции - -Функция ПолучитьПараметрыТвиттер() - - Параметры = Новый Соответствие; - - Параметры.Вставить("redirect_uri" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect")); - Параметры.Вставить("client_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID")); - Параметры.Вставить("client_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret")); - Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token")); - Параметры.Вставить("refresh_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh")); - Параметры.Вставить("oauth_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken")); - Параметры.Вставить("oauth_token_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret")); - - Параметры.Вставить("oauth_consumer_key" - , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey")); - Параметры.Вставить("oauth_consumer_secret" - , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret")); - - Возврат Параметры; - -КонецФункции - -#Область Проверки - -Процедура Проверка_Пусто(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); -КонецПроцедуры - -Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено) - - МинимальныйРазмер = 500000; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); - - Если Не Размер = Неопределено Тогда - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер); - Иначе - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина); - КонецЕсли; - -КонецПроцедуры - -Процедура Проверка_ТелеграмИстина(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); - -КонецПроцедуры - -Процедура Проверка_ТелеграмИнформацияБота(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмМассив(Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст); - -КонецПроцедуры - -Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст) - - Result = "result"; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмМедиагруппа(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмМестоположение(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя); - -КонецПроцедуры - -Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос); - -КонецПроцедуры - -Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения)); - -КонецПроцедуры - -Процедура Проверка_ТелеграмБан(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение) - - Result = "result"; - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение)); - -КонецПроцедуры - -Процедура Проверка_ТелеграмЧисло(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число"); - -КонецПроцедуры - -Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка); - -КонецПроцедуры - -Процедура Проверка_ВКПост(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ВКИстина(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1); - -КонецПроцедуры - -Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание); - -КонецПроцедуры - -Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома) - - Response = "response"; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома); - -КонецПроцедуры - -Процедура Проверка_ВКИстория(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ВКОбсуждение(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено(); - -КонецПроцедуры - -Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст) - - ТекстОтвета = Результат["data"]["text"]; - ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст)); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст); - -КонецПроцедуры - -Процедура Проверка_ВайберОк(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0); - -КонецПроцедуры - -Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page") - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид); - -КонецПроцедуры - -Процедура Проверка_СлакОк(Знач Результат) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); - -КонецПроцедуры - -Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь); - -КонецПроцедуры - -Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь); - -КонецПроцедуры - -Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив"); - - Если Не Количество = Неопределено Тогда - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество); - КонецЕсли; - -КонецПроцедуры - -Процедура Проверка_ДропБоксРабота(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено(); -КонецПроцедуры - -Процедура Проверка_ДропБоксСтатус(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete"); -КонецПроцедуры - -Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество) - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество); - -КонецПроцедуры - -Процедура Проверка_ДропбоксАккаунт(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено(); -КонецПроцедуры - -Процедура Проверка_ДропбоксПространство(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено(); -КонецПроцедуры - -Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success"); - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта); - OPI_ПолучениеДанныхТестов.ОжидаетЧто( - Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor")); -КонецПроцедуры - -Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат) - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено(); -КонецПроцедуры - -#КонецОбласти - -#Область АтомарныеТесты - -#Область Telegram - -Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.ПолучитьИнформациюБота(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram"); - - Проверка_ТелеграмИнформацияБота(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПолучитьОбновления(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.ПолучитьОбновления(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram"); - - Проверка_ТелеграмМассив(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_УстановитьWebhook(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - URL = ПараметрыФункции["Telegram_URL"]; - - Результат = OPI_Telegram.УстановитьWebhook(Токен, URL); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram"); - - Проверка_ТелеграмУстановкаВебхук(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_УдалитьWebhook(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.УдалитьWebhook(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram"); - - Проверка_ТелеграмУдалениеВебхук(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - - Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram"); - - Проверка_ТелеграмСообщение(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)"); - - Проверка_ТелеграмСообщение(Результат, Текст); - - IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьКартинку(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Картинка = ПараметрыФункции["Picture"]; - - КартинкаПуть = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, КартинкаПуть); - - КартинкаДД = Новый ДвоичныеДанные(КартинкаПуть); - - Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram"); - - Проверка_ТелеграмКартинка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)"); - - Проверка_ТелеграмКартинка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)"); - - Проверка_ТелеграмКартинка(Результат, Текст); - - УдалитьФайлы(КартинкаПуть); - - IDФайла = Результат["result"]["photo"][0]["file_id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); - - ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьВидео(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Видео = ПараметрыФункции["Video"]; - - ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); - КопироватьФайл(Видео, ВидеоПуть); - - ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); - - Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram"); - - Проверка_ТелеграмВидео(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)"); - - Проверка_ТелеграмВидео(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)"); - - Проверка_ТелеграмВидео(Результат, Текст); - - УдалитьФайлы(ВидеоПуть); - - IDФайла = Результат["result"]["video"]["file_id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); - - ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьАудио(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Аудио = ПараметрыФункции["Audio"]; - - АудиоПуть = ПолучитьИмяВременногоФайла("mp3"); - КопироватьФайл(Аудио, АудиоПуть); - - АудиоДД = Новый ДвоичныеДанные(АудиоПуть); - - Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram"); - - Проверка_ТелеграмАудио(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)"); - - Проверка_ТелеграмАудио(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)"); - - Проверка_ТелеграмАудио(Результат, Текст); - - УдалитьФайлы(АудиоПуть); - - IDФайла = Результат["result"]["audio"]["file_id"]; - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); - - ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьДокумент(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Документ = ПараметрыФункции["Document"]; - - ДокументПуть = ПолучитьИмяВременногоФайла("docx"); - КопироватьФайл(Документ, ДокументПуть); - - ДокументДД = Новый ДвоичныеДанные(ДокументПуть); - - Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram"); - - Проверка_ТелеграмДокумент(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)"); - - Проверка_ТелеграмДокумент(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)"); - - Проверка_ТелеграмДокумент(Результат, Текст); - - УдалитьФайлы(ДокументПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьГифку(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Текст = ПараметрыФункции["String"]; - Гифка = ПараметрыФункции["GIF"]; - - ГифкаПуть = ПолучитьИмяВременногоФайла("gif"); - КопироватьФайл(Гифка, ГифкаПуть); - - ГифкаДД = Новый ДвоичныеДанные(ГифкаПуть); - - Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram"); - - Проверка_ТелеграмГифка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)"); - - Проверка_ТелеграмГифка(Результат, Текст); // SKIP - - Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)"); - - Проверка_ТелеграмГифка(Результат, Текст); - - УдалитьФайлы(ГифкаПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - Текст = ПараметрыФункции["String"]; - Картинка = ПараметрыФункции["Picture"]; - Видео = ПараметрыФункции["Video"]; - - КартинкаПуть = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, КартинкаПуть); - - ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); - КопироватьФайл(Видео, ВидеоПуть); - - ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); - - Медиагруппа = Новый Соответствие; - Медиагруппа.Вставить(КартинкаПуть, "photo"); - Медиагруппа.Вставить(ВидеоДД , "video"); - - Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram"); - - Проверка_ТелеграмМедиагруппа(Результат); - - УдалитьФайлы(ВидеоПуть); - УдалитьФайлы(КартинкаПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Ширина = ПараметрыФункции["Lat"]; - Долгота = ПараметрыФункции["Long"]; - - Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram"); - - Проверка_ТелеграмМестоположение(Результат); // SKIP - - Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)"); - - Проверка_ТелеграмМестоположение(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Имя = ПараметрыФункции["Name"]; - Фамилия = ПараметрыФункции["Surname"]; - Телефон = ПараметрыФункции["Phone"]; - - Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram"); - - Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP - OPI_Инструменты.Пауза(20); // SKIP - - Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)"); - - Проверка_ТелеграмКонтакт(Результат, Имя); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОтправитьОпрос(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Вопрос = "Какой ваш любимый цвет?"; - - МассивОтветов = Новый Массив; - МассивОтветов.Добавить("Красный"); - МассивОтветов.Добавить("Желтый"); - МассивОтветов.Добавить("Зеленый"); - МассивОтветов.Добавить("Синий"); - - Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram"); - - Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP - - Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)"); - - Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP - - // END - - СтрочныйМассив = "['Красный', 'Желтый','Зеленый' ,'Синий']"; - - Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)"); - - Проверка_ТелеграмОпрос(Результат, Вопрос); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СкачатьФайл(ПараметрыФункции) - - IDФайла = ПараметрыФункции["Telegram_FileID"]; - Токен = ПараметрыФункции["Telegram_Token"]; - - Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); - -КонецПроцедуры - -Процедура Telegram_ПереслатьСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDЧата = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; - - Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram"); - - Проверка_ТелеграмПереслать(Результат, IDСообщения); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_Бан(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDПользователя = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - - Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram"); - - Проверка_ТелеграмБан(Результат); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_Разбан(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDПользователя = ПараметрыФункции["Telegram_ChatID"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - - Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram"); - - Проверка_ТелеграмБан(Результат); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - Сутки = 86400; - ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); - - Заголовок = "Ссылка " + Строка(ТекущаяДата); - Истечение = ТекущаяДата + Сутки; - UnixИстечение = OPI_Инструменты.UNIXTime(Истечение); - - Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram"); - - Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; - - Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; - - Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - IDКанала = ПараметрыФункции["Telegram_ChannelID"]; - - Результат = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram"); - - Проверка_ТелеграмЧисло(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Иконка = "5357419403325481346"; - Имя = "Тестовая тема " + Строка(Новый УникальныйИдентификатор); - - Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram"); - - Тема = Результат["result"]["message_thread_id"]; - - ПараметрыФункции.Вставить("Telegram_TopicID", Тема); - OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]); - - Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка); - - ЧатТема = Чат + "*" + Тема; - Текст = ПараметрыФункции["String"]; - Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)"); - - Проверка_ТелеграмСообщение(Результат, Текст); - -КонецПроцедуры - -Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - НовоеИмя = "Новый тестовый заголовок"; - НовяИконка = "5310132165583840589"; - - Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP - - Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)"); - - Проверка_ТелеграмИстина(Результат); // SKIP - - Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(25); - -КонецПроцедуры - -Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)"); - - Проверка_ТелеграмИстина(Результат); // SKIP - - Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(25); - -КонецПроцедуры - -Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(25); - -КонецПроцедуры - -Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - Тема = ПараметрыФункции["Telegram_TopicID"]; - - Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)"); - - Проверка_ТелеграмИстина(Результат); // SKIP - - Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - - Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции) - - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - - Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции) - - Заголовок = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор); - Токен = ПараметрыФункции["Telegram_Token"]; - Чат = ПараметрыФункции["Telegram_ForumID"]; - - Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram"); - - Проверка_ТелеграмИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -#КонецОбласти - -#Область VK - -Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции) - - Приложение = ПараметрыФункции["VK_AppID"]; - Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьПост(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Текст = "Пост из автотеста"; - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные - Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные - - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка2, ИВФ); - - МассивКартинок = Новый Массив; - МассивКартинок.Добавить(Картинка); - МассивКартинок.Добавить(ИВФ); - - Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK"); - - Проверка_ВКПост(Результат); // SKIP - ИДПоста = Результат["response"]["post_id"]; // SKIP - Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP - - Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)"); - - Проверка_ВКПост(Результат); - - ИДПоста = Результат["response"]["post_id"]; - Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); - - OPI_Инструменты.Пауза(5); - - Результат = OPI_VK.СоздатьПост(Текст, ИВФ , Истина, URL, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)"); - - Проверка_ВКПост(Результат); - - ИДПоста = Результат["response"]["post_id"]; - OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]); - - УдалитьФайлы(ИВФ); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_УдалитьПост(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДПоста = ПараметрыФункции["VK_PostID"]; - - Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK"); - - Проверка_ВКИстина(Результат); - -КонецПроцедуры - -Процедура VK_СоздатьСоставнойПост(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Текст = "Пост из автотеста"; - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные - Видео = ПараметрыФункции["Video"]; // URL, Путь или Двоичные данные - - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, ИВФ); - - ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0]; - ЗагрузкаВидео = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры); - - ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]); - ВладелецВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]); - - IDКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]); - IDВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]); - - МассивВложений = Новый Массив; - МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки); - МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео); - - Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK"); - - Проверка_ВКПост(Результат); - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьОпрос() - - Параметры = ПолучитьПараметрыВК(); - Вопрос = "Какой ваш любимый цвет?"; - - МассивВариантов = Новый Массив; - МассивВариантов.Добавить("Красный"); - МассивВариантов.Добавить("Желтый"); - МассивВариантов.Добавить("Зеленый"); - - Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK"); - - Проверка_ВКПост(Результат); - - ИДПоста = Результат["response"]["post_id"]; - OPI_VK.УдалитьПост(ИДПоста, Параметры); - - OPI_Инструменты.Пауза(10); - -КонецПроцедуры - -Процедура VK_СоздатьАльбом(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Имя = "Альбом из автотеста"; - Описание = "Новый альбом из автотеста"; - - Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK"); - - Проверка_ВКАльбом(Результат, Описание); - - ИДАльбома = Результат["response"]["id"]; - ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома); - -КонецПроцедуры - -Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ОписаниеКартинки = "Картинка автотест"; - ИДАльбома = ПараметрыФункции["VK_AlbumID"]; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, ИВФ); - - Картинка = Новый ДвоичныеДанные(ИВФ); - - Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK"); - - Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP - - ИДКартинки = Результат["response"][0]["id"]; // SKIP - Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); // SKIP - - Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)"); - - Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP - - ИДКартинки = Результат["response"][0]["id"]; - ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки); - - УдалитьФайлы(ИВФ); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_УдалитьКартинку(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДКартинки = ПараметрыФункции["VK_PictureID"]; - - Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_УдалитьАльбом(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДАльбома = ПараметрыФункции["VK_AlbumID"]; - - Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьИсторию(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - URL = "https://github.com/Bayselonarrend/OpenIntegrations"; - - Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные - ИВФ = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, ИВФ); - Картинка = Новый ДвоичныеДанные(ИВФ); - - Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK"); - - Проверка_ВКИстория(Результат); // SKIP - - Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)"); - - Проверка_ВКИстория(Результат); - - УдалитьФайлы(ИВФ); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_СоздатьОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - Название = "Обсуждаем: какой цвет лучше?"; - Сообщение = "Красный, желтый, синий или какой-то другой?"; - - Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK"); - - Проверка_ВКОбсуждение(Результат); - - ИДОбсуждения = Результат["response"]; - ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; - Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_ОткрытьОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; - Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK"); - - Проверка_ВКИстина(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура VK_НаписатьВОбсуждение(ПараметрыФункции) - - Параметры = ПолучитьПараметрыВК(); - ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; - Сообщение = "Мне больше нравится желтый"; - - Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK"); - - Проверка_ВКОбсуждение(Результат); - -КонецПроцедуры - -#КонецОбласти - -#Область Dropbox - -Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции) - - КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; - Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox"); - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка"); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьТокен(ПараметрыФункции) - - КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; - СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; - Код = ПараметрыФункции["Dropbox_Code"]; - - Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен"); - - Токен = Результат["access_token"]; - Рефреш = Результат["refresh_token"]; - - Если ЗначениеЗаполнено(Токен) Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); - КонецЕсли; - - Если ЗначениеЗаполнено(Рефреш) Тогда - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш); - КонецЕсли; - -КонецПроцедуры - -Процедура Dropbox_ОбновитьТокен(ПараметрыФункции) - - КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; - СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; - РефрешТокен = ПараметрыФункции["Dropbox_Refresh"]; - - Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен"); - - Токен = Результат["access_token"]; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено(); - - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции) - - Путь = "/New/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox"); - - Проверка_ДропБоксФайл(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьПревью(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/mydoc.docx"; - - Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox"); - - Проверка_ДвоичныеДанные(Результат, 190834); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции) - - Путь = "/New/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - Картинка = ПараметрыФункции["Picture"]; - - КартинкаПуть = ПолучитьИмяВременногоФайла("png"); - КопироватьФайл(Картинка, КартинкаПуть); - - Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox"); - - Проверка_ДропБоксФайл(Результат, Путь); - УдалитьФайлы(КартинкаПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции) - - Путь = "/New/url_doc.docx"; - Токен = ПараметрыФункции["Dropbox_Token"]; - URL = ПараметрыФункции["Document"]; - - Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox"); - - Проверка_ДропБоксРабота(Результат); - - Работа = Результат["async_job_id"]; - - ПараметрыФункции.Вставить("Dropbox_Job", Работа); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - ИДРаботы = ПараметрыФункции["Dropbox_Job"]; - Статус = "in_progress"; - - Пока Статус = "in_progress" Цикл - - Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы); - Статус = Результат[".tag"]; - - OPI_Инструменты.Пауза(5); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox"); - - КонецЦикла; - - // END - - Проверка_ДропБоксСтатус(Результат); - - Путь = "/New/url_doc.docx"; - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); - - Проверка_ДропБоксМетаданные(Результат, Путь); - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_УдалитьОбъект(ПараметрыФункции) - - Путь = "/New/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_КопироватьОбъект(ПараметрыФункции) - - Оригинал = "/New/pic.png"; - Копия = "/New/pic_copy.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, Копия); - - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия); - Проверка_ДропБоксМетаданные(Результат, Копия); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции) - - ОригиналныйПуть = "/New/pic.png"; - ЦелевойПуть = "/pic.png"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть); - - Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть); - Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_СоздатьПапку(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/Новый каталог"; - - Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox"); - - Проверка_ДропБоксМетаданные(Результат, Путь); - - Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); - Проверка_ДропБоксМетаданные(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_СкачатьФайл(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/pic.png"; - - Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox"); - - Проверка_ДвоичныеДанные(Результат, 2114023); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_СкачатьПапку(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New"; - - Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox"); - - Проверка_ДвоичныеДанные(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции) - - Путь = "/New"; - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox"); - - Проверка_ДропБоксМассив(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/pic.png"; - - Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox"); - - Проверка_ДропБоксМассив(Результат, 1); - - Ревизия = Результат["entries"][0]["rev"]; - - ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции) - - Версия = ПараметрыФункции["Dropbox_FileRevision"]; - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/pic.png"; - - Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox"); - - Проверка_ДропБоксФайл(Результат, Путь); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - - МассивПутей = Новый Массив; - МассивПутей.Добавить("/New/Dogs.mp3"); - МассивПутей.Добавить("/New/mydoc.docx"); - - Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox"); - - Проверка_ДропБоксТеги(Результат, МассивПутей.Количество()); - - Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx"); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)"); - - Проверка_ДропБоксТеги(Результат, 1); - - ЕстьТег = Ложь; - - Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл - Если Тег["tag_text"] = "важное" Тогда - ЕстьТег = Истина; - КонецЕсли; - КонецЦикла; - - OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ДобавитьТег(ПараметрыФункции) - - Тег = "Важное"; - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/mydoc.docx"; - - Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_УдалитьТег(ПараметрыФункции) - - Тег = "Важное"; - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New/mydoc.docx"; - - Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox"); - - Проверка_Пусто(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox"); - - Проверка_ДропбоксАккаунт(Результат); - - Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]); - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)"); - - Проверка_ДропбоксАккаунт(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - - Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox"); - - Проверка_ДропбоксПространство(Результат); - -КонецПроцедуры - -Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Почта = ПараметрыФункции["Dropbox_OtherUser"]; - Файл = ПараметрыФункции["Dropbox_FileID"]; - - Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); - - Проверка_ДропбоксУчастник(Результат, Почта, Ложь); - - Почты = Новый Массив; - Почты.Добавить(Почта); - - Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина); - - Проверка_ДропбоксУчастник(Результат, Почта, Истина); - -КонецПроцедуры - -Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Путь = "/New"; - - Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox"); - - Проверка_ДропБоксПубличнаяПапка(Результат); - - IDПапки = Результат["shared_folder_id"]; - - ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки); - OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Папка = ПараметрыФункции["Dropbox_SharedFolder"]; - - Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка); - ТекущийСтатус = "in_progress"; - IDРаботы = Результат["async_job_id"]; - - Пока ТекущийСтатус = "in_progress" Цикл - Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы); - ТекущийСтатус = Результат[".tag"]; - OPI_Инструменты.Пауза(3); - КонецЦикла; - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox"); - - Проверка_ДропБоксСтатус(Результат); - - OPI_Инструменты.Пауза(5); - -КонецПроцедуры - -Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Почта = ПараметрыФункции["Dropbox_OtherUser"]; - Папка = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id - - Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); - - Проверка_Пусто(Результат); - - Почты = Новый Массив; - Почты.Добавить(Почта); - - Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина); - - Проверка_Пусто(Результат); - -КонецПроцедуры - -Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции) - - Токен = ПараметрыФункции["Dropbox_Token"]; - Файл = ПараметрыФункции["Dropbox_FileID"]; - - Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл); - - // END - - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox"); - - Проверка_Пусто(Результат); - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#КонецОбласти +// Расположение OS: ./OInt/tests/Modules/internal/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 + +// Набор тестов для YAxUnit + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UsingServiceTag-off +// BSLLS:UnusedParameters-off +// BSLLS:DuplicateStringLiteral-off + +// @skip-check undefined-variable +// @skip-check wrong-string-literal-content + +// Раскомментировать, если выполняется OneScript +#Использовать oint +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +// Для YaxUnit + +Процедура ИсполняемыеСценарии() Экспорт + + OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс(); + +КонецПроцедуры + +// Для Asserts + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс(); + +КонецФункции + +#Область ЗапускаемыеТесты + +#Область Telegram + +Процедура Телеграм_ПолучитьИнформациюБота() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + + Telegram_ПолучитьИнформациюБота(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПолучитьОбновления() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + + Telegram_УдалитьWebhook(ПараметрыТеста); + Telegram_ПолучитьОбновления(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_УстановитьWebhook() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL" , ПараметрыТеста); + + Telegram_УстановитьWebhook(ПараметрыТеста); + Telegram_УдалитьWebhook(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + + Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьКартинку() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + + Telegram_ОтправитьКартинку(ПараметрыТеста); + Telegram_СкачатьФайл(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьВидео() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); + + Telegram_ОтправитьВидео(ПараметрыТеста); + Telegram_СкачатьФайл(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьАудио() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio" , ПараметрыТеста); + + Telegram_ОтправитьАудио(ПараметрыТеста); + Telegram_СкачатьФайл(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьДокумент() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document" , ПараметрыТеста); + + Telegram_ОтправитьДокумент(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьГифку() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF" , ПараметрыТеста); + + Telegram_ОтправитьГифку(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьМедиагруппу() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); + + Telegram_ОтправитьМеидагруппу(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьМестоположение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat" , ПараметрыТеста); + + Telegram_ОтправитьМестоположение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьКонтакт() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone" , ПараметрыТеста); + + Telegram_ОтправитьКонтакт(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ОтправитьОпрос() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + + Telegram_ОтправитьОпрос(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПереслатьСообщение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); + + Telegram_ПереслатьСообщение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_БанРазбан() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); + + Telegram_Бан(ПараметрыТеста); + Telegram_Разбан(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + + Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста); + + Telegram_ЗакрепитьСообщение(ПараметрыТеста); + Telegram_ОткрепитьСообщение(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста); + + Telegram_ПолучитьЧислоУчастников(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста); + + Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста); + + Telegram_СоздатьТемуФорума(ПараметрыТеста); + Telegram_ИзменитьТемуФорума(ПараметрыТеста); + Telegram_ЗакрытьТемуФорума(ПараметрыТеста); + Telegram_ОткрытьТемуФорума(ПараметрыТеста); + Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста); + Telegram_УдалитьТемуФорума(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); + + Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста); + Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста); + +КонецПроцедуры + +Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста); + + Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста); + +КонецПроцедуры + +#КонецОбласти + +#Область VK + +Процедура ВК_СоздатьСсылкуТокена() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста); + + VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьУдалитьПост() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста); + + VK_СоздатьПост(ПараметрыТеста); + VK_УдалитьПост(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьСоставнойПост() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста); + + VK_СоздатьСоставнойПост(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьОпрос() Экспорт + + VK_СоздатьОпрос(); + +КонецПроцедуры + +Процедура ВК_СохранитьУдалитьКартинку() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + + VK_СоздатьАльбом(ПараметрыТеста); + VK_СохранитьКартинкуВАльбом(ПараметрыТеста); + VK_УдалитьКартинку(ПараметрыТеста); + VK_УдалитьАльбом(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_СоздатьИсторию() Экспорт + + ПараметрыТеста = Новый Соответствие; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + + VK_СоздатьИсторию(ПараметрыТеста); + +КонецПроцедуры + +Процедура ВК_МетодыОбсуждений() Экспорт + + ПараметрыТеста = Новый Структура; + Параметры = ПолучитьПараметрыВК(); + + VK_СоздатьОбсуждение(ПараметрыТеста); + VK_ЗакрытьОбсуждение(ПараметрыТеста); + VK_ОткрытьОбсуждение(ПараметрыТеста); + VK_НаписатьВОбсуждение(ПараметрыТеста); + + OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ЛайкРепостКоммент() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Текст = "Пост из автотеста"; + Сообщение = "Сообщение из автотеста"; + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + Response = "response"; + + Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры); + + ИДПоста = Результат[Response]["post_id"]; + Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено(); + + ВнешнийПост = 2571; + ВнешняяСтена = -218704372; + + Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1); + + Результат = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + OPI_VK.УдалитьПост(ИДПоста, Параметры); + OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСтатистику() Экспорт + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + Параметры = ПолучитьПараметрыВК(); + Дата0 = НачалоДня(ТекущаяДата); + Дата1 = КонецДня(Дата0); + ТипСоответствие = Тип("Соответствие"); + + Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСтатистикуПостов() Экспорт + + Параметры = ПолучитьПараметрыВК(); + + МассивПостов = Новый Массив; + МассивПостов.Добавить(214); + МассивПостов.Добавить(215); + + Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_СоздатьРекламнуюКампанию() Экспорт + + Параметры = ПолучитьПараметрыВК(); + ИДКабинета = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID"); + Наименование = "Тестовая кампания"; + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + Response = "response"; + UID = "id"; + + Результат = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию"); + + Результат = Результат[Response][0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДКампании = Результат[UID]; + ИДКатегории = 126; + Лимит = 150; + + Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры); + ИДПоста = Результат[Response]["post_id"]; + + Результат = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании + , Лимит + , ИДКатегории + , ИДПоста + , ИДКабинета + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление"); + + Результат = Результат[Response][0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДОбъявления = Результат[UID]; + Результат = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление"); + + Результат = Результат[Response][0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено(); + + OPI_VK.УдалитьПост(ИДПоста, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ОтправитьСообщение() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID"); + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken"); + Текст = "Сообщение из автотеста"; + + МассивКнопок = Новый Массив; + МассивКнопок.Добавить("Кнопка 1"); + МассивКнопок.Добавить("Кнопка 2"); + + Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок); + Результат = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьКатегорииТоваров() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Соответствие") + .Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_СоздатьТоварПодборку() Экспорт + + Параметры = ПолучитьПараметрыВК(); + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + Response = "response"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" + , Картинка + , Истина + , Ложь + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДПодборки = Результат[Response]["market_album_id"]; + + Результат = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1); + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture")); + МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2")); + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Тестовый товар"); + Товар.Вставить("Описание" , "Описание товара"); + Товар.Вставить("Категория" , "20173"); + Товар.Вставить("Цена" , 1); + Товар.Вставить("СтараяЦена" , 15); + Товар.Вставить("ОсновноеФото" , Картинка); + Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Товар.Вставить("ДополнительныеФото" , МассивКартинок); + Товар.Вставить("ГлавныйВГруппе" , Истина); + Товар.Вставить("Ширина" , 20); + Товар.Вставить("Высота" , 30); + Товар.Вставить("Глубина" , 40); + Товар.Вставить("Вес" , 100); + Товар.Вставить("SKU" , "12345"); + Товар.Вставить("ДоступныйОстаток" , "10"); + + Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры); // Добавление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДТовара = Результат[Response]["market_item_id"]; + + Товар = Новый Соответствие; + Товар.Вставить("Имя", "Тестовый товар измененный"); + + Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры); // Изменение товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар"); + + Проверка_ВКИстина(Результат); + + Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры); // Добавление в подборку + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено(); + + Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры); // Удаляет из подборки + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Результат); + + Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры); // Удаление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Результат); + + Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); // Уадление подборки + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Результат); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_СоздатьТоварСоСвойствами() Экспорт + + Параметры = ПолучитьПараметрыВК(); + ТипСоответствие = Тип("Соответствие"); + ТипЧисло = Тип("Число"); + MII = "market_item_id"; + Response = "response"; + Желтый = "Желтый"; + Красный = "Красный"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + МассивВариантов = Новый Массив; + МассивВариантов.Добавить(Желтый); + МассивВариантов.Добавить("Синий"); + МассивВариантов.Добавить(Красный); + + Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара"); + + OPI_Инструменты.Пауза(5); + + Свойство = Результат[Response]["property_id"]; + Свойство = OPI_Инструменты.ЧислоВСтроку(Свойство); + + СоответствиеСвойств = Новый Соответствие; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара"); + + OPI_Инструменты.Пауза(5); + + Проверка_ВКИстина(Результат); + + Для Каждого Вариант Из МассивВариантов Цикл + + Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + ИДВарианта = Результат[Response]["variant_id"]; + СоответствиеСвойств.Вставить(Вариант, ИДВарианта); + + Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор()) + , Свойство + , ИДВарианта + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара"); + + Проверка_ВКИстина(Результат); + + КонецЦикла; + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(ИВФ); + МассивКартинок.Добавить(Картинка); + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Тестовый товар (" + Желтый + ")"); + Товар.Вставить("Описание" , "Описание товара"); + Товар.Вставить("Категория" , "20173"); + Товар.Вставить("Цена" , 1); + Товар.Вставить("СтараяЦена" , 15); + Товар.Вставить("ОсновноеФото" , Картинка); + Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Товар.Вставить("ДополнительныеФото" , МассивКартинок); + Товар.Вставить("ГлавныйВГруппе" , Истина); + Товар.Вставить("НомерГруппы" , Неопределено); + Товар.Вставить("Ширина" , 20); + Товар.Вставить("Высота" , 30); + Товар.Вставить("Глубина" , 40); + Товар.Вставить("Вес" , 100); + Товар.Вставить("SKU" , 12345); + Товар.Вставить("ДоступныйОстаток" , "10"); + Товар.Вставить("ЗначенияСвойств" , СоответствиеСвойств[Желтый]); + + Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); + + OPI_Инструменты.Пауза(5); + + ИДЖелтого = Результат[Response]["market_item_id"]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); + + Товар.Вставить("Имя" , "Тестовый товар (" + Красный + ")"); + Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]); + + Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар"); + + OPI_Инструменты.Пауза(5); + + ИДКрасного = Результат[Response][MII]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено(); + + МассивТоваров = Новый Массив; + МассивТоваров.Добавить(ИДЖелтого); + МассивТоваров.Добавить(ИДКрасного); + + Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2); + + Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено(); + + OPI_VK.УдалитьТовар(ИДЖелтого , Параметры); + OPI_VK.УдалитьТовар(ИДКрасного, Параметры); + + Для Каждого Вариант Из СоответствиеСвойств Цикл + + Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара"); + + OPI_Инструменты.Пауза(5); + Проверка_ВКИстина(Удаление); + + КонецЦикла; + + Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара"); + + OPI_Инструменты.Пауза(5); + + Проверка_ВКИстина(Удаление); + + УдалитьФайлы(ИВФ); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокТоваров() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(Картинка); + + Товар = Новый Соответствие(); + Товар.Вставить("Имя" , "Тестовый товар 2"); + Товар.Вставить("Описание" , "Описание товара"); + Товар.Вставить("Категория" , "20173"); + Товар.Вставить("Цена" , 1); + Товар.Вставить("СтараяЦена" , 15); + Товар.Вставить("ОсновноеФото" , Картинка); + Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations"); + Товар.Вставить("ДополнительныеФото" , МассивКартинок); + Товар.Вставить("ГлавныйВГруппе" , Истина); + Товар.Вставить("НомерГруппы" , Неопределено); + Товар.Вставить("Ширина" , 20); + Товар.Вставить("Высота" , 30); + Товар.Вставить("Глубина" , 40); + Товар.Вставить("Вес" , 100); + Товар.Вставить("SKU" , 12345); + Товар.Вставить("ДоступныйОстаток" , "10"); + + Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); + ИДТовара = Результат["response"]["market_item_id"]; + OPI_Инструменты.Пауза(5); + + Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_VK.УдалитьТовар(ИДТовара, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокПодборок() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка" + , Картинка + , Истина + , Ложь + , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров"); + + ИДПодборки = Результат["response"]["market_album_id"]; + Результат = OPI_VK.ПолучитьСписокПодборок(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокСвойств() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Результат = OPI_VK.ПолучитьСписокСвойств(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ПолучитьСписокЗаказов() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Результат = OPI_VK.ПолучитьСписокЗаказов(Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ВК_ЗагрузитьВидео() Экспорт + + Параметры = ПолучитьПараметрыВК(); + Видео = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video"); + Наименование = "Новое видео"; + Описание = "Описание видео"; + + Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область YandexDisk + +Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Соответствие = "Соответствие"; + + Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_СоздатьПапку() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор); + + Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь); + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + Проверка_Пусто(Результат); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); + + Проверка_Пусто(Результат); + + Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + Проверка_Пусто(Результат); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); + + Проверка_Пусто(Результат); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/" + + "OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); + + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); + OPI_Инструменты.Пауза(5); + + Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); + + URL = Результат["href"]; + + Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено(); + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + +КонецПроцедуры + +Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Количество = 2; + Отступ = 1; + + Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ПереместитьОбъект() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/" + + "OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL); + OPI_Инструменты.Пауза(15); + + Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии); + + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь); + OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт + + PUrl = "public_url"; + Соответствие = "Соответствие"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png"; + URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png"; + + OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL); + OPI_Инструменты.Пауза(5); + + МассивРезультатов = Новый Массив; + + МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь)); + ПубличныйURL = МассивРезультатов[0][PUrl]; + + Результат = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено(); + + Результат = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/"); + + МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL)); + + МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь)); + + Счетчик = 0; + Для Каждого Результат Из МассивРезультатов Цикл + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено(); + + Если Счетчик = 0 Тогда + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено(); + Иначе + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено"); + КонецЕсли; + + Счетчик = Счетчик + 1; + + КонецЦикла; + + OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token"); + Количество = 2; + Отступ = 1; + + Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область Viber + +Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале"); + + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + Результат = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено(); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Результат = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив"); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт + + Текст = "Тестовое сообщение"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + МассивКнопок = Новый Массив; + МассивКнопок.Добавить("Кнопка 1"); + МассивКнопок.Добавить("Кнопка 2"); + МассивКнопок.Добавить("Кнопка 3"); + + Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок); + + Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьКартинку() Экспорт + + Текст = "Тестовое сообщение"; + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьФайл() Экспорт + + Документ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьКонтакт() Экспорт + + Имя = "Петр Петров"; + Телефон = "+123456789"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьЛокацию() Экспорт + + Широта = "48.87373649724122"; + Долгота = "2.2954639195323967"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Вайбер_ОтправитьСсылку() Экспорт + + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); + ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID"); + Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID"); + + Результат = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + Результат = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено(); + Проверка_ВайберОк(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleWorkspace + +Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт + + ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); + Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Строка") + .Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГВ_ПолучитьТокен() Экспорт + + ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); + ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); + Code = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code"); + + Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code); + + Если ЗначениеЗаполнено(Результат["access_token"]) + И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token" , Результат["access_token"]); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]); + + КонецЕсли; + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГВ_ОбновитьТокен() Экспорт + + ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID"); + ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret"); + RefreshToken = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh"); + + Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleCalendar + +Процедура ГК_ПолучитьСписокКалендарей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) + .ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГК_СоздатьУдалитьКалендарь() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Наименование = "Тестовый календарь"; + Описание = "Тестовое описание"; + НаименованиеИзмененное = Наименование + " (изм.)"; + ТипСоответствие = Тип("Соответствие"); + ТипСтрока = Тип("Строка"); + Summary = "summary"; + Черный = "#000000"; + Желтый = "#ffd800"; + + Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено(); + + Календарь = Результат["id"]; + + Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен + , Календарь + , НаименованиеИзмененное + , Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря"); + + Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); + + Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря"); + + Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); + + Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок"); + + Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание); + + Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); + + Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый); + + Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь"); + + Проверка_Пусто(Результат); + + Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка"); + + Проверка_Пусто(Результат); + + Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГК_СоздатьУдалитьСобытие() Экспорт + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); + Наименование = "Новое событие"; + Описание = "Описание тестового события"; + ОписаниеИзм = "Описание тестового события (изм.)"; + UID = "id"; + Час = 3600; + + Вложения = Новый Соответствие; + + Вложения.Вставить("Картинка1" + , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png"); + Вложения.Вставить("Картинка2" + , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"); + + СоответствиеСобытия = Новый Соответствие; + СоответствиеСобытия.Вставить("Описание" , Описание); + СоответствиеСобытия.Вставить("Заголовок" , Наименование); + СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе"); + СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДата); + СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + Час); + СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения); + СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина); + + Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие"); + + Событие = Результат[UID]; + + Проверка_ГКОбъект(Результат, Наименование, Описание); + + СоответствиеСобытия = Новый Соответствие; + СоответствиеСобытия.Вставить("Описание", ОписаниеИзм); + + Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие"); + + Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); + + Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие"); + + Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); + + Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие"); + + Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм); + + Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГК_ПолучитьСписокСобытий() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID"); + + Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив"); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleDrive + +Процедура ГД_ПолучитьСписокКаталогов() Экспорт + + MimeType = "mimeType"; + Name = "name"; + Имя = "Тестовая папка"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов"); + + Результат = Результат[0]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); + + OPI_Инструменты.Пауза(5); + Идентификатор = Результат["id"]; + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор); + + Результат = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт + + ЛишниеБайты = 2; + + Kind = "kind"; + Content = "content"; + MIME = "MIME"; + MimeType = "mimeType"; + Name = "name"; + Id_ = "id"; + + МассивУдаляемых = Новый Массив; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + КартинкаЗамены = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"); + Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); + + Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); + Описание.Вставить("Родитель", Каталог); + + Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]); + + Идентификатор = Результат[Id_]; + МассивУдаляемых.Добавить(Идентификатор); + + НовоеИмя = "Скопированный файл.jpeg"; + Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект"); + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); + + МассивУдаляемых.Добавить(Результат[Id_]); + + Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты); + OPI_Инструменты.Пауза(5); + + НовоеИмя = "Обновленный файл.jpg"; + Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя); + + OPI_Инструменты.Пауза(5); + + Комментарий = "Yo"; + Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); + + OPI_Инструменты.Пауза(5); + + Для Каждого Удаляемый Из МассивУдаляемых Цикл + Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); + OPI_Инструменты.Пауза(2); + КонецЦикла; + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура ГД_СоздатьУдалитьКомментарий() Экспорт + + Kind = "kind"; + Content = "content"; + Id_ = "id"; + Comments = "comments"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + + Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла(); + Описание.Вставить("Родитель", Каталог); + + Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание); + Идентификатор = Результат[Id_]; + + Комментарий = "Новый комментарий"; + МассивРезультатов = Новый Массив; + Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); + + ИДКомментария = Результат[Id_]; + + МассивРезультатов.Добавить(Результат); + + Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий"); + + МассивРезультатов.Добавить(Результат); + + Результат = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев"); + + Комментарии = Результат[Comments]; + ОбъектКомментарий = Комментарии[Комментарии.ВГраница()]; + + МассивРезультатов.Добавить(ОбъектКомментарий); + + Для Каждого Результат Из МассивРезультатов Цикл + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment"); + КонецЦикла; + + Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); + + OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор); + +КонецПроцедуры + +Процедура ГД_СоздатьКаталог() Экспорт + + Name = "name"; + Имя = "Тестовая папка"; + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog"); + + МассивРезультатов = Новый Массив; + + МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя)); + МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог)); + + Для Каждого Результат Из МассивРезультатов Цикл + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку"); + + ИДКаталога = Результат["id"]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя); + + OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область GoogleSheets + +Процедура ГТ_СоздатьТаблицу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Наименование = "Тестовая таблица"; + + МассивЛистов = Новый Массив; + МассивЛистов.Добавить("Лист1"); + МассивЛистов.Добавить("Лист2"); + + Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); + + Для Н = 0 По МассивЛистов.ВГраница() Цикл + + ИмяЛиста = Результат["sheets"][Н]["properties"]["title"]; + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]); + Лист = Результат["sheets"][Н]["properties"]["sheetId"]; + Лист = OPI_Инструменты.ЧислоВСтроку(Лист); + + КонецЦикла; + + Книга = Результат["spreadsheetId"]; + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet" , Лист); + + Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов); + Книга2 = Результат["spreadsheetId"]; + + Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)"); + + Наименование = "Тестовый лист"; + + Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист"); + + НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"]; + НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + + Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + + Наименование = "Тестовая таблица (изм.)"; + + Результат = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + +КонецПроцедуры + +Процедура ГТ_ПолучитьТаблицу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); + Наименование = "Тестовая таблица (изм.)"; + + Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование); + +КонецПроцедуры + +Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); + Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet"); + Лист = "Лист2"; + + СтруктураЯчеек = Новый Соответствие; + СтруктураЯчеек.Вставить("A1", "Это A1"); + СтруктураЯчеек.Вставить("A2", "Это A2"); + СтруктураЯчеек.Вставить("B2", "Это B2"); + СтруктураЯчеек.Вставить("B3", "Это B3"); + СтруктураЯчеек.Вставить("A3", "Это A3"); + СтруктураЯчеек.Вставить("A4", "Это A4"); + СтруктураЯчеек.Вставить("B1", "Это B1"); + СтруктураЯчеек.Вставить("B4", "Это B4"); + + МассивЯчеек = Новый Массив; + МассивЯчеек.Добавить("B2"); + МассивЯчеек.Добавить("A3"); + МассивЯчеек.Добавить("B4"); + + Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество()); + + Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество()); + + Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + + МассивЯчеек = Новый Массив; + МассивЯчеек.Добавить("B2"); + МассивЯчеек.Добавить("A3"); + МассивЯчеек.Добавить("B4"); + + Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество()); + +КонецПроцедуры + +#КонецОбласти + +#Область Twitter + +Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Твиттер_ОбновитьТокен() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Результат = OPI_Twitter.ОбновитьТокен(Параметры); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено(); + + Рефреш = Результат["refresh_token"]; + Токен = Результат["access_token"]; + + Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш); + КонецЕсли; + + Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token" , Токен); + КонецЕсли; + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + + Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит"); + + Проверка_ТвиттерТекст(Результат, Текст); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); + ИВФ = ПолучитьИмяВременногоФайла("png"); + Картинка.Записать(ИВФ); + + Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСВидео() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + Видео = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video"); + ИВФ = ПолучитьИмяВременногоФайла("mp4"); + Видео.Записать(ИВФ); + + Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); + + Проверка_ТвиттерТекст(Результат, Текст); + + Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео"); + + Проверка_ТвиттерТекст(Результат, Текст); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСГиф() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + Гифка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF"); + ИВФ = ПолучитьИмяВременногоФайла("gif"); + Гифка.Записать(ИВФ); + + Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки"); + + Проверка_ТвиттерТекст(Результат, Текст); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +Процедура Твиттер_СоздатьТвитСОпросом() Экспорт + + Параметры = ПолучитьПараметрыТвиттер(); + Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор); + МассивОтветов = Новый Массив; + МассивОтветов.Добавить("Вариант 1"); + МассивОтветов.Добавить("Вариант 2"); + + Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос"); + + Проверка_ТвиттерТекст(Результат, Текст); + + OPI_Инструменты.Пауза(20); + +КонецПроцедуры + +#КонецОбласти + +#Область Notion + +Процедура Ноушн_СоздатьСтраницу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); + Заголовок = "Тестовый заголовок"; + + Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу"); + + Проверка_НоушнОбъект(Результат); + +КонецПроцедуры + +Процедура Ноушн_СоздатьИзменитьБазу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); + Заголовок = "Тестовый заголовок"; + + Свойства = Новый Соответствие; + Свойства.Вставить("Имя" , "title"); + Свойства.Вставить("Описание" , "rich_text"); + Свойства.Вставить("Номер" , "number"); + Свойства.Вставить("Статус" , "status"); + Свойства.Вставить("Дата создания" , "date"); + Свойства.Вставить("Картинка" , "files"); + Свойства.Вставить("Активен" , "checkbox"); + Свойства.Вставить("Сайт" , "url"); + Свойства.Вставить("Почта" , "email"); + Свойства.Вставить("Телефон" , "phone_number"); + Свойства.Вставить("Пользователь" , "people"); + + ВыборЗначения = Новый Соответствие; + ВыборЗначения.Вставить("Новый", "green"); + ВыборЗначения.Вставить("В работе", "yellow"); + ВыборЗначения.Вставить("Удаленный", "red"); + Свойства.Вставить("Статус", ВыборЗначения); + + Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных"); + + Проверка_НоушнОбъект(Результат, "database"); + + База = Результат["id"]; + Заголовок = "Тестовый заголовок"; + Описание = "Тестовое описание"; + + Свойства = Новый Соответствие; + Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст + Свойства.Вставить("Сайт"); // Поле "Сайт" будет удалено + + Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы"); + + Проверка_НоушнОбъект(Результат, "database"); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); + + Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу"); + + Проверка_НоушнОбъект(Результат); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); + + Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных"); + + Проверка_НоушнОбъект(Результат, "database"); + +КонецПроцедуры + +Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base"); + + Картинка = Новый Соответствие; + Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture")); + + Свойства = Новый Соответствие; + Свойства.Вставить("Имя" , "ООО Вектор"); + Свойства.Вставить("Описание" , "Наш первый клиент"); + Свойства.Вставить("Номер" , 1); + Свойства.Вставить("Статус" , "Обычный"); + Свойства.Вставить("Дата создания" , OPI_Инструменты.ПолучитьТекущуюДату()); + Свойства.Вставить("Картинка" , Картинка); + Свойства.Вставить("Активен" , Истина); + Свойства.Вставить("Сайт" , "https://vector.ru"); + Свойства.Вставить("Почта" , "mail@vector.ru"); + Свойства.Вставить("Телефон" , "88005553535"); + Свойства.Вставить("Статус" , "Новый"); + + Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу"); + + Проверка_НоушнОбъект(Результат); + + Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", ""); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База); + +КонецПроцедуры + +Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page"); + Иконка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"); + Обложка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2"); + Архивировать = Ложь; + + Свойства = Новый Соответствие; + Свойства.Вставить("Активен" , Ложь); + Свойства.Вставить("Почта" , "vector@mail.ru"); + + Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен + , Страница + , Свойства + , Иконка + , Обложка + , Архивировать); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы"); + + Проверка_НоушнОбъект(Результат); + +КонецПроцедуры + +Процедура Ноушн_СоздатьУдалитьБлок() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent"); + Блок = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block"); + + Результат = OPI_Notion.ВернутьБлок(Токен, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок"); + + Проверка_НоушнОбъект(Результат, "block"); + + Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок"); + + Проверка_НоушнОбъект(Результат, "list"); + + Блок = Результат["results"][0]["id"]; + Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки"); + + Проверка_НоушнОбъект(Результат, "list"); + + Результат = OPI_Notion.УдалитьБлок(Токен, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок"); + + Проверка_НоушнОбъект(Результат, "block"); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьПользователей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Результат = OPI_Notion.СписокПользователей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей"); + + Проверка_НоушнОбъект(Результат, "list"); + +КонецПроцедуры + +Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User"); + Результат = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя"); + + Проверка_НоушнОбъект(Результат, "user"); + +КонецПроцедуры + +#КонецОбласти + +#Область Slack + +Процедура Слак_ПолучитьИнформациюОБоте() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено(); + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокПользователей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Результат = OPI_Slack.ПолучитьСписокПользователей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокОбластей() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ОтправитьУдалитьСообщение() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + Текст = "Тестовое сообщение 1"; + Текст2 = "Тестовое сообщение 2"; + Отметки = Новый Массив; + Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст); + + Отметка = Результат["ts"]; + + Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2); + + Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); + + Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено(); + + Проверка_СлакОк(Результат); + + Отметки.Добавить(Отметка); + + МассивБлоков = Новый Массив; + Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); + МассивБлоков.Добавить(Блок); + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + Отметки.Добавить(Результат["ts"]); + + Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); + БлокJSON = OPI_Инструменты.JSONСтрокой(Блок); + + ИВФ = ПолучитьИмяВременногоФайла("json"); + + ТекстовыйДокумент = Новый ТекстовыйДокумент(); + ТекстовыйДокумент.УстановитьТекст(БлокJSON); + ТекстовыйДокумент.Записать(ИВФ); + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + Отметки.Добавить(Результат["ts"]); + + Блоки = "['" + ИВФ + "','" + ИВФ + "']"; + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + Отметки.Добавить(Результат["ts"]); + + УдалитьФайлы(ИВФ); + + Для Каждого Отметка Из Отметки Цикл + + Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено(); + + КонецЦикла; + + Час = 3600; + Сутки = 24; + Отправка = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час); + Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено(); + + Отметка = Результат["scheduled_message_id"]; + Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение"); + + Проверка_СлакОк(Результат); + +КонецПроцедуры + +Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); + Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1"; + Текст = "Тестовое сообщение 1"; + + Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo"); + Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено(); + +КонецПроцедуры + +Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + + Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_СоздатьАрхивироватьКанал() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); + Имя = "testconv" + Строка(Новый УникальныйИдентификатор); + Тема = "Тестовая тема"; + Цель = "Тестовая цель"; + + #Область СоздатьКанал + Результат = OPI_Slack.СоздатьКанал(Токен, Имя); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область УстановитьТемуКанала + Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема); + #КонецОбласти + + #Область УстановитьЦельКанала + Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала"); + + Проверка_СлакОк(Результат); + #КонецОбласти + + #Область ПолучитьКанал + Результат = OPI_Slack.ПолучитьКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область ПригласитьПользователейВКанал + Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область ВыгнатьПользователяИзКанала + Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала"); + + Проверка_СлакОк(Результат); + #КонецОбласти + + #Область ПолучитьИсториюКанала + Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив"); + #КонецОбласти + + #Область ПолучитьСписокПользователейКанала + Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив"); + #КонецОбласти + + #Область ПокинутьКанал + Результат = OPI_Slack.ПокинутьКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал"); + + Проверка_СлакОк(Результат); + #КонецОбласти + + #Область ВступитьВКанал + Результат = OPI_Slack.ВступитьВКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя); + #КонецОбласти + + #Область ПереименоватьКанал + НовоеИмя = "testconv" + Строка(Новый УникальныйИдентификатор); + Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал"); + + Данные = Результат["channel"]; + Канал = Данные["id"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя); + #КонецОбласти + + #Область АрхивироватьКанал + Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал"); + + Проверка_СлакОк(Результат); + #КонецОбласти + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокКаналов() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + + Результат = OPI_Slack.ПолучитьСписокКаналов(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User"); + Текст = "Yo, dude"; + + Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог"); + + Диалог = Результат["channel"]["id"]; + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено(); + + Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение"); + + Проверка_СлакОк(Результат); + + Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог"); + + Проверка_СлакОк(Результат); + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокФайлов() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + + Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + МассивФайлов = Новый Массив; + ИмяФайла = "megadoc.docx"; + Заголовок = "Новый файл"; + + Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + + ЗагруженныйФайл = Результат["files"][0]; + МассивФайлов.Добавить(ЗагруженныйФайл["id"]); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)"); + + ЗагруженныйФайл = Результат["files"][0]; + МассивФайлов.Добавить(ЗагруженныйФайл["id"]); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл"); + + ЗагруженныйФайл = Результат["file"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла); + + Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл + + Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл"); + + Проверка_СлакОк(Результат); + + КонецЦикла; + +КонецПроцедуры + +Процедура Слак_ПолучитьСписокВФ() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + + Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + + Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов"); + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); + Файл = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document"); + Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel"); + Заголовок = "Новый файл"; + + Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл"); + + ЗагруженныйФайл = Результат["file"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); + + Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл"); + + ЗагруженныйФайл = Результат["file"]; + + Проверка_СлакОк(Результат); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок); + + Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); + + Проверка_СлакОк(Результат); + + Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл"); + + Проверка_СлакОк(Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область Airtable + +Процедура АТ_СоздатьБазу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace"); + Наименование = "Тестовая база"; + + МассивПолей = Новый Массив; + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); + + ИмяТаблицы = "Тестовая таблица"; + + СоответствиеТаблиц = Новый Соответствие; + СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей); + + Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы); + + База = Результат["id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База); + + Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив"); + + Результат = OPI_Airtable.ПолучитьСписокБаз(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура АТ_СоздатьТаблицу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + + МассивПолей = Новый Массив; + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты"); + + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка")); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки"); + + ИмяТаблицы = "Тестовая таблица 2"; + Описание = "Новая таблица"; + + Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + + Таблица = Результат["id"]; + ИмяТаблицы = "Тестовая таблица 2 (изм.)"; + Описание = "Новая таблица (изм.)"; + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица); + + Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + +КонецПроцедуры + +Процедура АТ_СоздатьПоле() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); + Имя = Строка(Новый УникальныйИдентификатор); + + Поле = OPI_Airtable.ПолучитьПолеНомера(Имя); + + Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); + + Поле = Результат["id"]; + Имя = Имя + "(изм.)"; + Описание = "Новое описание"; + + Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + +КонецПроцедуры + +Процедура АТ_СоздатьУдалитьЗаписи() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); + + Числовой = 10; + Строчный = "Привет"; + + ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный); + ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный); + + МассивУдаляемых = Новый Массив; + МассивОписаний = Новый Массив; + МассивОписаний.Добавить(ОписаниеСтроки1); + МассивОписаний.Добавить(ОписаниеСтроки2); + + Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2); + + Для Каждого Запись Из Результат["records"] Цикл + МассивУдаляемых.Добавить(Запись["id"]); + КонецЦикла; + + Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)"); + + ОдиночнаяЗапись = Результат["id"]; + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный); + + Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись); + + Текст = "Тестовый комментарий"; + Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); + + Коммент = Результат["id"]; + Текст = "Тестовый комментарий (изм.)"; + Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст); + + Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив"); + + Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент); + + Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); + + Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); + + Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено(); + +КонецПроцедуры + +#КонецОбласти + +#Область Dropbox + +Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста); + + Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста); + + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста); + + Dropbox_ПолучитьТокен(ПараметрыТеста); + + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста); + + Dropbox_ОбновитьТокен(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ЗагрузитьФайл() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста); + + Dropbox_ЗагрузитьФайл(ПараметрыТеста); + Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста); + Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста); + Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста); + Dropbox_ПолучитьПревью(ПараметрыТеста); + Dropbox_СкачатьФайл(ПараметрыТеста); + Dropbox_ПереместитьОбъект(ПараметрыТеста); + Dropbox_КопироватьОбъект(ПараметрыТеста); + Dropbox_УдалитьОбъект(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_СоздатьКаталог() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_СоздатьПапку(ПараметрыТеста); + Dropbox_СкачатьПапку(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста); + + Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста); + Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_СоздатьУдалитьТег() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_ДобавитьТег(ПараметрыТеста); + Dropbox_ПолчитьСписокТегов(ПараметрыТеста); + Dropbox_УдалитьТег(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_ПолучитьАккаунт() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста); + + Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста); + Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста); + +КонецПроцедуры + +Процедура ДропБокс_РаботаСДоступами() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID" , ПараметрыТеста); + + Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста); + Dropbox_ОпубликоватьПапку(ПараметрыТеста); + Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста); + Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста); + Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьПараметрыВК() + + Параметры = Новый Структура; + НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID"); + + Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token")); + Параметры.Вставить("owner_id" , "-" + НомерГруппы); + Параметры.Вставить("app_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID")); + Параметры.Вставить("group_id" , НомерГруппы); + + Возврат Параметры; + +КонецФункции + +Функция ПолучитьПараметрыТвиттер() + + Параметры = Новый Соответствие; + + Параметры.Вставить("redirect_uri" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect")); + Параметры.Вставить("client_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID")); + Параметры.Вставить("client_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret")); + Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token")); + Параметры.Вставить("refresh_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh")); + Параметры.Вставить("oauth_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken")); + Параметры.Вставить("oauth_token_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret")); + + Параметры.Вставить("oauth_consumer_key" + , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey")); + Параметры.Вставить("oauth_consumer_secret" + , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret")); + + Возврат Параметры; + +КонецФункции + +#Область Проверки + +Процедура Проверка_Пусто(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь); +КонецПроцедуры + +Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено) + + МинимальныйРазмер = 500000; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); + + Если Не Размер = Неопределено Тогда + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер); + Иначе + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина); + КонецЕсли; + +КонецПроцедуры + +Процедура Проверка_ТелеграмИстина(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); + +КонецПроцедуры + +Процедура Проверка_ТелеграмИнформацияБота(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмМассив(Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст); + +КонецПроцедуры + +Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст) + + Result = "result"; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмМедиагруппа(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмМестоположение(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя); + +КонецПроцедуры + +Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос); + +КонецПроцедуры + +Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения)); + +КонецПроцедуры + +Процедура Проверка_ТелеграмБан(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение) + + Result = "result"; + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение)); + +КонецПроцедуры + +Процедура Проверка_ТелеграмЧисло(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число"); + +КонецПроцедуры + +Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка); + +КонецПроцедуры + +Процедура Проверка_ВКПост(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ВКИстина(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1); + +КонецПроцедуры + +Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание); + +КонецПроцедуры + +Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома) + + Response = "response"; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома); + +КонецПроцедуры + +Процедура Проверка_ВКИстория(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ВКОбсуждение(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено(); + +КонецПроцедуры + +Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст) + + ТекстОтвета = Результат["data"]["text"]; + ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст)); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст); + +КонецПроцедуры + +Процедура Проверка_ВайберОк(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0); + +КонецПроцедуры + +Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page") + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид); + +КонецПроцедуры + +Процедура Проверка_СлакОк(Знач Результат) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина); + +КонецПроцедуры + +Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь); + +КонецПроцедуры + +Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь); + +КонецПроцедуры + +Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив"); + + Если Не Количество = Неопределено Тогда + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество); + КонецЕсли; + +КонецПроцедуры + +Процедура Проверка_ДропБоксРабота(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено(); +КонецПроцедуры + +Процедура Проверка_ДропБоксСтатус(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete"); +КонецПроцедуры + +Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество) + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество); + +КонецПроцедуры + +Процедура Проверка_ДропбоксАккаунт(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено(); +КонецПроцедуры + +Процедура Проверка_ДропбоксПространство(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено(); +КонецПроцедуры + +Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success"); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта); + OPI_ПолучениеДанныхТестов.ОжидаетЧто( + Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor")); +КонецПроцедуры + +Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат) + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено(); +КонецПроцедуры + +#КонецОбласти + +#Область АтомарныеТесты + +#Область Telegram + +Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.ПолучитьИнформациюБота(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram"); + + Проверка_ТелеграмИнформацияБота(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПолучитьОбновления(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.ПолучитьОбновления(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram"); + + Проверка_ТелеграмМассив(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_УстановитьWebhook(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + URL = ПараметрыФункции["Telegram_URL"]; + + Результат = OPI_Telegram.УстановитьWebhook(Токен, URL); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram"); + + Проверка_ТелеграмУстановкаВебхук(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_УдалитьWebhook(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.УдалитьWebhook(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram"); + + Проверка_ТелеграмУдалениеВебхук(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + + Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram"); + + Проверка_ТелеграмСообщение(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)"); + + Проверка_ТелеграмСообщение(Результат, Текст); + + IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьКартинку(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Картинка = ПараметрыФункции["Picture"]; + + КартинкаПуть = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, КартинкаПуть); + + КартинкаДД = Новый ДвоичныеДанные(КартинкаПуть); + + Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram"); + + Проверка_ТелеграмКартинка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)"); + + Проверка_ТелеграмКартинка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)"); + + Проверка_ТелеграмКартинка(Результат, Текст); + + УдалитьФайлы(КартинкаПуть); + + IDФайла = Результат["result"]["photo"][0]["file_id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); + + ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьВидео(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Видео = ПараметрыФункции["Video"]; + + ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); + КопироватьФайл(Видео, ВидеоПуть); + + ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); + + Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram"); + + Проверка_ТелеграмВидео(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)"); + + Проверка_ТелеграмВидео(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)"); + + Проверка_ТелеграмВидео(Результат, Текст); + + УдалитьФайлы(ВидеоПуть); + + IDФайла = Результат["result"]["video"]["file_id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); + + ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьАудио(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Аудио = ПараметрыФункции["Audio"]; + + АудиоПуть = ПолучитьИмяВременногоФайла("mp3"); + КопироватьФайл(Аудио, АудиоПуть); + + АудиоДД = Новый ДвоичныеДанные(АудиоПуть); + + Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram"); + + Проверка_ТелеграмАудио(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)"); + + Проверка_ТелеграмАудио(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)"); + + Проверка_ТелеграмАудио(Результат, Текст); + + УдалитьФайлы(АудиоПуть); + + IDФайла = Результат["result"]["audio"]["file_id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла); + + ПараметрыФункции.Вставить("Telegram_FileID", IDФайла); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьДокумент(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Документ = ПараметрыФункции["Document"]; + + ДокументПуть = ПолучитьИмяВременногоФайла("docx"); + КопироватьФайл(Документ, ДокументПуть); + + ДокументДД = Новый ДвоичныеДанные(ДокументПуть); + + Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram"); + + Проверка_ТелеграмДокумент(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)"); + + Проверка_ТелеграмДокумент(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)"); + + Проверка_ТелеграмДокумент(Результат, Текст); + + УдалитьФайлы(ДокументПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьГифку(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Текст = ПараметрыФункции["String"]; + Гифка = ПараметрыФункции["GIF"]; + + ГифкаПуть = ПолучитьИмяВременногоФайла("gif"); + КопироватьФайл(Гифка, ГифкаПуть); + + ГифкаДД = Новый ДвоичныеДанные(ГифкаПуть); + + Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram"); + + Проверка_ТелеграмГифка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)"); + + Проверка_ТелеграмГифка(Результат, Текст); // SKIP + + Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)"); + + Проверка_ТелеграмГифка(Результат, Текст); + + УдалитьФайлы(ГифкаПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + Текст = ПараметрыФункции["String"]; + Картинка = ПараметрыФункции["Picture"]; + Видео = ПараметрыФункции["Video"]; + + КартинкаПуть = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, КартинкаПуть); + + ВидеоПуть = ПолучитьИмяВременногоФайла("mp4"); + КопироватьФайл(Видео, ВидеоПуть); + + ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть); + + Медиагруппа = Новый Соответствие; + Медиагруппа.Вставить(КартинкаПуть, "photo"); + Медиагруппа.Вставить(ВидеоДД , "video"); + + Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram"); + + Проверка_ТелеграмМедиагруппа(Результат); + + УдалитьФайлы(ВидеоПуть); + УдалитьФайлы(КартинкаПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Ширина = ПараметрыФункции["Lat"]; + Долгота = ПараметрыФункции["Long"]; + + Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram"); + + Проверка_ТелеграмМестоположение(Результат); // SKIP + + Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)"); + + Проверка_ТелеграмМестоположение(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Имя = ПараметрыФункции["Name"]; + Фамилия = ПараметрыФункции["Surname"]; + Телефон = ПараметрыФункции["Phone"]; + + Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram"); + + Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP + OPI_Инструменты.Пауза(20); // SKIP + + Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)"); + + Проверка_ТелеграмКонтакт(Результат, Имя); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОтправитьОпрос(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Вопрос = "Какой ваш любимый цвет?"; + + МассивОтветов = Новый Массив; + МассивОтветов.Добавить("Красный"); + МассивОтветов.Добавить("Желтый"); + МассивОтветов.Добавить("Зеленый"); + МассивОтветов.Добавить("Синий"); + + Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram"); + + Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP + + Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)"); + + Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP + + // END + + СтрочныйМассив = "['Красный', 'Желтый','Зеленый' ,'Синий']"; + + Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)"); + + Проверка_ТелеграмОпрос(Результат, Вопрос); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СкачатьФайл(ПараметрыФункции) + + IDФайла = ПараметрыФункции["Telegram_FileID"]; + Токен = ПараметрыФункции["Telegram_Token"]; + + Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); + +КонецПроцедуры + +Процедура Telegram_ПереслатьСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDЧата = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; + + Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram"); + + Проверка_ТелеграмПереслать(Результат, IDСообщения); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_Бан(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDПользователя = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + + Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram"); + + Проверка_ТелеграмБан(Результат); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_Разбан(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDПользователя = ПараметрыФункции["Telegram_ChatID"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + + Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram"); + + Проверка_ТелеграмБан(Результат); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + Сутки = 86400; + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + + Заголовок = "Ссылка " + Строка(ТекущаяДата); + Истечение = ТекущаяДата + Сутки; + UnixИстечение = OPI_Инструменты.UNIXTime(Истечение); + + Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram"); + + Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; + + Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"]; + + Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + IDКанала = ПараметрыФункции["Telegram_ChannelID"]; + + Результат = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram"); + + Проверка_ТелеграмЧисло(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Иконка = "5357419403325481346"; + Имя = "Тестовая тема " + Строка(Новый УникальныйИдентификатор); + + Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram"); + + Тема = Результат["result"]["message_thread_id"]; + + ПараметрыФункции.Вставить("Telegram_TopicID", Тема); + OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]); + + Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка); + + ЧатТема = Чат + "*" + Тема; + Текст = ПараметрыФункции["String"]; + Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)"); + + Проверка_ТелеграмСообщение(Результат, Текст); + +КонецПроцедуры + +Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + НовоеИмя = "Новый тестовый заголовок"; + НовяИконка = "5310132165583840589"; + + Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP + + Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)"); + + Проверка_ТелеграмИстина(Результат); // SKIP + + Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(25); + +КонецПроцедуры + +Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)"); + + Проверка_ТелеграмИстина(Результат); // SKIP + + Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(25); + +КонецПроцедуры + +Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(25); + +КонецПроцедуры + +Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + Тема = ПараметрыФункции["Telegram_TopicID"]; + + Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)"); + + Проверка_ТелеграмИстина(Результат); // SKIP + + Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + + Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции) + + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + + Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции) + + Заголовок = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор); + Токен = ПараметрыФункции["Telegram_Token"]; + Чат = ПараметрыФункции["Telegram_ForumID"]; + + Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram"); + + Проверка_ТелеграмИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +#КонецОбласти + +#Область VK + +Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции) + + Приложение = ПараметрыФункции["VK_AppID"]; + Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьПост(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Текст = "Пост из автотеста"; + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные + Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные + + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка2, ИВФ); + + МассивКартинок = Новый Массив; + МассивКартинок.Добавить(Картинка); + МассивКартинок.Добавить(ИВФ); + + Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK"); + + Проверка_ВКПост(Результат); // SKIP + ИДПоста = Результат["response"]["post_id"]; // SKIP + Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP + + Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)"); + + Проверка_ВКПост(Результат); + + ИДПоста = Результат["response"]["post_id"]; + Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); + + OPI_Инструменты.Пауза(5); + + Результат = OPI_VK.СоздатьПост(Текст, ИВФ , Истина, URL, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)"); + + Проверка_ВКПост(Результат); + + ИДПоста = Результат["response"]["post_id"]; + OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]); + + УдалитьФайлы(ИВФ); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_УдалитьПост(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДПоста = ПараметрыФункции["VK_PostID"]; + + Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK"); + + Проверка_ВКИстина(Результат); + +КонецПроцедуры + +Процедура VK_СоздатьСоставнойПост(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Текст = "Пост из автотеста"; + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные + Видео = ПараметрыФункции["Video"]; // URL, Путь или Двоичные данные + + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, ИВФ); + + ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0]; + ЗагрузкаВидео = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры); + + ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]); + ВладелецВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]); + + IDКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]); + IDВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]); + + МассивВложений = Новый Массив; + МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки); + МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео); + + Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK"); + + Проверка_ВКПост(Результат); + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьОпрос() + + Параметры = ПолучитьПараметрыВК(); + Вопрос = "Какой ваш любимый цвет?"; + + МассивВариантов = Новый Массив; + МассивВариантов.Добавить("Красный"); + МассивВариантов.Добавить("Желтый"); + МассивВариантов.Добавить("Зеленый"); + + Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK"); + + Проверка_ВКПост(Результат); + + ИДПоста = Результат["response"]["post_id"]; + OPI_VK.УдалитьПост(ИДПоста, Параметры); + + OPI_Инструменты.Пауза(10); + +КонецПроцедуры + +Процедура VK_СоздатьАльбом(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Имя = "Альбом из автотеста"; + Описание = "Новый альбом из автотеста"; + + Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK"); + + Проверка_ВКАльбом(Результат, Описание); + + ИДАльбома = Результат["response"]["id"]; + ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома); + +КонецПроцедуры + +Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ОписаниеКартинки = "Картинка автотест"; + ИДАльбома = ПараметрыФункции["VK_AlbumID"]; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, ИВФ); + + Картинка = Новый ДвоичныеДанные(ИВФ); + + Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK"); + + Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP + + ИДКартинки = Результат["response"][0]["id"]; // SKIP + Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); // SKIP + + Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)"); + + Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP + + ИДКартинки = Результат["response"][0]["id"]; + ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки); + + УдалитьФайлы(ИВФ); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_УдалитьКартинку(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДКартинки = ПараметрыФункции["VK_PictureID"]; + + Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_УдалитьАльбом(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДАльбома = ПараметрыФункции["VK_AlbumID"]; + + Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьИсторию(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + URL = "https://github.com/Bayselonarrend/OpenIntegrations"; + + Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные + ИВФ = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, ИВФ); + Картинка = Новый ДвоичныеДанные(ИВФ); + + Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK"); + + Проверка_ВКИстория(Результат); // SKIP + + Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)"); + + Проверка_ВКИстория(Результат); + + УдалитьФайлы(ИВФ); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_СоздатьОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + Название = "Обсуждаем: какой цвет лучше?"; + Сообщение = "Красный, желтый, синий или какой-то другой?"; + + Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK"); + + Проверка_ВКОбсуждение(Результат); + + ИДОбсуждения = Результат["response"]; + ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; + Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_ОткрытьОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; + Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK"); + + Проверка_ВКИстина(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура VK_НаписатьВОбсуждение(ПараметрыФункции) + + Параметры = ПолучитьПараметрыВК(); + ИДОбсуждения = ПараметрыФункции["VK_ConvID"]; + Сообщение = "Мне больше нравится желтый"; + + Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK"); + + Проверка_ВКОбсуждение(Результат); + +КонецПроцедуры + +#КонецОбласти + +#Область Dropbox + +Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции) + + КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; + Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка"); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьТокен(ПараметрыФункции) + + КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; + СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; + Код = ПараметрыФункции["Dropbox_Code"]; + + Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен"); + + Токен = Результат["access_token"]; + Рефреш = Результат["refresh_token"]; + + Если ЗначениеЗаполнено(Токен) Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); + КонецЕсли; + + Если ЗначениеЗаполнено(Рефреш) Тогда + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш); + КонецЕсли; + +КонецПроцедуры + +Процедура Dropbox_ОбновитьТокен(ПараметрыФункции) + + КлючПриложения = ПараметрыФункции["Dropbox_Appkey"]; + СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"]; + РефрешТокен = ПараметрыФункции["Dropbox_Refresh"]; + + Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен"); + + Токен = Результат["access_token"]; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено(); + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции) + + Путь = "/New/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox"); + + Проверка_ДропБоксФайл(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьПревью(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/mydoc.docx"; + + Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox"); + + Проверка_ДвоичныеДанные(Результат, 190834); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции) + + Путь = "/New/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + Картинка = ПараметрыФункции["Picture"]; + + КартинкаПуть = ПолучитьИмяВременногоФайла("png"); + КопироватьФайл(Картинка, КартинкаПуть); + + Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox"); + + Проверка_ДропБоксФайл(Результат, Путь); + УдалитьФайлы(КартинкаПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции) + + Путь = "/New/url_doc.docx"; + Токен = ПараметрыФункции["Dropbox_Token"]; + URL = ПараметрыФункции["Document"]; + + Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox"); + + Проверка_ДропБоксРабота(Результат); + + Работа = Результат["async_job_id"]; + + ПараметрыФункции.Вставить("Dropbox_Job", Работа); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + ИДРаботы = ПараметрыФункции["Dropbox_Job"]; + Статус = "in_progress"; + + Пока Статус = "in_progress" Цикл + + Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы); + Статус = Результат[".tag"]; + + OPI_Инструменты.Пауза(5); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox"); + + КонецЦикла; + + // END + + Проверка_ДропБоксСтатус(Результат); + + Путь = "/New/url_doc.docx"; + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); + + Проверка_ДропБоксМетаданные(Результат, Путь); + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_УдалитьОбъект(ПараметрыФункции) + + Путь = "/New/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_КопироватьОбъект(ПараметрыФункции) + + Оригинал = "/New/pic.png"; + Копия = "/New/pic_copy.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, Копия); + + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия); + Проверка_ДропБоксМетаданные(Результат, Копия); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции) + + ОригиналныйПуть = "/New/pic.png"; + ЦелевойПуть = "/pic.png"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть); + + Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть); + Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_СоздатьПапку(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/Новый каталог"; + + Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox"); + + Проверка_ДропБоксМетаданные(Результат, Путь); + + Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь); + Проверка_ДропБоксМетаданные(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_СкачатьФайл(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/pic.png"; + + Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox"); + + Проверка_ДвоичныеДанные(Результат, 2114023); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_СкачатьПапку(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New"; + + Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox"); + + Проверка_ДвоичныеДанные(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции) + + Путь = "/New"; + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox"); + + Проверка_ДропБоксМассив(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/pic.png"; + + Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox"); + + Проверка_ДропБоксМассив(Результат, 1); + + Ревизия = Результат["entries"][0]["rev"]; + + ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции) + + Версия = ПараметрыФункции["Dropbox_FileRevision"]; + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/pic.png"; + + Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox"); + + Проверка_ДропБоксФайл(Результат, Путь); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + + МассивПутей = Новый Массив; + МассивПутей.Добавить("/New/Dogs.mp3"); + МассивПутей.Добавить("/New/mydoc.docx"); + + Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox"); + + Проверка_ДропБоксТеги(Результат, МассивПутей.Количество()); + + Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx"); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)"); + + Проверка_ДропБоксТеги(Результат, 1); + + ЕстьТег = Ложь; + + Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл + Если Тег["tag_text"] = "важное" Тогда + ЕстьТег = Истина; + КонецЕсли; + КонецЦикла; + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ДобавитьТег(ПараметрыФункции) + + Тег = "Важное"; + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/mydoc.docx"; + + Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_УдалитьТег(ПараметрыФункции) + + Тег = "Важное"; + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New/mydoc.docx"; + + Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox"); + + Проверка_Пусто(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox"); + + Проверка_ДропбоксАккаунт(Результат); + + Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)"); + + Проверка_ДропбоксАккаунт(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + + Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox"); + + Проверка_ДропбоксПространство(Результат); + +КонецПроцедуры + +Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Почта = ПараметрыФункции["Dropbox_OtherUser"]; + Файл = ПараметрыФункции["Dropbox_FileID"]; + + Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); + + Проверка_ДропбоксУчастник(Результат, Почта, Ложь); + + Почты = Новый Массив; + Почты.Добавить(Почта); + + Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина); + + Проверка_ДропбоксУчастник(Результат, Почта, Истина); + +КонецПроцедуры + +Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Путь = "/New"; + + Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox"); + + Проверка_ДропБоксПубличнаяПапка(Результат); + + IDПапки = Результат["shared_folder_id"]; + + ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки); + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Папка = ПараметрыФункции["Dropbox_SharedFolder"]; + + Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка); + ТекущийСтатус = "in_progress"; + IDРаботы = Результат["async_job_id"]; + + Пока ТекущийСтатус = "in_progress" Цикл + Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы); + ТекущийСтатус = Результат[".tag"]; + OPI_Инструменты.Пауза(3); + КонецЦикла; + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox"); + + Проверка_ДропБоксСтатус(Результат); + + OPI_Инструменты.Пауза(5); + +КонецПроцедуры + +Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Почта = ПараметрыФункции["Dropbox_OtherUser"]; + Папка = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id + + Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox"); + + Проверка_Пусто(Результат); + + Почты = Новый Массив; + Почты.Добавить(Почта); + + Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина); + + Проверка_Пусто(Результат); + +КонецПроцедуры + +Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции) + + Токен = ПараметрыФункции["Dropbox_Token"]; + Файл = ПараметрыФункции["Dropbox_FileID"]; + + Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox"); + + Проверка_Пусто(Результат); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/src/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os similarity index 98% rename from ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os rename to src/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os index 5356f23c1e..4f09822b81 100644 --- a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os +++ b/src/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os @@ -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"; + ФайлЛога = Новый Файл(ПутьКФайлу); + + Если Не ФайлЛога.Существует() Тогда + ДокументЛога = Новый ТекстовыйДокумент; + ДокументЛога.УстановитьТекст(Данные); + ДокументЛога.Записать(ПутьКФайлу); + КонецЕсли; + + Исключение + Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки()); + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os b/src/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os similarity index 97% rename from ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os rename to src/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os index 65f918be99..b1917ae7af 100644 --- a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os +++ b/src/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os @@ -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Значение(Тип(Дата), Значение); + КонецЕсли; + + Исключение + ООД = Новый ОписаниеТипов(Дата); + Значение = ООД.ПривестиЗначение(Значение); + КонецПопытки; + +КонецПроцедуры + +Процедура ПолучитьЧисло(Значение) Экспорт + + ОписаниеТипа = Новый ОписаниеТипов("Число"); + Значение = ОписаниеТипа.ПривестиЗначение(Значение); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ЭтоКоллекция(Знач Значение) + + Возврат ТипЗнч(Значение) = Тип("Массив") + Или ТипЗнч(Значение) = Тип("Структура") + Или ТипЗнч(Значение) = Тип("Соответствие"); + +КонецФункции + +Функция ЭтоСимвольное(Знач Значение) + + Возврат ТипЗнч(Значение) = Тип("Строка") + Или ТипЗнч(Значение) = Тип("Число") + Или ТипЗнч(Значение) = Тип("Дата"); + +КонецФункции + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os similarity index 97% rename from ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os rename to src/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os index bc48b37707..541ea150b9 100644 --- a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os +++ b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os @@ -1,1229 +1,1229 @@ -// Расположение 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:Typo-off -// BSLLS:LatinAndCyrillicSymbolInWord-off -// BSLLS:IncorrectLineBreak-off -// BSLLS:UnusedLocalVariable-off -// BSLLS:UsingServiceTag-off -// BSLLS:NumberOfOptionalParams-off - -//@skip-check module-unused-local-variable -//@skip-check method-too-many-params - -#Область СлужебныйПрограммныйИнтерфейс - -#Область HTTPМетоды - -#Область ЗапросыБезТела - -Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт - Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета); -КонецФункции - -Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт - Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета); -КонецФункции - -#КонецОбласти - -#Область ЗапросыСТелом - -Функция Post(Знач URL - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); - -КонецФункции - -Функция Patch(Знач URL - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); - -КонецФункции - -Функция Put(Знач URL - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); - -КонецФункции - -Функция PostBinary(Знач URL - , Знач Тело - , Знач ДопЗаголовки - , Знач ПолныйОтвет = Ложь - , Знач ТипДанных = "application/octet-stream") Экспорт - - Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных); - -КонецФункции - -#КонецОбласти - -#Область ЗапросыMultipart - -Функция PostMultipart(Знач URL - , Знач Параметры = "" - , Знач Файлы = "" - , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -Функция PutMultipart(Знач URL - , Знач Параметры = "" - , Знач Файлы = "" - , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -Функция PostMultipartRelated(Знач URL - , Знач JSON = "" - , Знач Файлы = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -Функция PatchMultipartRelated(Знач URL - , Знач JSON = "" - , Знач Файлы = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) Экспорт - - Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета); - -КонецФункции - -#КонецОбласти - -#Область Прочее - -Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт - - Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда - Возврат; - КонецЕсли; - - ФайлТела = Ответ.ПолучитьИмяФайлаТела(); - - Если Не ФайлТела = Неопределено Тогда - Ответ = ФайлТела; - Возврат; - КонецЕсли; - - GZip = "gzip"; - НужнаРаспаковка = - Ответ.Заголовки.Получить("Content-Encoding") = GZip - Или Ответ.Заголовки.Получить("content-encoding") = GZip; - - Если НужнаРаспаковка Тогда - Ответ = РаспаковатьОтвет(Ответ); - КонецЕсли; - - Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ); - - Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда - - Попытка - Ответ = JsonВСтруктуру(Ответ); - Исключение - Возврат; - КонецПопытки; - - КонецЕсли; - -КонецПроцедуры - -Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт - - Заголовки = Новый Соответствие; - Заголовки.Вставить("Accept-Encoding", "gzip"); - Заголовки.Вставить("Accept" , "*/*"); - Заголовки.Вставить("Connection" , "keep-alive"); - Заголовки.Вставить("Accept-Charset" , "utf-8"); - - Если ЗначениеЗаполнено(ТипДанных) Тогда - Заголовки.Вставить("Content-Type", ТипДанных); - КонецЕсли; - - Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда - - Для Каждого Заголовок Из ДопЗаголовки Цикл - Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); - КонецЦикла; - - КонецЕсли; - - НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки); - - Возврат НовыйЗапрос; - -КонецФункции - -Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт - - Попытка - SSL = Новый ЗащищенноеСоединениеOpenSSL; - Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL); - Исключение - Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000); - КонецПопытки; - -КонецФункции - -#КонецОбласти - -#КонецОбласти - -#Область Служебные - -Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт - - Если Параметры.Количество() = 0 Тогда - Возврат ""; - КонецЕсли; - - СтрокаПараметров = "?"; - - Для Каждого Параметр Из Параметры Цикл - - ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение); - - СтрокаПараметров = СтрокаПараметров - + Параметр.Ключ - + "=" - + ЗначениеПараметра - + "&"; - КонецЦикла; - - СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - - Возврат СтрокаПараметров; - -КонецФункции - -Функция РазбитьURL(Знач URL) Экспорт - - URL = СтрЗаменить(URL, "https://", ""); - URL = СтрЗаменить(URL, "http://", ""); - URL = СтрЗаменить(URL, ":443", ""); - - Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1); - Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1); - - Попытка - SSL = Новый ЗащищенноеСоединениеOpenSSL; - Исключение - Сервер = "https://" + Сервер; - КонецПопытки; - - СтруктураВозврата = Новый Структура; - СтруктураВозврата.Вставить("Сервер", Сервер); - СтруктураВозврата.Вставить("Адрес" , Адрес); - - Возврат СтруктураВозврата; - -КонецФункции - -Функция JsonВСтруктуру(Знач Текст) Экспорт - - Если Не ЗначениеЗаполнено(Текст) Тогда - Возврат ""; - КонецЕсли; - - Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст); - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.УстановитьСтроку(Текст); - - Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); - ЧтениеJSON.Закрыть(); - - Возврат Данные; - -КонецФункции - -Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт - - ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows - , " " - , Истина - , ЭкранированиеСимволовJSON[Экранирование] - , Ложь - , Ложь - , Ложь - , Ложь); - - Попытка - - ЗаписьJSON = Новый ЗаписьJSON; - ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); - - ЗаписатьJSON(ЗаписьJSON, Данные); - Возврат ЗаписьJSON.Закрыть(); - - Исключение - Возврат "НЕ JSON: " + Строка(Данные); - КонецПопытки; - -КонецФункции - -Функция ЧислоВСтроку(Знач Число) Экспорт - Возврат СтрЗаменить(Строка(Число), Символы.НПП, ""); -КонецФункции - -Функция ПрочитатьJSONФайл(Знач Путь) Экспорт - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.ОткрытьФайл(Путь); - Значения = ПрочитатьJSON(ЧтениеJSON); - - ЧтениеJSON.Закрыть(); - - Возврат Значения; - -КонецФункции - -Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт - - СоответствиеВозврата = Новый Соответствие; - КоличествоЧастей = 2; - МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь); - - Для Каждого Параметр Из МассивПараметров Цикл - - МассивКлючЗначение = СтрРазделить(Параметр, "="); - - Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда - СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]); - КонецЕсли; - - КонецЦикла; - - Возврат СоответствиеВозврата; - -КонецФункции - -Функция ПолучитьТекущуюДату() Экспорт - Возврат МестноеВремя(ТекущаяУниверсальнаяДата()); -КонецФункции - -Функция UNIXTime(Знач Дата) Экспорт - - ОТД = Новый ОписаниеТипов("Дата"); - Дата = ОТД.ПривестиЗначение(Дата); - - UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0"); - UNIX = СтрЗаменить(UNIX, ",", ""); - UNIX = Лев(UNIX, 10); - - Возврат UNIX; - -КонецФункции - -Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт - - Целое = 100; - Текущее = Окр(Текущее / Делитель, 2); - Всего = Окр(Всего / Делитель, 2); - Процент = Цел(Текущее / Всего * Целое); - - СтрТекущее = ЧислоВСтроку(Текущее); - СтрВсего = ЧислоВСтроку(Всего); - СтрПроцент = ЧислоВСтроку(Процент); - - Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )"; - - Возврат Информация; - -КонецФункции - -Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт - - Размер = 0; - - Если ТипЗнч(Данные) = Тип("Строка") Тогда - - ФайлНаДиске = Новый Файл(Данные); - - Если ФайлНаДиске.Существует() Тогда - Размер = ФайлНаДиске.Размер(); - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); - Размер = Данные.Размер(); - КонецЕсли; - - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); - Размер = Данные.Размер(); - КонецЕсли; - - Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда - Если Размер < МинимальныйРазмерДляПотока Тогда - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); - КонецЕсли; - Иначе - OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); - КонецЕсли; - - Возврат Размер; - -КонецФункции - -Процедура ЗначениеВМассив(Значение) Экспорт - - Значение_ = Новый Массив; - Значение_.Добавить(Значение); - Значение = Значение_; - -КонецПроцедуры - -Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт - - СоответствиеСимволов = Новый Соответствие; - - Если Разметка = "HTML" Тогда - - СоответствиеСимволов.Вставить("&", "&"); - - ИначеЕсли Разметка = "MarkdownV2" Тогда - - СоответствиеСимволов.Вставить("-", "\-"); - СоответствиеСимволов.Вставить("+", "\+"); - СоответствиеСимволов.Вставить("#", "\#"); - СоответствиеСимволов.Вставить("=", "\="); - СоответствиеСимволов.Вставить("{", "\{"); - СоответствиеСимволов.Вставить("}", "\}"); - СоответствиеСимволов.Вставить(".", "\."); - - Иначе - Возврат; - КонецЕсли; - - Для Каждого СимволМассива Из СоответствиеСимволов Цикл - Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение); - КонецЦикла; - -КонецПроцедуры - -Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт - - ТипКоллекции = ТипЗнч(Коллекция); - ВыходнаяКоллекция = Новый(ТипКоллекции); - - Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда - - УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция); - - ИначеЕсли ТипКоллекции = Тип("Массив") Тогда - - УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция); - - Иначе - - ВыходнаяКоллекция = Коллекция; - - КонецЕсли; - - Коллекция = ВыходнаяКоллекция; - -КонецПроцедуры - -Процедура Пауза(Знач Секунды) Экспорт - - Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды); - Попытка - Соединение.Получить(Новый HTTPЗапрос("")); - Исключение - Возврат; - КонецПопытки; - -КонецПроцедуры - -Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт - - Заполнено = ЗначениеЗаполнено(Значение); - - Если Не Заполнено Тогда - Возврат; - КонецЕсли; - - Если Тип = "Дата" Тогда - OPI_ПреобразованиеТипов.ПолучитьДату(Значение); - Значение = UNIXTime(Значение); - - ИначеЕсли Тип = "Коллекция" Тогда - OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение); - - ИначеЕсли Тип = "Булево" Тогда - OPI_ПреобразованиеТипов.ПолучитьБулево(Значение); - - ИначеЕсли Тип = "СтрокаФайла" Тогда - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина); - - ИначеЕсли Тип = "Массив" Тогда - OPI_ПреобразованиеТипов.ПолучитьМассив(Значение); - - ИначеЕсли Тип = "ДвоичныеДанные" Тогда - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение); - - ИначеЕсли Тип = "Число" Тогда - OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение); - - Иначе - OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); - - КонецЕсли; - - Коллекция.Вставить(Имя, Значение); - -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ВыполнитьЗапросСТелом(Знач URL - , Знач Вид - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач JSON = Истина - , Знач ПолныйОтвет = Ложь - , Знач ФайлОтвета = Неопределено) - - Если Не ЗначениеЗаполнено(Параметры) Тогда - Параметры = Новый Структура; - КонецЕсли; - - ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8"); - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - УстановитьТелоЗапроса(Запрос, Параметры, JSON); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"] - , Вид - , Параметры - , ДопЗаголовки - , JSON - , ПолныйОтвет - , ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ, ПолныйОтвет); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL - , Знач Вид - , Знач Данные - , Знач ДопЗаголовки - , Знач ПолныйОтвет - , Знач ТипДанных) - - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - Запрос.УстановитьТелоИзДвоичныхДанных(Данные); - - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - - Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"] - , Вид - , Данные - , ДопЗаголовки - , ПолныйОтвет - , ТипДанных); - Иначе - ОбработатьОтвет(Ответ, ПолныйОтвет); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросБезТела(Знач URL - , Знач Вид - , Знач Параметры = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) - - Если Не ЗначениеЗаполнено(Параметры) Тогда - Параметры = Новый Структура; - КонецЕсли; - - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры); - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки); - Соединение = СоздатьСоединение(Сервер); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ); - КонецЕсли; - - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросМультипарт(Знач URL - , Знач Вид - , Знач Параметры = "" - , Знач Файлы = "" - , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) - - Если Не ЗначениеЗаполнено(Параметры) Тогда - Параметры = Новый Структура; - КонецЕсли; - - Если Не ЗначениеЗаполнено(Файлы) Тогда - Файлы = Новый Соответствие; - КонецЕсли; - - Переадресация = 300; - Ошибка = 400; - Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); - РазделительСтрок = Символы.ВК + Символы.ПС; - ТипДанных = "multipart/form-data; boundary=" + Boundary; - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - ТелоЗапроса = ПолучитьИмяВременногоФайла(); - ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса - , КодировкаТекста.UTF8 - , ПорядокБайтов.LittleEndian - , "" - , Ложь - , "" - , Ложь); - - ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры); - ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы); - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); - ЗаписьТекста.Закрыть(); - - Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; - - Если ЭтоПереадресация Тогда - Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"] - , Вид - , Параметры - , Файлы - , ТипКонтента - , ДопЗаголовки - , ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ); - КонецЕсли; - - Запрос = Неопределено; - ЗаписьТекста = Неопределено; - - УдалитьФайлы(ТелоЗапроса); - Возврат Ответ; - -КонецФункции - -Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL - , Знач Вид - , Знач JSON = "" - , Знач Файлы = "" - , Знач ДопЗаголовки = "" - , Знач ФайлОтвета = Неопределено) - - Переадресация = 300; - Ошибка = 400; - Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); - РазделительСтрок = Символы.ВК + Символы.ПС; - ТипДанных = "multipart/related; boundary=" + Boundary; - СтруктураURL = РазбитьURL(URL); - Сервер = СтруктураURL["Сервер"]; - Адрес = СтруктураURL["Адрес"]; - - Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); - Соединение = СоздатьСоединение(Сервер); - - ТелоЗапроса = ПолучитьИмяВременногоФайла(); - ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса - , КодировкаТекста.UTF8 - , ПорядокБайтов.LittleEndian - , "" - , Ложь - , "" - , Ложь); - - ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON); - ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы); - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); - ЗаписьТекста.Закрыть(); - - ДобавитьContentLength(Запрос); - - Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); - - Если ЗначениеЗаполнено(ФайлОтвета) Тогда - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); - Иначе - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); - КонецЕсли; - - ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; - - Если ЭтоПереадресация Тогда - Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"] - , Вид - , JSON - , Файлы - , ДопЗаголовки - , ФайлОтвета); - Иначе - ОбработатьОтвет(Ответ); - КонецЕсли; - - Запрос = Неопределено; - ЗаписьТекста = Неопределено; - - УдалитьФайлы(ТелоЗапроса); - Возврат Ответ; - -КонецФункции - -Функция ЭтоПереадресация(Знач Ответ) - - Переадресация = 300; - Ошибка = 400; - - ЭтоПереадресация = Ответ.КодСостояния >= Переадресация - И Ответ.КодСостояния < Ошибка - И ЗначениеЗаполнено(Ответ.Заголовки["Location"]); - - Возврат ЭтоПереадресация; - -КонецФункции - -Функция ПреобразоватьПараметрВСтроку(Знач Значение) - - Если ТипЗнч(Значение) = Тип("Массив") Тогда - Значение = СтрСоединить(Значение, ","); - Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); - Значение = "[" + Значение + "]"; - Иначе - Значение = ЧислоВСтроку(Значение); - Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); - КонецЕсли; - - Возврат Значение; - -КонецФункции - -Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON) - - Коллекция = ТипЗнч(Параметры) = Тип("Структура") - Или ТипЗнч(Параметры) = Тип("Соответствие") - Или ТипЗнч(Параметры) = Тип("Массив"); - - Если JSON Тогда - Данные = JSONСтрокой(Параметры); - ИначеЕсли Не Коллекция Тогда - Данные = Параметры; - Иначе - СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры); - Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); - КонецЕсли; - - Если ТипЗнч(Данные) = Тип("Строка") Тогда - Запрос.УстановитьТелоИзСтроки(Данные); - Иначе - //@skip-check wrong-type-expression - Запрос.УстановитьТелоИзДвоичныхДанных(Данные); - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры) - - РазделительСтрок = Символы.ВК + Символы.ПС; - - Для Каждого Параметр Из Параметры Цикл - - Если Параметр.Значение = Неопределено - Или Параметр.Значение = NULL Тогда - Продолжить; - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """"); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - Если ТипЗнч(Параметр.Значение) = Тип("Строка") - Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда - - ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение); - ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой); - - ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда - - ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false")); - - Иначе - - ЗаписьТекста.Записать(Параметр.Значение); - - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы) - - ТипКонтента = СокрЛП(ТипКонтента); - РазделительСтрок = Символы.ВК + Символы.ПС; - ЗаменаТочки = "___"; - - Для Каждого Файл Из Файлы Цикл - - ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); - - Если ТипКонтента = "image/jpeg" Тогда - ИмяФайлаОтправки = "photo"; - Иначе - ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); - ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1); - ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ, - ЗаменаТочки, ".")); - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" - + ИмяФайлаОтправки - + """; filename=""" - + ПутьФайл - + """"); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - Если ЗначениеЗаполнено(ТипКонтента) Тогда - ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента); - КонецЕсли; - - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы) - - Если Не ЗначениеЗаполнено(Файлы) Тогда - Возврат; - КонецЕсли; - - РазделительСтрок = Символы.ВК + Символы.ПС; - - Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда - Для Каждого Файл Из Файлы Цикл - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные) - - РазмерЧасти = 268435456; - ПрочитанноБайт = 0; - ТекущаяПозиция = 0; - ОбщийРазмер = ДвоичныеДанные.Размер(); - - Пока ПрочитанноБайт < ОбщийРазмер Цикл - - ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные); - ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); - Результат = ЧтениеДанных.Прочитать(РазмерЧасти); - ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); - РазмерТекущих = ТекущиеДанные.Размер(); - - Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда - Прервать; - КонецЕсли; - - ЗаписьДанных.Записать(ТекущиеДанные); - - ОсвободитьОбъект(ТекущиеДанные); - ВыполнитьСборкуМусора(); - - ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих; - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON) - - Если Не ЗначениеЗаполнено(JSON) Тогда - Возврат; - КонецЕсли; - - РазделительСтрок = Символы.ВК + Символы.ПС; - - ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8"); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(JSON); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); - -КонецПроцедуры - -Процедура ДобавитьContentLength(Запрос) - - ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные(); - - Если ЗначениеЗаполнено(ТелоЗапроса) Тогда - - Размер = ТелоЗапроса.Размер(); - Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер)); - - КонецЕсли; - -КонецПроцедуры - -Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция) - - Для Каждого ЭлементКоллекции Из Коллекция Цикл - - Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда - ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция) - - Для Каждого ЭлементКоллекции Из Коллекция Цикл - - Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда - ВыходнаяКоллекция.Добавить(ЭлементКоллекции); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -#Область GZip - -// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT -// Источник: https://github.com/vbondarevsky/Connector - -// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 -// -// Copyright 2017-2023 Vladimir Bondarevskiy -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// -// URL: https://github.com/vbondarevsky/Connector -// e-mail: vbondarevsky@gmail.com -// Версия: 2.4.8 -// -// Требования: платформа 1С версии 8.3.10 и выше - -Функция РаспаковатьОтвет(Ответ) - - Попытка - Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные()); - Исключение - Возврат Ответ; - КонецПопытки; - -КонецФункции - -Функция ПрочитатьGZip(СжатыеДанные) Экспорт - - РазмерПрефиксаGZip = 10; - РазмерПостфиксаGZip = 8; - - РазмерДД = ZipРазмерDD(); - РазмерСДХ = ZipРазмерCDH(); - РазмерЕСД = ZipРазмерEOCD(); - РазмерЛФХ = ZipРазмерLFH(); - - ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные); - ЧтениеДанных.Пропустить(РазмерПрефиксаGZip); - РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip; - - ПотокZip = Новый ПотокВПамяти(РазмерЛФХ - + РазмерСжатыхДанных - + РазмерДД - + РазмерСДХ - + РазмерЕСД); - - ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH()); - ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных); - - ЗаписьДанных.Закрыть(); - ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); - - CRC32 = ЧтениеДанных.ПрочитатьЦелое32(); - РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32(); - ЧтениеДанных.Закрыть(); - - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); - ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных)); - ЗаписьДанных.Закрыть(); - - Возврат ПрочитатьZip(ПотокZip); - -КонецФункции - -Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено) - - Каталог = ПолучитьИмяВременногоФайла(); - ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные); - ИмяФайла = ЧтениеZip.Элементы[0].Имя; - Попытка - ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); - Исключение - // Игнорируем проверку целостности архива, просто читаем результат - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - КонецПопытки; - ЧтениеZip.Закрыть(); - - Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла); - УдалитьФайлы(Каталог); - - Возврат Результат; - -КонецФункции - -Функция ZipРазмерLFH() - - Возврат 34; - -КонецФункции - -Функция ZipРазмерDD() - - Возврат 16; - -КонецФункции - -Функция ZipРазмерCDH() - - Возврат 50; - -КонецФункции - -Функция ZipРазмерEOCD() - - Возврат 22; - -КонецФункции - -Функция ZipLFH() - - // Local file header - Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH()); - Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50 - Буфер.ЗаписатьЦелое16(4, 20); // version - Буфер.ЗаписатьЦелое16(6, 10); // bit flags - Буфер.ЗаписатьЦелое16(8, 8); // compression method - Буфер.ЗаписатьЦелое16(10, 0); // time - Буфер.ЗаписатьЦелое16(12, 0); // date - Буфер.ЗаписатьЦелое32(14, 0); // crc-32 - Буфер.ЗаписатьЦелое32(18, 0); // compressed size - Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size - Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data" - Буфер.ЗаписатьЦелое16(28, 0); // extra field length - Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); - - Возврат Буфер; - -КонецФункции - -Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) - - // Data descriptor - Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD()); - Буфер.ЗаписатьЦелое32(0, 134695760); - Буфер.ЗаписатьЦелое32(4, CRC32); - Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных); - Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных); - - Возврат Буфер; - -КонецФункции - -Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) - - // Central directory header - Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH()); - Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50 - Буфер.ЗаписатьЦелое16(4, 798); // version made by - Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract - Буфер.ЗаписатьЦелое16(8, 10); // bit flags - Буфер.ЗаписатьЦелое16(10, 8); // compression method - Буфер.ЗаписатьЦелое16(12, 0); // time - Буфер.ЗаписатьЦелое16(14, 0); // date - Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32 - Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size - Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size - Буфер.ЗаписатьЦелое16(28, 4); // file name length - Буфер.ЗаписатьЦелое16(30, 0); // extra field length - Буфер.ЗаписатьЦелое16(32, 0); // file comment length - Буфер.ЗаписатьЦелое16(34, 0); // disk number start - Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes - Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes - Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header - Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); - - Возврат Буфер; - -КонецФункции - -Функция ZipEOCD(РазмерСжатыхДанных) - - // End of central directory - РазмерCDH = 50; - Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD()); - Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50 - Буфер.ЗаписатьЦелое16(4, 0); // number of this disk - Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory - Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk - Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory - Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory - // offset of start of central directory with respect to the starting disk number - Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD()); - Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number - - Возврат Буфер; - -КонецФункции - -#КонецОбласти - -#КонецОбласти +// Расположение 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:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UnusedLocalVariable-off +// BSLLS:UsingServiceTag-off +// BSLLS:NumberOfOptionalParams-off + +//@skip-check module-unused-local-variable +//@skip-check method-too-many-params + +#Область СлужебныйПрограммныйИнтерфейс + +#Область HTTPМетоды + +#Область ЗапросыБезТела + +Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт + Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета); +КонецФункции + +Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт + Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета); +КонецФункции + +#КонецОбласти + +#Область ЗапросыСТелом + +Функция Post(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); + +КонецФункции + +Функция Patch(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); + +КонецФункции + +Функция Put(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета); + +КонецФункции + +Функция PostBinary(Знач URL + , Знач Тело + , Знач ДопЗаголовки + , Знач ПолныйОтвет = Ложь + , Знач ТипДанных = "application/octet-stream") Экспорт + + Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных); + +КонецФункции + +#КонецОбласти + +#Область ЗапросыMultipart + +Функция PostMultipart(Знач URL + , Знач Параметры = "" + , Знач Файлы = "" + , Знач ТипКонтента = "image/jpeg" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +Функция PutMultipart(Знач URL + , Знач Параметры = "" + , Знач Файлы = "" + , Знач ТипКонтента = "image/jpeg" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +Функция PostMultipartRelated(Знач URL + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +Функция PatchMultipartRelated(Знач URL + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) Экспорт + + Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета); + +КонецФункции + +#КонецОбласти + +#Область Прочее + +Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт + + Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда + Возврат; + КонецЕсли; + + ФайлТела = Ответ.ПолучитьИмяФайлаТела(); + + Если Не ФайлТела = Неопределено Тогда + Ответ = ФайлТела; + Возврат; + КонецЕсли; + + GZip = "gzip"; + НужнаРаспаковка = + Ответ.Заголовки.Получить("Content-Encoding") = GZip + Или Ответ.Заголовки.Получить("content-encoding") = GZip; + + Если НужнаРаспаковка Тогда + Ответ = РаспаковатьОтвет(Ответ); + КонецЕсли; + + Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ); + + Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда + + Попытка + Ответ = JsonВСтруктуру(Ответ); + Исключение + Возврат; + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Accept-Encoding", "gzip"); + Заголовки.Вставить("Accept" , "*/*"); + Заголовки.Вставить("Connection" , "keep-alive"); + Заголовки.Вставить("Accept-Charset" , "utf-8"); + + Если ЗначениеЗаполнено(ТипДанных) Тогда + Заголовки.Вставить("Content-Type", ТипДанных); + КонецЕсли; + + Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда + + Для Каждого Заголовок Из ДопЗаголовки Цикл + Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение); + КонецЦикла; + + КонецЕсли; + + НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки); + + Возврат НовыйЗапрос; + +КонецФункции + +Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт + + Попытка + SSL = Новый ЗащищенноеСоединениеOpenSSL; + Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL); + Исключение + Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000); + КонецПопытки; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область Служебные + +Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт + + Если Параметры.Количество() = 0 Тогда + Возврат ""; + КонецЕсли; + + СтрокаПараметров = "?"; + + Для Каждого Параметр Из Параметры Цикл + + ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение); + + СтрокаПараметров = СтрокаПараметров + + Параметр.Ключ + + "=" + + ЗначениеПараметра + + "&"; + КонецЦикла; + + СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); + + Возврат СтрокаПараметров; + +КонецФункции + +Функция РазбитьURL(Знач URL) Экспорт + + URL = СтрЗаменить(URL, "https://", ""); + URL = СтрЗаменить(URL, "http://", ""); + URL = СтрЗаменить(URL, ":443", ""); + + Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1); + Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1); + + Попытка + SSL = Новый ЗащищенноеСоединениеOpenSSL; + Исключение + Сервер = "https://" + Сервер; + КонецПопытки; + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Сервер", Сервер); + СтруктураВозврата.Вставить("Адрес" , Адрес); + + Возврат СтруктураВозврата; + +КонецФункции + +Функция JsonВСтруктуру(Знач Текст) Экспорт + + Если Не ЗначениеЗаполнено(Текст) Тогда + Возврат ""; + КонецЕсли; + + Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст); + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Текст); + + Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); + ЧтениеJSON.Закрыть(); + + Возврат Данные; + +КонецФункции + +Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт + + ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows + , " " + , Истина + , ЭкранированиеСимволовJSON[Экранирование] + , Ложь + , Ложь + , Ложь + , Ложь); + + Попытка + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); + + ЗаписатьJSON(ЗаписьJSON, Данные); + Возврат ЗаписьJSON.Закрыть(); + + Исключение + Возврат "НЕ JSON: " + Строка(Данные); + КонецПопытки; + +КонецФункции + +Функция ЧислоВСтроку(Знач Число) Экспорт + Возврат СтрЗаменить(Строка(Число), Символы.НПП, ""); +КонецФункции + +Функция ПрочитатьJSONФайл(Знач Путь) Экспорт + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.ОткрытьФайл(Путь); + Значения = ПрочитатьJSON(ЧтениеJSON); + + ЧтениеJSON.Закрыть(); + + Возврат Значения; + +КонецФункции + +Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт + + СоответствиеВозврата = Новый Соответствие; + КоличествоЧастей = 2; + МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь); + + Для Каждого Параметр Из МассивПараметров Цикл + + МассивКлючЗначение = СтрРазделить(Параметр, "="); + + Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда + СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]); + КонецЕсли; + + КонецЦикла; + + Возврат СоответствиеВозврата; + +КонецФункции + +Функция ПолучитьТекущуюДату() Экспорт + Возврат МестноеВремя(ТекущаяУниверсальнаяДата()); +КонецФункции + +Функция UNIXTime(Знач Дата) Экспорт + + ОТД = Новый ОписаниеТипов("Дата"); + Дата = ОТД.ПривестиЗначение(Дата); + + UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0"); + UNIX = СтрЗаменить(UNIX, ",", ""); + UNIX = Лев(UNIX, 10); + + Возврат UNIX; + +КонецФункции + +Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт + + Целое = 100; + Текущее = Окр(Текущее / Делитель, 2); + Всего = Окр(Всего / Делитель, 2); + Процент = Цел(Текущее / Всего * Целое); + + СтрТекущее = ЧислоВСтроку(Текущее); + СтрВсего = ЧислоВСтроку(Всего); + СтрПроцент = ЧислоВСтроку(Процент); + + Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )"; + + Возврат Информация; + +КонецФункции + +Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт + + Размер = 0; + + Если ТипЗнч(Данные) = Тип("Строка") Тогда + + ФайлНаДиске = Новый Файл(Данные); + + Если ФайлНаДиске.Существует() Тогда + Размер = ФайлНаДиске.Размер(); + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Размер = Данные.Размер(); + КонецЕсли; + + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Размер = Данные.Размер(); + КонецЕсли; + + Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда + Если Размер < МинимальныйРазмерДляПотока Тогда + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); + КонецЕсли; + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); + КонецЕсли; + + Возврат Размер; + +КонецФункции + +Процедура ЗначениеВМассив(Значение) Экспорт + + Значение_ = Новый Массив; + Значение_.Добавить(Значение); + Значение = Значение_; + +КонецПроцедуры + +Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт + + СоответствиеСимволов = Новый Соответствие; + + Если Разметка = "HTML" Тогда + + СоответствиеСимволов.Вставить("&", "&"); + + ИначеЕсли Разметка = "MarkdownV2" Тогда + + СоответствиеСимволов.Вставить("-", "\-"); + СоответствиеСимволов.Вставить("+", "\+"); + СоответствиеСимволов.Вставить("#", "\#"); + СоответствиеСимволов.Вставить("=", "\="); + СоответствиеСимволов.Вставить("{", "\{"); + СоответствиеСимволов.Вставить("}", "\}"); + СоответствиеСимволов.Вставить(".", "\."); + + Иначе + Возврат; + КонецЕсли; + + Для Каждого СимволМассива Из СоответствиеСимволов Цикл + Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение); + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт + + ТипКоллекции = ТипЗнч(Коллекция); + ВыходнаяКоллекция = Новый(ТипКоллекции); + + Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда + + УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция); + + ИначеЕсли ТипКоллекции = Тип("Массив") Тогда + + УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция); + + Иначе + + ВыходнаяКоллекция = Коллекция; + + КонецЕсли; + + Коллекция = ВыходнаяКоллекция; + +КонецПроцедуры + +Процедура Пауза(Знач Секунды) Экспорт + + Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды); + Попытка + Соединение.Получить(Новый HTTPЗапрос("")); + Исключение + Возврат; + КонецПопытки; + +КонецПроцедуры + +Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт + + Заполнено = ЗначениеЗаполнено(Значение); + + Если Не Заполнено Тогда + Возврат; + КонецЕсли; + + Если Тип = "Дата" Тогда + OPI_ПреобразованиеТипов.ПолучитьДату(Значение); + Значение = UNIXTime(Значение); + + ИначеЕсли Тип = "Коллекция" Тогда + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение); + + ИначеЕсли Тип = "Булево" Тогда + OPI_ПреобразованиеТипов.ПолучитьБулево(Значение); + + ИначеЕсли Тип = "СтрокаФайла" Тогда + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина); + + ИначеЕсли Тип = "Массив" Тогда + OPI_ПреобразованиеТипов.ПолучитьМассив(Значение); + + ИначеЕсли Тип = "ДвоичныеДанные" Тогда + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение); + + ИначеЕсли Тип = "Число" Тогда + OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение); + + Иначе + OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение); + + КонецЕсли; + + Коллекция.Вставить(Имя, Значение); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ВыполнитьЗапросСТелом(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = Неопределено) + + Если Не ЗначениеЗаполнено(Параметры) Тогда + Параметры = Новый Структура; + КонецЕсли; + + ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8"); + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + УстановитьТелоЗапроса(Запрос, Параметры, JSON); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + Если ЭтоПереадресация(Ответ) Тогда + Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"] + , Вид + , Параметры + , ДопЗаголовки + , JSON + , ПолныйОтвет + , ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ, ПолныйОтвет); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL + , Знач Вид + , Знач Данные + , Знач ДопЗаголовки + , Знач ПолныйОтвет + , Знач ТипДанных) + + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + Запрос.УстановитьТелоИзДвоичныхДанных(Данные); + + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + + Если ЭтоПереадресация(Ответ) Тогда + Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"] + , Вид + , Данные + , ДопЗаголовки + , ПолныйОтвет + , ТипДанных); + Иначе + ОбработатьОтвет(Ответ, ПолныйОтвет); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросБезТела(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) + + Если Не ЗначениеЗаполнено(Параметры) Тогда + Параметры = Новый Структура; + КонецЕсли; + + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры); + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки); + Соединение = СоздатьСоединение(Сервер); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + Если ЭтоПереадресация(Ответ) Тогда + Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросМультипарт(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач Файлы = "" + , Знач ТипКонтента = "image/jpeg" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) + + Если Не ЗначениеЗаполнено(Параметры) Тогда + Параметры = Новый Структура; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Файлы) Тогда + Файлы = Новый Соответствие; + КонецЕсли; + + Переадресация = 300; + Ошибка = 400; + Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); + РазделительСтрок = Символы.ВК + Символы.ПС; + ТипДанных = "multipart/form-data; boundary=" + Boundary; + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + ТелоЗапроса = ПолучитьИмяВременногоФайла(); + ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса + , КодировкаТекста.UTF8 + , ПорядокБайтов.LittleEndian + , "" + , Ложь + , "" + , Ложь); + + ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры); + ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы); + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); + ЗаписьТекста.Закрыть(); + + Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Если ЭтоПереадресация Тогда + Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"] + , Вид + , Параметры + , Файлы + , ТипКонтента + , ДопЗаголовки + , ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ); + КонецЕсли; + + Запрос = Неопределено; + ЗаписьТекста = Неопределено; + + УдалитьФайлы(ТелоЗапроса); + Возврат Ответ; + +КонецФункции + +Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL + , Знач Вид + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = Неопределено) + + Переадресация = 300; + Ошибка = 400; + Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""); + РазделительСтрок = Символы.ВК + Символы.ПС; + ТипДанных = "multipart/related; boundary=" + Boundary; + СтруктураURL = РазбитьURL(URL); + Сервер = СтруктураURL["Сервер"]; + Адрес = СтруктураURL["Адрес"]; + + Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных); + Соединение = СоздатьСоединение(Сервер); + + ТелоЗапроса = ПолучитьИмяВременногоФайла(); + ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса + , КодировкаТекста.UTF8 + , ПорядокБайтов.LittleEndian + , "" + , Ложь + , "" + , Ложь); + + ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON); + ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы); + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок); + ЗаписьТекста.Закрыть(); + + ДобавитьContentLength(Запрос); + + Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); + + Если ЗначениеЗаполнено(ФайлОтвета) Тогда + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); + Иначе + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + КонецЕсли; + + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; + + Если ЭтоПереадресация Тогда + Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"] + , Вид + , JSON + , Файлы + , ДопЗаголовки + , ФайлОтвета); + Иначе + ОбработатьОтвет(Ответ); + КонецЕсли; + + Запрос = Неопределено; + ЗаписьТекста = Неопределено; + + УдалитьФайлы(ТелоЗапроса); + Возврат Ответ; + +КонецФункции + +Функция ЭтоПереадресация(Знач Ответ) + + Переадресация = 300; + Ошибка = 400; + + ЭтоПереадресация = Ответ.КодСостояния >= Переадресация + И Ответ.КодСостояния < Ошибка + И ЗначениеЗаполнено(Ответ.Заголовки["Location"]); + + Возврат ЭтоПереадресация; + +КонецФункции + +Функция ПреобразоватьПараметрВСтроку(Знач Значение) + + Если ТипЗнч(Значение) = Тип("Массив") Тогда + Значение = СтрСоединить(Значение, ","); + Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); + Значение = "[" + Значение + "]"; + Иначе + Значение = ЧислоВСтроку(Значение); + Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL); + КонецЕсли; + + Возврат Значение; + +КонецФункции + +Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON) + + Коллекция = ТипЗнч(Параметры) = Тип("Структура") + Или ТипЗнч(Параметры) = Тип("Соответствие") + Или ТипЗнч(Параметры) = Тип("Массив"); + + Если JSON Тогда + Данные = JSONСтрокой(Параметры); + ИначеЕсли Не Коллекция Тогда + Данные = Параметры; + Иначе + СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры); + Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1); + КонецЕсли; + + Если ТипЗнч(Данные) = Тип("Строка") Тогда + Запрос.УстановитьТелоИзСтроки(Данные); + Иначе + //@skip-check wrong-type-expression + Запрос.УстановитьТелоИзДвоичныхДанных(Данные); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры) + + РазделительСтрок = Символы.ВК + Символы.ПС; + + Для Каждого Параметр Из Параметры Цикл + + Если Параметр.Значение = Неопределено + Или Параметр.Значение = NULL Тогда + Продолжить; + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """"); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + Если ТипЗнч(Параметр.Значение) = Тип("Строка") + Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда + + ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение); + ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой); + + ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда + + ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false")); + + Иначе + + ЗаписьТекста.Записать(Параметр.Значение); + + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы) + + ТипКонтента = СокрЛП(ТипКонтента); + РазделительСтрок = Символы.ВК + Символы.ПС; + ЗаменаТочки = "___"; + + Для Каждого Файл Из Файлы Цикл + + ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); + + Если ТипКонтента = "image/jpeg" Тогда + ИмяФайлаОтправки = "photo"; + Иначе + ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, "."); + ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1); + ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ, + ЗаменаТочки, ".")); + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + + ИмяФайлаОтправки + + """; filename=""" + + ПутьФайл + + """"); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + Если ЗначениеЗаполнено(ТипКонтента) Тогда + ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента); + КонецЕсли; + + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы) + + Если Не ЗначениеЗаполнено(Файлы) Тогда + Возврат; + КонецЕсли; + + РазделительСтрок = Символы.ВК + Символы.ПС; + + Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда + Для Каждого Файл Из Файлы Цикл + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные) + + РазмерЧасти = 268435456; + ПрочитанноБайт = 0; + ТекущаяПозиция = 0; + ОбщийРазмер = ДвоичныеДанные.Размер(); + + Пока ПрочитанноБайт < ОбщийРазмер Цикл + + ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные); + ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); + Результат = ЧтениеДанных.Прочитать(РазмерЧасти); + ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); + РазмерТекущих = ТекущиеДанные.Размер(); + + Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда + Прервать; + КонецЕсли; + + ЗаписьДанных.Записать(ТекущиеДанные); + + ОсвободитьОбъект(ТекущиеДанные); + ВыполнитьСборкуМусора(); + + ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих; + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON) + + Если Не ЗначениеЗаполнено(JSON) Тогда + Возврат; + КонецЕсли; + + РазделительСтрок = Символы.ВК + Символы.ПС; + + ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8"); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(JSON); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок); + +КонецПроцедуры + +Процедура ДобавитьContentLength(Запрос) + + ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные(); + + Если ЗначениеЗаполнено(ТелоЗапроса) Тогда + + Размер = ТелоЗапроса.Размер(); + Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер)); + + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция) + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда + ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция) + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда + ВыходнаяКоллекция.Добавить(ЭлементКоллекции); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#Область GZip + +// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT +// Источник: https://github.com/vbondarevsky/Connector + +// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 +// +// Copyright 2017-2023 Vladimir Bondarevskiy +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// URL: https://github.com/vbondarevsky/Connector +// e-mail: vbondarevsky@gmail.com +// Версия: 2.4.8 +// +// Требования: платформа 1С версии 8.3.10 и выше + +Функция РаспаковатьОтвет(Ответ) + + Попытка + Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные()); + Исключение + Возврат Ответ; + КонецПопытки; + +КонецФункции + +Функция ПрочитатьGZip(СжатыеДанные) Экспорт + + РазмерПрефиксаGZip = 10; + РазмерПостфиксаGZip = 8; + + РазмерДД = ZipРазмерDD(); + РазмерСДХ = ZipРазмерCDH(); + РазмерЕСД = ZipРазмерEOCD(); + РазмерЛФХ = ZipРазмерLFH(); + + ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные); + ЧтениеДанных.Пропустить(РазмерПрефиксаGZip); + РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip; + + ПотокZip = Новый ПотокВПамяти(РазмерЛФХ + + РазмерСжатыхДанных + + РазмерДД + + РазмерСДХ + + РазмерЕСД); + + ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH()); + ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных); + + ЗаписьДанных.Закрыть(); + ЗаписьДанных = Новый ЗаписьДанных(ПотокZip); + + CRC32 = ЧтениеДанных.ПрочитатьЦелое32(); + РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32(); + ЧтениеДанных.Закрыть(); + + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)); + ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных)); + ЗаписьДанных.Закрыть(); + + Возврат ПрочитатьZip(ПотокZip); + +КонецФункции + +Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено) + + Каталог = ПолучитьИмяВременногоФайла(); + ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные); + ИмяФайла = ЧтениеZip.Элементы[0].Имя; + Попытка + ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + Исключение + // Игнорируем проверку целостности архива, просто читаем результат + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + ЧтениеZip.Закрыть(); + + Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла); + УдалитьФайлы(Каталог); + + Возврат Результат; + +КонецФункции + +Функция ZipРазмерLFH() + + Возврат 34; + +КонецФункции + +Функция ZipРазмерDD() + + Возврат 16; + +КонецФункции + +Функция ZipРазмерCDH() + + Возврат 50; + +КонецФункции + +Функция ZipРазмерEOCD() + + Возврат 22; + +КонецФункции + +Функция ZipLFH() + + // Local file header + Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH()); + Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50 + Буфер.ЗаписатьЦелое16(4, 20); // version + Буфер.ЗаписатьЦелое16(6, 10); // bit flags + Буфер.ЗаписатьЦелое16(8, 8); // compression method + Буфер.ЗаписатьЦелое16(10, 0); // time + Буфер.ЗаписатьЦелое16(12, 0); // date + Буфер.ЗаписатьЦелое32(14, 0); // crc-32 + Буфер.ЗаписатьЦелое32(18, 0); // compressed size + Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size + Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data" + Буфер.ЗаписатьЦелое16(28, 0); // extra field length + Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); + + Возврат Буфер; + +КонецФункции + +Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) + + // Data descriptor + Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD()); + Буфер.ЗаписатьЦелое32(0, 134695760); + Буфер.ЗаписатьЦелое32(4, CRC32); + Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных); + Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных); + + Возврат Буфер; + +КонецФункции + +Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных) + + // Central directory header + Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH()); + Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50 + Буфер.ЗаписатьЦелое16(4, 798); // version made by + Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract + Буфер.ЗаписатьЦелое16(8, 10); // bit flags + Буфер.ЗаписатьЦелое16(10, 8); // compression method + Буфер.ЗаписатьЦелое16(12, 0); // time + Буфер.ЗаписатьЦелое16(14, 0); // date + Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32 + Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size + Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size + Буфер.ЗаписатьЦелое16(28, 4); // file name length + Буфер.ЗаписатьЦелое16(30, 0); // extra field length + Буфер.ЗаписатьЦелое16(32, 0); // file comment length + Буфер.ЗаписатьЦелое16(34, 0); // disk number start + Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes + Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes + Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header + Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь)); + + Возврат Буфер; + +КонецФункции + +Функция ZipEOCD(РазмерСжатыхДанных) + + // End of central directory + РазмерCDH = 50; + Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD()); + Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50 + Буфер.ЗаписатьЦелое16(4, 0); // number of this disk + Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory + Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk + Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory + Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory + // offset of start of central directory with respect to the starting disk number + Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD()); + Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number + + Возврат Буфер; + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os similarity index 97% rename from ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os rename to src/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os index 0c2132b95c..57f73e85f9 100644 --- a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os +++ b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os @@ -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 По Количество Цикл + Части.Добавить(Строка); + КонецЦикла; + + Возврат СтрСоединить(Части, ""); + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/ru/OPI/.project b/src/ru/OPI/.project similarity index 100% rename from ru/OPI/.project rename to src/ru/OPI/.project diff --git a/ru/OPI/.settings/org.eclipse.core.resources.prefs b/src/ru/OPI/.settings/org.eclipse.core.resources.prefs similarity index 100% rename from ru/OPI/.settings/org.eclipse.core.resources.prefs rename to src/ru/OPI/.settings/org.eclipse.core.resources.prefs diff --git a/ru/OPI/DT-INF/PROJECT.PMF b/src/ru/OPI/DT-INF/PROJECT.PMF similarity index 100% rename from ru/OPI/DT-INF/PROJECT.PMF rename to src/ru/OPI/DT-INF/PROJECT.PMF diff --git a/ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo b/src/ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo rename to src/ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo b/src/ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo rename to src/ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo diff --git a/ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo rename to src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo diff --git a/ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo rename to src/ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo diff --git a/ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo rename to src/ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo diff --git a/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo rename to src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Notion/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Notion/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Notion/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Notion/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo b/src/ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo rename to src/ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Slack/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Slack/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Slack/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Slack/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo b/src/ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo rename to src/ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo b/src/ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo rename to src/ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo b/src/ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo rename to src/ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo diff --git a/ru/OPI/src/CommonModules/OPI_VK/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_VK/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_VK/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_VK/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo b/src/ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo rename to src/ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Viber/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Viber/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Viber/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Viber/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo b/src/ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo rename to src/ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo diff --git a/ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo b/src/ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo rename to src/ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo diff --git a/ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo b/src/ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo rename to src/ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo b/src/ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo rename to src/ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo b/src/ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo rename to src/ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo diff --git a/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo rename to src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo diff --git a/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo b/src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo rename to src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo diff --git a/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl rename to src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl diff --git a/ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo b/src/ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo similarity index 100% rename from ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo rename to src/ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo diff --git a/ru/OPI/src/Configuration/Configuration.mdo b/src/ru/OPI/src/Configuration/Configuration.mdo similarity index 100% rename from ru/OPI/src/Configuration/Configuration.mdo rename to src/ru/OPI/src/Configuration/Configuration.mdo diff --git a/ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi b/src/ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi similarity index 100% rename from ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi rename to src/ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi diff --git a/ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo b/src/ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo similarity index 100% rename from ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo rename to src/ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo diff --git a/ru/cli/core/Classes/Приложение.os b/src/ru/cli/core/Classes/Приложение.os similarity index 100% rename from ru/cli/core/Classes/Приложение.os rename to src/ru/cli/core/Classes/Приложение.os diff --git a/ru/cli/data/Classes/internal/Classes/airtable.os b/src/ru/cli/data/Classes/internal/Classes/airtable.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/airtable.os rename to src/ru/cli/data/Classes/internal/Classes/airtable.os diff --git a/ru/cli/data/Classes/internal/Classes/dropbox.os b/src/ru/cli/data/Classes/internal/Classes/dropbox.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/dropbox.os rename to src/ru/cli/data/Classes/internal/Classes/dropbox.os diff --git a/ru/cli/data/Classes/internal/Classes/gcalendar.os b/src/ru/cli/data/Classes/internal/Classes/gcalendar.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/gcalendar.os rename to src/ru/cli/data/Classes/internal/Classes/gcalendar.os diff --git a/ru/cli/data/Classes/internal/Classes/gdrive.os b/src/ru/cli/data/Classes/internal/Classes/gdrive.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/gdrive.os rename to src/ru/cli/data/Classes/internal/Classes/gdrive.os diff --git a/ru/cli/data/Classes/internal/Classes/google.os b/src/ru/cli/data/Classes/internal/Classes/google.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/google.os rename to src/ru/cli/data/Classes/internal/Classes/google.os diff --git a/ru/cli/data/Classes/internal/Classes/gsheets.os b/src/ru/cli/data/Classes/internal/Classes/gsheets.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/gsheets.os rename to src/ru/cli/data/Classes/internal/Classes/gsheets.os diff --git a/ru/cli/data/Classes/internal/Classes/notion.os b/src/ru/cli/data/Classes/internal/Classes/notion.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/notion.os rename to src/ru/cli/data/Classes/internal/Classes/notion.os diff --git a/ru/cli/data/Classes/internal/Classes/slack.os b/src/ru/cli/data/Classes/internal/Classes/slack.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/slack.os rename to src/ru/cli/data/Classes/internal/Classes/slack.os diff --git a/ru/cli/data/Classes/internal/Classes/telegram.os b/src/ru/cli/data/Classes/internal/Classes/telegram.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/telegram.os rename to src/ru/cli/data/Classes/internal/Classes/telegram.os diff --git a/ru/cli/data/Classes/internal/Classes/tools.os b/src/ru/cli/data/Classes/internal/Classes/tools.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/tools.os rename to src/ru/cli/data/Classes/internal/Classes/tools.os diff --git a/ru/cli/data/Classes/internal/Classes/twitter.os b/src/ru/cli/data/Classes/internal/Classes/twitter.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/twitter.os rename to src/ru/cli/data/Classes/internal/Classes/twitter.os diff --git a/ru/cli/data/Classes/internal/Classes/viber.os b/src/ru/cli/data/Classes/internal/Classes/viber.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/viber.os rename to src/ru/cli/data/Classes/internal/Classes/viber.os diff --git a/ru/cli/data/Classes/internal/Classes/vk.os b/src/ru/cli/data/Classes/internal/Classes/vk.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/vk.os rename to src/ru/cli/data/Classes/internal/Classes/vk.os diff --git a/ru/cli/data/Classes/internal/Classes/yadisk.os b/src/ru/cli/data/Classes/internal/Classes/yadisk.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/yadisk.os rename to src/ru/cli/data/Classes/internal/Classes/yadisk.os diff --git a/ru/cli/data/Classes/internal/Classes/yandex.os b/src/ru/cli/data/Classes/internal/Classes/yandex.os similarity index 100% rename from ru/cli/data/Classes/internal/Classes/yandex.os rename to src/ru/cli/data/Classes/internal/Classes/yandex.os diff --git a/ru/cli/data/Classes/СоставБиблиотеки.os b/src/ru/cli/data/Classes/СоставБиблиотеки.os similarity index 100% rename from ru/cli/data/Classes/СоставБиблиотеки.os rename to src/ru/cli/data/Classes/СоставБиблиотеки.os diff --git a/ru/cli/help/Modules/Справка.os b/src/ru/cli/help/Modules/Справка.os similarity index 100% rename from ru/cli/help/Modules/Справка.os rename to src/ru/cli/help/Modules/Справка.os diff --git a/ru/cli/start.bat b/src/ru/cli/start.bat similarity index 100% rename from ru/cli/start.bat rename to src/ru/cli/start.bat diff --git a/ru/cli/tools/Modules/Утилиты.os b/src/ru/cli/tools/Modules/Утилиты.os similarity index 100% rename from ru/cli/tools/Modules/Утилиты.os rename to src/ru/cli/tools/Modules/Утилиты.os