mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-03-21 21:27:27 +02:00
Создание словарей локализации
This commit is contained in:
parent
7e9e058ff1
commit
480fb4e384
0
.github/workflows/os/dictionary.json
vendored
0
.github/workflows/os/dictionary.json
vendored
303
.github/workflows/os/oint_dictionary.os
vendored
303
.github/workflows/os/oint_dictionary.os
vendored
@ -0,0 +1,303 @@
|
||||
Перем СписокЯзыков;
|
||||
Перем ОбщийМассивСлов;
|
||||
Перем Алфавит;
|
||||
Перем МассивСимволов;
|
||||
|
||||
Процедура ПолучитьСписокЯзыков() Экспорт
|
||||
|
||||
СписокЯзыков = Новый Массив();
|
||||
СписокЯзыков.Добавить("en");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура СоздатьСловари()
|
||||
|
||||
ПолучитьСписокЯзыков();
|
||||
ПолучитьАлфавит();
|
||||
ПолучитьМассивСимволов();
|
||||
|
||||
Для Каждого Язык Из СписокЯзыков Цикл
|
||||
СоздатьСловарь(Язык);
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура СоздатьСловарь(Знач Язык)
|
||||
|
||||
ФайлыМодулей = НайтиФайлы("./ru/", "*.os", Истина);
|
||||
СписокСлов = Новый СписокЗначений();
|
||||
|
||||
Для Каждого Модуль Из ФайлыМодулей Цикл
|
||||
ПолучитьМассивСловОригинала(Модуль.ПолноеИмя, СписокСлов);
|
||||
КонецЦикла;
|
||||
|
||||
ПутьСловаря = "./service/dictionaries/" + Язык + ".json";
|
||||
ФайлСловаря = Новый Файл(ПутьСловаря);
|
||||
|
||||
СоответствиеСловаря = Новый Соответствие();
|
||||
СоответствиеСуществующегоСловаря = Новый Соответствие();
|
||||
|
||||
Если ФайлСловаря.Существует() Тогда
|
||||
|
||||
ЧтениеJSON = Новый ЧтениеJSON();
|
||||
ЧтениеJSON.ОткрытьФайл(ПутьСловаря);
|
||||
СоответствиеСуществующегоСловаря = ПрочитатьJSON(ЧтениеJSON, Истина);
|
||||
ЧтениеJSON.Закрыть();
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
//СписокСлов.СортироватьПоПредставлению(НаправлениеСортировки.Убыв);
|
||||
|
||||
Для Каждого Слово Из СписокСлов Цикл
|
||||
|
||||
Значение = Слово.Значение;
|
||||
Существующее = СоответствиеСуществующегоСловаря[Значение];
|
||||
|
||||
Если Существующее = Неопределено Тогда
|
||||
СоответствиеСловаря.Вставить(Значение, "");
|
||||
Иначе
|
||||
СоответствиеСловаря.Вставить(Значение, Существующее);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря)
|
||||
|
||||
ТекстовыйДок = Новый ТекстовыйДокумент();
|
||||
ТекстовыйДок.ДобавитьСтроку("{");
|
||||
|
||||
ТЗ = Новый ТаблицаЗначений();
|
||||
ТЗ.Колонки.Добавить("Ключ");
|
||||
ТЗ.Колонки.Добавить("Значение");
|
||||
ТЗ.Колонки.Добавить("ДлинаКлюча");
|
||||
ТЗ.Колонки.Добавить("Заполнено");
|
||||
|
||||
Для Каждого Элемент Из СоответствиеСловаря Цикл
|
||||
|
||||
НоваяСтрока = ТЗ.Добавить();
|
||||
НоваяСтрока.Ключ = Элемент.Ключ;
|
||||
НоваяСтрока.Значение = Элемент.Значение;
|
||||
НоваяСтрока.ДлинаКлюча = СтрДлина(Элемент.Ключ);
|
||||
НоваяСтрока.Заполнено = ЗначениеЗаполнено(Элемент.Значение);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ТЗ.Сортировать("Заполнено УБЫВ, ДлинаКлюча");
|
||||
|
||||
Для Каждого СтрокаТЗ Из ТЗ Цикл
|
||||
Значение = СтрокаТЗ.Значение;
|
||||
Значение = СтрЗаменить(Значение, "\", "\\");
|
||||
Значение = СтрЗаменить(Значение, "/", "\/");
|
||||
Значение = СтрЗаменить(Значение, """", "\""");
|
||||
|
||||
Ключ = СтрокаТЗ.Ключ;
|
||||
Ключ = СтрЗаменить(Ключ, "\", "\\");
|
||||
Ключ = СтрЗаменить(Ключ, "/", "\/");
|
||||
Ключ = СтрЗаменить(Ключ, """", "\""");
|
||||
|
||||
ТекстовыйДок.ДобавитьСтроку("""" + Ключ + """: """ + Значение + """,");
|
||||
КонецЦикла;
|
||||
|
||||
ТекстовыйДок.ДобавитьСтроку("}");
|
||||
ТекстовыйДок.Записать(ПутьСловаря);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьМассивСловОригинала(Знач ПутьКФайлу, СписокСлов)
|
||||
|
||||
Документ = Новый ТекстовыйДокумент();
|
||||
Документ.Прочитать(ПутьКФайлу, "UTF-8");
|
||||
|
||||
Для Н = 1 По Документ.КоличествоСтрок() Цикл
|
||||
|
||||
ТекущаяСтрока = СокрЛП(Документ.ПолучитьСтроку(Н));
|
||||
|
||||
Если СтрНачинаетсяС(ТекущаяСтрока, "//") Тогда
|
||||
ТекущаяСтрока = СокрЛП(СтрЗаменить(ТекущаяСтрока, "//", ""));
|
||||
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, " - ", "$");
|
||||
ТекущаяСтрока = СтрРазделить(ТекущаяСтрока, "$", Ложь);
|
||||
|
||||
Для Каждого Элемент Из ТекущаяСтрока Цикл
|
||||
ДобавитьСлово(СписокСлов, Элемент);
|
||||
КонецЦикла;
|
||||
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
Если СтрНайти(ТекущаяСтрока, """") <> 0 Или СтрНайти(ТекущаяСтрока, "|") <> 0 Тогда
|
||||
ТекущаяСтрока = " " + ТекущаяСтрока;
|
||||
|
||||
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, """", "$");
|
||||
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "|", "$");
|
||||
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "$$", """""");
|
||||
|
||||
МассивСтроки = СтрРазделить(ТекущаяСтрока, "$", Истина);
|
||||
|
||||
Цельный = Ложь;
|
||||
Для Каждого Элемент Из МассивСтроки Цикл
|
||||
|
||||
Если Не ЗначениеЗаполнено(СокрЛП(Элемент)) Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
Если Цельный Тогда
|
||||
ДобавитьСлово(СписокСлов, Элемент);
|
||||
Иначе
|
||||
|
||||
Для Каждого Символ Из МассивСимволов Цикл
|
||||
Элемент = СтрЗаменить(Элемент, Символ, "$");
|
||||
КонецЦикла;
|
||||
|
||||
Пока СтрНайти(Элемент, "$$") <> 0 Цикл
|
||||
Элемент = СтрЗаменить(Элемент, "$$", "$");
|
||||
КонецЦикла;
|
||||
|
||||
МассивЭлемента = СтрРазделить(Элемент, "$", Ложь);
|
||||
Для Каждого Дробный Из МассивЭлемента Цикл
|
||||
ДобавитьСлово(СписокСлов, Дробный);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Цельный = Не Цельный;
|
||||
КонецЦикла;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ДобавитьСлово(Список, Слово)
|
||||
|
||||
Слово = СокрЛП(Слово);
|
||||
|
||||
Нормализовано = Ложь;
|
||||
|
||||
Пока Не Нормализовано Цикл
|
||||
|
||||
ПервыйСимвол = Ложь;
|
||||
ПоследнийСимвол = Ложь;
|
||||
|
||||
Для Каждого Символ Из МассивСимволов Цикл
|
||||
|
||||
ПервыйСимвол = СтрНачинаетсяС(Слово, Символ);
|
||||
ПоследнийСимвол = СтрЗаканчиваетсяНа(Слово, Символ);
|
||||
|
||||
Если ПервыйСимвол Или ПоследнийСимвол Тогда
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Если ПервыйСимвол Тогда
|
||||
Слово = Лев(Слово, СтрДлина(Слово) - 1);
|
||||
КонецЕсли;
|
||||
|
||||
Если ПоследнийСимвол Тогда
|
||||
Слово = Прав(Слово, СтрДлина(Слово) - 1);
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ПервыйСимвол И Не ПоследнийСимвол Тогда
|
||||
Нормализовано = Истина;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Слово = СокрЛП(Слово);
|
||||
|
||||
Если Не ЗначениеЗаполнено(Слово) Или Не НайтиКириллицу(Слово) Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
СуществующееЗначение = Список.НайтиПоЗначению(Слово);
|
||||
|
||||
Если СуществующееЗначение = Неопределено Тогда
|
||||
Список.Добавить(Слово, СтрДлина(Слово));
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьАлфавит()
|
||||
|
||||
Алфавит = Новый Массив;
|
||||
|
||||
Алфавит.Добавить("а");
|
||||
Алфавит.Добавить("б");
|
||||
Алфавит.Добавить("в");
|
||||
Алфавит.Добавить("г");
|
||||
Алфавит.Добавить("д");
|
||||
Алфавит.Добавить("е");
|
||||
Алфавит.Добавить("ё");
|
||||
Алфавит.Добавить("ж");
|
||||
Алфавит.Добавить("з");
|
||||
Алфавит.Добавить("и");
|
||||
Алфавит.Добавить("й");
|
||||
Алфавит.Добавить("к");
|
||||
Алфавит.Добавить("л");
|
||||
Алфавит.Добавить("м");
|
||||
Алфавит.Добавить("н");
|
||||
Алфавит.Добавить("о");
|
||||
Алфавит.Добавить("п");
|
||||
Алфавит.Добавить("р");
|
||||
Алфавит.Добавить("с");
|
||||
Алфавит.Добавить("т");
|
||||
Алфавит.Добавить("у");
|
||||
Алфавит.Добавить("ф");
|
||||
Алфавит.Добавить("х");
|
||||
Алфавит.Добавить("ц");
|
||||
Алфавит.Добавить("ч");
|
||||
Алфавит.Добавить("ш");
|
||||
Алфавит.Добавить("щ");
|
||||
Алфавит.Добавить("ъ");
|
||||
Алфавит.Добавить("ы");
|
||||
Алфавит.Добавить("ь");
|
||||
Алфавит.Добавить("э");
|
||||
Алфавит.Добавить("ю");
|
||||
Алфавит.Добавить("я");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьМассивСимволов()
|
||||
|
||||
МассивСимволов = Новый Массив();
|
||||
МассивСимволов.Добавить(";");
|
||||
МассивСимволов.Добавить(".");
|
||||
МассивСимволов.Добавить(",");
|
||||
МассивСимволов.Добавить(")");
|
||||
МассивСимволов.Добавить("(");
|
||||
МассивСимволов.Добавить("/");
|
||||
МассивСимволов.Добавить("\");
|
||||
МассивСимволов.Добавить("[");
|
||||
МассивСимволов.Добавить("]");
|
||||
МассивСимволов.Добавить("=");
|
||||
МассивСимволов.Добавить("+");
|
||||
МассивСимволов.Добавить("-");
|
||||
МассивСимволов.Добавить("*");
|
||||
МассивСимволов.Добавить("#");
|
||||
МассивСимволов.Добавить(" ");
|
||||
МассивСимволов.Добавить("""");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция НайтиКириллицу(Знач Слово)
|
||||
|
||||
СловоНРег = НРег(Слово);
|
||||
|
||||
Для Каждого Буква Из Алфавит Цикл
|
||||
Если СтрНайти(СловоНРег, Буква) <> 0 Тогда
|
||||
Возврат Истина;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Ложь;
|
||||
|
||||
КонецФункции
|
||||
|
||||
СоздатьСловари();
|
||||
|
37
.github/workflows/os/opi_translate.os
vendored
Normal file
37
.github/workflows/os/opi_translate.os
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
|
||||
Процедура СоздатьЛокализацию(Знач Язык)
|
||||
|
||||
КаталогИсточник = Новый Файл(".\ru\OPI");
|
||||
КаталогПриемник = Новый Файл(".\" + Язык + "\OPI");
|
||||
|
||||
СкопироватьФайлы(КаталогИсточник.ПолноеИмя, КаталогПриемник.ПолноеИмя);
|
||||
ФайлыМодулей = НайтиФайлы("./" + Язык + "/", "*.bsl", Истина);
|
||||
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура СкопироватьФайлы(Знач КаталогИсточник, Знач КаталогПриемник)
|
||||
|
||||
Если Прав(КаталогИсточник, 1) <> "\" Тогда
|
||||
КаталогИсточник = КаталогИсточник + "\";
|
||||
КонецЕсли;
|
||||
Если Прав(КаталогПриемник, 1) <> "\" Тогда
|
||||
КаталогПриемник = КаталогПриемник + "\";
|
||||
КонецЕсли;
|
||||
|
||||
СоздатьКаталог(КаталогПриемник);
|
||||
|
||||
МассивФайлов = НайтиФайлы(КаталогИсточник, "*.*", Истина);
|
||||
|
||||
Для Каждого Файл Из МассивФайлов Цикл
|
||||
ПолноеИмяИсточник = Файл.ПолноеИмя;
|
||||
ПолноеИмяПриемник = КаталогПриемник + СтрЗаменить(Файл.ПолноеИмя, КаталогИсточник, "");
|
||||
|
||||
Если Файл.ЭтоКаталог() Тогда
|
||||
СоздатьКаталог(ПолноеИмяПриемник);
|
||||
Иначе
|
||||
КопироватьФайл(ПолноеИмяИсточник, ПолноеИмяПриемник);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
@ -19,18 +19,18 @@ sidebar_position: 3
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Ключ = "oynqxds...";
|
||||
Секрет = "tk2oewn...";
|
||||
Рефреш = "MJIG2TBhD-kAAAAAAAAAAd3oNph_4iTy...";
|
||||
КлючПриложения = "oynqxds...";
|
||||
СекретПриложения = "tk2oewn...";
|
||||
РефрешТокен = "oZFWg3DmZ_IAAAAAAAAAAWilOA0M1SjV...";
|
||||
|
||||
Результат = OPI_Dropbox.ОбновитьТокен(Ключ, Секрет, Рефреш);
|
||||
Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен);
|
||||
|
||||
|
||||
```
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ОбновитьТокен --appkey %appkey% --appsecret %appsecret% --refresh %refresh%
|
||||
oint dropbox ОбновитьТокен --appkey "oynqxds..." --appsecret "tk2oewn..." --refresh "oZFWg3DmZ_IAAAAAAAAAAWilOA0M1SjV..."
|
||||
|
||||
```
|
||||
|
||||
|
@ -17,7 +17,7 @@ sidebar_position: 5
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
|
||||
Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен);
|
||||
|
||||
@ -26,7 +26,7 @@ sidebar_position: 5
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьДанныеИспользованияПространства --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..."
|
||||
oint dropbox ПолучитьДанныеИспользованияПространства --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..."
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,7 +18,7 @@ sidebar_position: 4
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
|
||||
Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен);
|
||||
|
||||
@ -27,7 +27,7 @@ sidebar_position: 4
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьИнформациюОбАккаунте --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --account %account%
|
||||
oint dropbox ПолучитьИнформациюОбАккаунте --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --account %account%
|
||||
|
||||
```
|
||||
|
||||
|
@ -17,15 +17,15 @@ sidebar_position: 1
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Ключ = "oynqxds...";
|
||||
Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(Ключ);
|
||||
КлючПриложения = "oynqxds...";
|
||||
Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения);
|
||||
|
||||
|
||||
```
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьСсылкуАвторизации --appkey %appkey%
|
||||
oint dropbox ПолучитьСсылкуАвторизации --appkey "oynqxds..."
|
||||
|
||||
```
|
||||
|
||||
|
@ -19,13 +19,18 @@ sidebar_position: 2
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
КлючПриложения = "oynqxds...";
|
||||
СекретПриложения = "tk2oewn...";
|
||||
Код = "bTCiUTzxe6kAAAAAAAAAMgkkeJxqxqAO0YhahYskSmo";
|
||||
|
||||
Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код);
|
||||
|
||||
|
||||
```
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьТокен --appkey %appkey% --appsecret %appsecret% --code %code%
|
||||
oint dropbox ПолучитьТокен --appkey "oynqxds..." --appsecret "tk2oewn..." --code "bTCiUTzxe6kAAAAAAAAAMgkkeJxqxqAO0YhahYskSmo"
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,9 +20,9 @@ sidebar_position: 4
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Почта = "h5bk6ft62s@privaterelay.appleid.com";
|
||||
Папка = "4999224241"; // shared_folder_id
|
||||
Папка = "5008139809"; // shared_folder_id
|
||||
|
||||
Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь);
|
||||
|
||||
@ -31,7 +31,7 @@ sidebar_position: 4
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ДобавитьПользователейКПапке --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --folder %folder% --emails %emails% --readonly %readonly%
|
||||
oint dropbox ДобавитьПользователейКПапке --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --folder %folder% --emails %emails% --readonly %readonly%
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 3
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Почта = "h5bk6ft62s@privaterelay.appleid.com";
|
||||
Файл = "kJU6-a-pT48AAAAAAAAABw";
|
||||
|
||||
@ -31,7 +31,7 @@ sidebar_position: 3
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ДобавитьПользователейКФайлу --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --fileid %fileid% --emails %emails% --readonly %readonly%
|
||||
oint dropbox ДобавитьПользователейКФайлу --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --fileid %fileid% --emails %emails% --readonly %readonly%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,7 +18,7 @@ sidebar_position: 1
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New";
|
||||
|
||||
Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь);
|
||||
@ -28,7 +28,7 @@ sidebar_position: 1
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ОпубликоватьПапку --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
|
||||
oint dropbox ОпубликоватьПапку --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,13 +18,17 @@ sidebar_position: 6
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Файл = "kJU6-a-pT48AAAAAAAAABw";
|
||||
|
||||
Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл);
|
||||
|
||||
|
||||
```
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ОтменитьПубликациюФайла --token %token% --fileid %fileid%
|
||||
oint dropbox ОтменитьПубликациюФайла --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --fileid %fileid%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,17 +18,25 @@ sidebar_position: 2
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Папка = "4999224241";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Папка = "5008139809";
|
||||
|
||||
Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
|
||||
Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
|
||||
ТекущийСтатус = "in_progress";
|
||||
IDРаботы = Результат["async_job_id"];
|
||||
|
||||
Пока ТекущийСтатус = "in_progress" Цикл
|
||||
Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы);
|
||||
ТекущийСтатус = Результат[".tag"];
|
||||
OPI_Инструменты.Пауза(3);
|
||||
КонецЦикла;
|
||||
|
||||
|
||||
```
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ОтменитьПубликациюПапки --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --folder %folder%
|
||||
oint dropbox ОтменитьПубликациюПапки --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --folder %folder%
|
||||
|
||||
```
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 8
|
||||
|
||||
Оригинал = "/New/pic.png";
|
||||
Копия = "/New/pic_copy.png";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
|
||||
Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия);
|
||||
|
||||
@ -30,7 +30,7 @@ sidebar_position: 8
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox КопироватьОбъект --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --form %form% --to %to%
|
||||
oint dropbox КопироватьОбъект --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --form %form% --to %to%
|
||||
|
||||
```
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 9
|
||||
|
||||
ОригиналныйПуть = "/New/pic.png";
|
||||
ЦелевойПуть = "/pic.png";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
|
||||
Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть);
|
||||
|
||||
@ -30,7 +30,7 @@ sidebar_position: 9
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПереместитьОбъект --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --form %form% --to %to%
|
||||
oint dropbox ПереместитьОбъект --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --form %form% --to %to%
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 1
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Путь = "/New/pic.png";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
|
||||
Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина);
|
||||
|
||||
@ -29,7 +29,7 @@ sidebar_position: 1
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьИнформациюОбОбъекте --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --detail %detail%
|
||||
oint dropbox ПолучитьИнформациюОбОбъекте --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --detail %detail%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,7 +18,7 @@ sidebar_position: 3
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New/mydoc.docx";
|
||||
|
||||
Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь);
|
||||
@ -28,7 +28,7 @@ sidebar_position: 3
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьПревью --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
|
||||
oint dropbox ПолучитьПревью --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
|
||||
|
||||
```
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 2
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Путь = "/New";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
|
||||
Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина);
|
||||
|
||||
@ -30,7 +30,7 @@ sidebar_position: 2
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьСписокФайловПапки --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --detail %detail% --cursor %cursor%
|
||||
oint dropbox ПолучитьСписокФайловПапки --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --detail %detail% --cursor %cursor%
|
||||
|
||||
```
|
||||
|
||||
|
@ -19,7 +19,7 @@ sidebar_position: 13
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New/pic.png";
|
||||
|
||||
Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1);
|
||||
@ -29,7 +29,7 @@ sidebar_position: 13
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьСписокВерсийОбъекта --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --amount %amount%
|
||||
oint dropbox ПолучитьСписокВерсийОбъекта --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --amount %amount%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,8 +18,8 @@ sidebar_position: 6
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
ИДРаботы = "kwvJIcRS7eAAAAAAAAAAAQ";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
ИДРаботы = "mTzF6hWsswAAAAAAAAAAAQ";
|
||||
Статус = "in_progress";
|
||||
|
||||
Пока Статус = "in_progress" Цикл
|
||||
@ -38,7 +38,7 @@ sidebar_position: 6
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ПолучитьСтатусЗагрузкиПоURL --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --job %job%
|
||||
oint dropbox ПолучитьСтатусЗагрузкиПоURL --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --job %job%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,7 +18,7 @@ sidebar_position: 11
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New/pic.png";
|
||||
|
||||
Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь);
|
||||
@ -28,7 +28,7 @@ sidebar_position: 11
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox СкачатьФайл --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
|
||||
oint dropbox СкачатьФайл --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,7 +18,7 @@ sidebar_position: 12
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New";
|
||||
|
||||
Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь);
|
||||
@ -28,7 +28,7 @@ sidebar_position: 12
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox СкачатьПапку --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
|
||||
oint dropbox СкачатьПапку --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
|
||||
|
||||
```
|
||||
|
||||
|
@ -18,7 +18,7 @@ sidebar_position: 10
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/Новый каталог";
|
||||
|
||||
Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь);
|
||||
@ -28,7 +28,7 @@ sidebar_position: 10
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox СоздатьПапку --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
|
||||
oint dropbox СоздатьПапку --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 7
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Путь = "/New/pic.png";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
|
||||
Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
|
||||
|
||||
@ -29,7 +29,7 @@ sidebar_position: 7
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox УдалитьОбъект --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --permanently %permanently%
|
||||
oint dropbox УдалитьОбъект --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --permanently %permanently%
|
||||
|
||||
```
|
||||
|
||||
|
@ -19,13 +19,18 @@ sidebar_position: 14
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Версия = "016196bc6e08dda00000001295a2bc1";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New/pic.png";
|
||||
|
||||
Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия);
|
||||
|
||||
|
||||
```
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ВосстановитьОбъектКВерсии --token %token% --path %path% --rev %rev%
|
||||
oint dropbox ВосстановитьОбъектКВерсии --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --rev "016196bc6e08dda00000001295a2bc1"
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 5
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Путь = "/New/url_doc.docx";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
URL = "https://openintegrations.dev/test_data/document.docx";
|
||||
|
||||
Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь);
|
||||
@ -30,7 +30,7 @@ sidebar_position: 5
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ЗагрузитьФайлПоURL --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --url %url% --path %path%
|
||||
oint dropbox ЗагрузитьФайлПоURL --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --url %url% --path %path%
|
||||
|
||||
```
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 4
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Путь = "/New/pic.png";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Картинка = "https://openintegrations.dev/test_data/picture.jpg";
|
||||
|
||||
КартинкаПуть = ПолучитьИмяВременногоФайла("png");
|
||||
@ -34,7 +34,7 @@ sidebar_position: 4
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ЗагрузитьФайл --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --file %file% --path %path% --overwrite %overwrite%
|
||||
oint dropbox ЗагрузитьФайл --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --file %file% --path %path% --overwrite %overwrite%
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 2
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Тег = "Важное";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New/mydoc.docx";
|
||||
|
||||
Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег);
|
||||
@ -30,7 +30,7 @@ sidebar_position: 2
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox ДобавитьТег --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --tag %tag%
|
||||
oint dropbox ДобавитьТег --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --tag %tag%
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 3
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Тег = "Важное";
|
||||
Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
|
||||
Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
|
||||
Путь = "/New/mydoc.docx";
|
||||
|
||||
Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег);
|
||||
@ -30,7 +30,7 @@ sidebar_position: 3
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint dropbox УдалитьТег --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --tag %tag%
|
||||
oint dropbox УдалитьТег --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --tag %tag%
|
||||
|
||||
```
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 5
|
||||
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
IDКанала = "@testsichee";
|
||||
IDСообщения = "4606";
|
||||
IDСообщения = "4494";
|
||||
|
||||
Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения);
|
||||
|
||||
@ -30,7 +30,7 @@ sidebar_position: 5
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint telegram ОткрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4606"
|
||||
oint telegram ОткрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4494"
|
||||
|
||||
```
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 4
|
||||
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
IDКанала = "@testsichee";
|
||||
IDСообщения = "4606";
|
||||
IDСообщения = "4494";
|
||||
|
||||
Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения);
|
||||
|
||||
@ -30,7 +30,7 @@ sidebar_position: 4
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint telegram ЗакрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4606"
|
||||
oint telegram ЗакрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4494"
|
||||
|
||||
```
|
||||
|
||||
|
@ -23,7 +23,7 @@ sidebar_position: 11
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
IDЧата = "461699897";
|
||||
IDКанала = "@testsichee";
|
||||
IDСообщения = "4606";
|
||||
IDСообщения = "4494";
|
||||
|
||||
Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата);
|
||||
|
||||
|
@ -18,7 +18,7 @@ sidebar_position: 5
|
||||
|
||||
```bsl title="Пример кода"
|
||||
|
||||
IDФайла = "CQACAgIAAx0EcNsaZQACEgRmVgMIOr9Q0NEt9l4OXJuwUgbl-wAC3kYAAnFFsUp2dLSNM3JeRjUE";
|
||||
IDФайла = "CQACAgIAAx0EcNsaZQACEZRmUbbz_bhDX_wPiSnMclSID6CD7wACC00AAoaTiEpOTiNykV_72zUE";
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
|
||||
Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
|
||||
@ -28,7 +28,7 @@ sidebar_position: 5
|
||||
|
||||
```sh title="Пример команд CLI"
|
||||
|
||||
oint telegram СкачатьФайл --token "6129457865:AAFyzNYOAFbu..." --fileid "CQACAgIAAx0EcNsaZQACEgRmVgMIOr9Q0NEt9l4OXJuwUgbl-wAC3kYAAnFFsUp2dLSNM3JeRjUE"
|
||||
oint telegram СкачатьФайл --token "6129457865:AAFyzNYOAFbu..." --fileid "CQACAgIAAx0EcNsaZQACEZRmUbbz_bhDX_wPiSnMclSID6CD7wACC00AAoaTiEpOTiNykV_72zUE"
|
||||
|
||||
```
|
||||
|
||||
|
@ -23,7 +23,7 @@ sidebar_position: 3
|
||||
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
Чат = "-1001971186208";
|
||||
Тема = "2402";
|
||||
Тема = "2325";
|
||||
НовоеИмя = "Новый тестовый заголовок";
|
||||
НовяИконка = "5310132165583840589";
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 10
|
||||
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
Чат = "-1001971186208";
|
||||
Тема = "2402";
|
||||
Тема = "2325";
|
||||
|
||||
Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат);
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 5
|
||||
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
Чат = "-1001971186208";
|
||||
Тема = "2402";
|
||||
Тема = "2325";
|
||||
|
||||
Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 6
|
||||
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
Чат = "-1001971186208";
|
||||
Тема = "2402";
|
||||
Тема = "2325";
|
||||
|
||||
Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема);
|
||||
|
||||
|
@ -21,7 +21,7 @@ sidebar_position: 4
|
||||
|
||||
Токен = "6129457865:AAFyzNYOAFbu...";
|
||||
Чат = "-1001971186208";
|
||||
Тема = "2402";
|
||||
Тема = "2325";
|
||||
|
||||
|
||||
Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему
|
||||
|
@ -22,14 +22,14 @@ sidebar_position: 8
|
||||
|
||||
Параметры = ПолучитьПараметрыВК();
|
||||
ОписаниеКартинки = "Картинка автотест";
|
||||
ИДАльбома = "304369700";
|
||||
ИДАльбома = "304440188";
|
||||
|
||||
Картинка = "https://openintegrations.dev/test_data/picture.jpg"; // URL, Путь к файлу или Двоичные данные
|
||||
ИВФ = ПолучитьИмяВременногоФайла("png");
|
||||
КопироватьФайл(Картинка, ИВФ);
|
||||
|
||||
Картинка = Новый ДвоичныеДанные(ИВФ);
|
||||
|
||||
|
||||
Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры);
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK");
|
||||
|
@ -40,7 +40,6 @@ sidebar_position: 1
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK");
|
||||
|
||||
|
||||
|
||||
Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры);
|
||||
|
||||
|
||||
|
@ -19,7 +19,7 @@ sidebar_position: 6
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Параметры = ПолучитьПараметрыВК();
|
||||
ИДАльбома = "304369700";
|
||||
ИДАльбома = "304440188";
|
||||
|
||||
Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры);
|
||||
|
||||
|
@ -19,7 +19,7 @@ sidebar_position: 9
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Параметры = ПолучитьПараметрыВК();
|
||||
ИДКартинки = "457243771";
|
||||
ИДКартинки = "457243842";
|
||||
|
||||
Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);
|
||||
|
||||
|
@ -19,7 +19,7 @@ sidebar_position: 3
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Параметры = ПолучитьПараметрыВК();
|
||||
ИДПоста = "2021";
|
||||
ИДПоста = "2045";
|
||||
|
||||
Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 4
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Параметры = ПолучитьПараметрыВК();
|
||||
ИДОбсуждения = "51136513";
|
||||
ИДОбсуждения = "51167955";
|
||||
Сообщение = "Мне больше нравится желтый";
|
||||
|
||||
Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры);
|
||||
|
@ -19,7 +19,7 @@ sidebar_position: 3
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Параметры = ПолучитьПараметрыВК();
|
||||
ИДОбсуждения = "51136513";
|
||||
ИДОбсуждения = "51167955";
|
||||
Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
|
||||
|
||||
|
||||
|
@ -20,7 +20,7 @@ sidebar_position: 2
|
||||
```bsl title="Пример кода"
|
||||
|
||||
Параметры = ПолучитьПараметрыВК();
|
||||
ИДОбсуждения = "51136513";
|
||||
ИДОбсуждения = "51167955";
|
||||
Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры);
|
||||
|
||||
|
||||
|
18
en/OPI/.project
Normal file
18
en/OPI/.project
Normal file
@ -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>
|
2
en/OPI/.settings/org.eclipse.core.resources.prefs
Normal file
2
en/OPI/.settings/org.eclipse.core.resources.prefs
Normal file
@ -0,0 +1,2 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding/<project>=UTF-8
|
3
en/OPI/DT-INF/PROJECT.PMF
Normal file
3
en/OPI/DT-INF/PROJECT.PMF
Normal file
@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
Runtime-Version: 8.3.15
|
||||
Base-Project: OpenIntegrations
|
681
en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
Normal file
681
en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
Normal file
@ -0,0 +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", Данные, "Коллекция", Параметры);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
11
en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
Normal file
@ -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>
|
961
en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
Normal file
961
en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
Normal file
@ -0,0 +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, ТекущиеДанные, Заголовки);
|
||||
|
||||
ТекущаяПозиция = СледующаяПозиция;
|
||||
|
||||
// !OInt КБайт = 1024;
|
||||
// !OInt МБайт = КБайт * КБайт;
|
||||
// !OInt Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
|
||||
|
||||
// !OInt ВыполнитьСборкуМусора();
|
||||
// !OInt ОсвободитьОбъект(ТекущиеДанные);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
|
||||
|
||||
Булево_ = "Булево";
|
||||
Строка_ = "Строка";
|
||||
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");
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
15
en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
Normal file
15
en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
Normal file
@ -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>
|
631
en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
Normal file
631
en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
Normal file
@ -0,0 +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 И ЗначениеЗаполнено(Страница) Тогда
|
||||
ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница);
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
@ -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>
|
719
en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
Normal file
719
en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
Normal file
@ -0,0 +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(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
|
||||
|
||||
РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
|
||||
|
||||
Если ЗначениеЗаполнено(РезультатПроверки) Тогда
|
||||
Возврат РезультатПроверки;
|
||||
КонецЕсли;
|
||||
|
||||
// !OInt КБайт = 1024;
|
||||
// !OInt МБайт = КБайт * КБайт;
|
||||
// !OInt Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
|
||||
|
||||
// !OInt ВыполнитьСборкуМусора();
|
||||
// !OInt ОсвободитьОбъект(ТекущиеДанные);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
|
||||
|
||||
НачалоКодовОшибок = 400;
|
||||
КонецКодовПадений = 600;
|
||||
НачалоКодовУспеха = 200;
|
||||
КонецКодовУспеха = 300;
|
||||
Перенаправление = 308;
|
||||
|
||||
Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
|
||||
|
||||
ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
|
||||
ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
|
||||
|
||||
ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
|
||||
|
||||
Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
|
||||
|
||||
OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
|
||||
Возврат ОтветПроверки;
|
||||
|
||||
ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
|
||||
|
||||
ЗагруженныеДанные = Ответ.Заголовки["Range"];
|
||||
|
||||
Иначе
|
||||
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Иначе
|
||||
ЗагруженныеДанные = Ответ.Заголовки["Range"];
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
|
||||
МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
|
||||
НеобходимоЧастей = 2;
|
||||
|
||||
Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
|
||||
|
||||
Возврат "";
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
11
en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
Normal file
@ -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>
|
409
en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
Normal file
409
en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
Normal file
@ -0,0 +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 По МассивИмен.ВГраница() Цикл
|
||||
ДобавитьИмяЛиста(МассивИмен[Н], Лист);
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
@ -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>
|
173
en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
Normal file
173
en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
Normal file
@ -0,0 +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");
|
||||
КонецЕсли;
|
||||
|
||||
Возврат СтрСоединить(МассивРазрешений, " ");
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
@ -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>
|
889
en/OPI/src/CommonModules/OPI_Notion/Module.bsl
Normal file
889
en/OPI/src/CommonModules/OPI_Notion/Module.bsl
Normal file
@ -0,0 +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", Телефон);
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
11
en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
Normal file
@ -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>Методы работы с Notion (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
1055
en/OPI/src/CommonModules/OPI_Slack/Module.bsl
Normal file
1055
en/OPI/src/CommonModules/OPI_Slack/Module.bsl
Normal file
File diff suppressed because it is too large
Load Diff
11
en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
Normal file
@ -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>
|
1253
en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
Normal file
1253
en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
Normal file
File diff suppressed because it is too large
Load Diff
11
en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
Normal file
@ -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>Методы интеграции с Telegram (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
682
en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
Normal file
682
en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
Normal file
@ -0,0 +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"];
|
||||
|
||||
Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
|
||||
Возврат Ответ;
|
||||
Иначе
|
||||
Возврат СтатусОбработки;
|
||||
КонецЕсли;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
11
en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
Normal file
@ -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>Методы работы с Twitter (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
2190
en/OPI/src/CommonModules/OPI_VK/Module.bsl
Normal file
2190
en/OPI/src/CommonModules/OPI_VK/Module.bsl
Normal file
File diff suppressed because it is too large
Load Diff
11
en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
Normal file
@ -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>Методы интеграции с VK (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
414
en/OPI/src/CommonModules/OPI_Viber/Module.bsl
Normal file
414
en/OPI/src/CommonModules/OPI_Viber/Module.bsl
Normal file
@ -0,0 +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", Токен);
|
||||
Возврат СтруктураЗаголовков;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
11
en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
Normal file
@ -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>Методы интеграции с Viber (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
635
en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
Normal file
635
en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
Normal file
@ -0,0 +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Ответа, , Заголовки);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
11
en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
Normal file
@ -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>Методы работы с Yandex Disk (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
112
en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
Normal file
112
en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
Normal file
@ -0,0 +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", Параметры, , Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
11
en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
Normal file
@ -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>Методы работы с Yandex ID (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
1229
en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
Normal file
1229
en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
Normal file
File diff suppressed because it is too large
Load Diff
11
en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
Normal file
11
en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
Normal file
@ -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_Инструменты</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>OPI инструменты</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
110
en/OPI/src/CommonModules/OPI_Криптография/Module.bsl
Normal file
110
en/OPI/src/CommonModules/OPI_Криптография/Module.bsl
Normal file
@ -0,0 +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 По Количество Цикл
|
||||
Части.Добавить(Строка);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат СтрСоединить(Части, "");
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
@ -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_Криптография</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Криптография (OPI)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
470
en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
Normal file
470
en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
Normal file
@ -0,0 +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";
|
||||
ФайлЛога = Новый Файл(ПутьКФайлу);
|
||||
|
||||
Если Не ФайлЛога.Существует() Тогда
|
||||
ДокументЛога = Новый ТекстовыйДокумент;
|
||||
ДокументЛога.УстановитьТекст(Данные);
|
||||
ДокументЛога.Записать(ПутьКФайлу);
|
||||
КонецЕсли;
|
||||
|
||||
Исключение
|
||||
Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
@ -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_ПолучениеДанныхТестов</name>
|
||||
<synonym>
|
||||
<key></key>
|
||||
<value>OPI получение данных тестов</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
320
en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
Normal file
320
en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
Normal file
@ -0,0 +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Значение(Тип(Дата), Значение);
|
||||
КонецЕсли;
|
||||
|
||||
Исключение
|
||||
ООД = Новый ОписаниеТипов(Дата);
|
||||
Значение = ООД.ПривестиЗначение(Значение);
|
||||
КонецПопытки;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьЧисло(Значение) Экспорт
|
||||
|
||||
ОписаниеТипа = Новый ОписаниеТипов("Число");
|
||||
Значение = ОписаниеТипа.ПривестиЗначение(Значение);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Функция ЭтоКоллекция(Знач Значение)
|
||||
|
||||
Возврат ТипЗнч(Значение) = Тип("Массив")
|
||||
Или ТипЗнч(Значение) = Тип("Структура")
|
||||
Или ТипЗнч(Значение) = Тип("Соответствие");
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЭтоСимвольное(Знач Значение)
|
||||
|
||||
Возврат ТипЗнч(Значение) = Тип("Строка")
|
||||
Или ТипЗнч(Значение) = Тип("Число")
|
||||
Или ТипЗнч(Значение) = Тип("Дата");
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
@ -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_ПреобразованиеТипов</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Преобразование типов (OPI)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
5307
en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
Normal file
5307
en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
Normal file
File diff suppressed because it is too large
Load Diff
15
en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
Normal file
15
en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
Normal file
@ -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_Тесты</name>
|
||||
<synonym>
|
||||
<key></key>
|
||||
<value>OPI тесты</value>
|
||||
</synonym>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Тесты для YaxUnit (ОПИ)</value>
|
||||
</synonym>
|
||||
<server>true</server>
|
||||
<externalConnection>true</externalConnection>
|
||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||
</mdclass:CommonModule>
|
70
en/OPI/src/Configuration/Configuration.mdo
Normal file
70
en/OPI/src/Configuration/Configuration.mdo
Normal file
@ -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>Открытый пакет интеграций</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>Открытый пакет интеграций - набор библиотек для интеграции с некоторыми популярными API для 1C:Enterprise. Он состоит из общих модулей, каждый из которых отвечает за свой API, а также нескольких модулей-инструментов, общих для всех.</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>Русский</name>
|
||||
<objectBelonging>Adopted</objectBelonging>
|
||||
<extension xsi:type="mdclassExtension:LanguageExtension">
|
||||
<languageCode>Checked</languageCode>
|
||||
</extension>
|
||||
<languageCode>ru</languageCode>
|
||||
</languages>
|
||||
<subsystems>Subsystem.OPI_Интеграция</subsystems>
|
||||
<commonModules>CommonModule.OPI_Инструменты</commonModules>
|
||||
<commonModules>CommonModule.OPI_Криптография</commonModules>
|
||||
<commonModules>CommonModule.OPI_ПреобразованиеТипов</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_Тесты</commonModules>
|
||||
<commonModules>CommonModule.OPI_ПолучениеДанныхТестов</commonModules>
|
||||
</mdclass:Configuration>
|
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>
|
28
en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
Normal file
28
en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
Normal file
@ -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_Интеграция</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Интеграция</value>
|
||||
</synonym>
|
||||
<includeHelpInContents>true</includeHelpInContents>
|
||||
<includeInCommandInterface>true</includeInCommandInterface>
|
||||
<content>CommonModule.OPI_Инструменты</content>
|
||||
<content>CommonModule.OPI_Криптография</content>
|
||||
<content>CommonModule.OPI_ПреобразованиеТипов</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_Тесты</content>
|
||||
<content>CommonModule.OPI_ПолучениеДанныхТестов</content>
|
||||
</mdclass:Subsystem>
|
2804
service/dictionaries/backup/en.json
Normal file
2804
service/dictionaries/backup/en.json
Normal file
File diff suppressed because it is too large
Load Diff
2804
service/dictionaries/en.json
Normal file
2804
service/dictionaries/en.json
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user