mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-01-28 05:46:35 +02:00
DB: Авторизация и загрузка большого файла
This commit is contained in:
parent
14628568b9
commit
696f2702f2
@ -33,6 +33,91 @@
|
|||||||
|
|
||||||
#Область ПрограммныйИнтерфейс
|
#Область ПрограммныйИнтерфейс
|
||||||
|
|
||||||
|
#Область Авторизация
|
||||||
|
|
||||||
|
// Получить ссылку авторизации
|
||||||
|
// Генерирует ссылку авторизации для перехода в браузере
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// КлючПриложения - Строка - Ключ приложения - 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, Параметры, , Ложь);
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
#Область РаботаСФайлами
|
#Область РаботаСФайлами
|
||||||
|
|
||||||
// Загрузить файл
|
// Загрузить файл
|
||||||
@ -45,7 +130,7 @@
|
|||||||
// Перезаписывать - Булево - Перезаписывать файл или менять название - overwrite
|
// Перезаписывать - Булево - Перезаписывать файл или менять название - overwrite
|
||||||
//
|
//
|
||||||
// Возвращаемое значение:
|
// Возвращаемое значение:
|
||||||
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
|
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
|
||||||
Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
|
Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
|
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
|
||||||
@ -54,7 +139,7 @@
|
|||||||
|
|
||||||
Режим = ?(Перезаписывать, "overwrite", "add");
|
Режим = ?(Перезаписывать, "overwrite", "add");
|
||||||
Размер = Файл.Размер();
|
Размер = Файл.Размер();
|
||||||
Граница = 50000000;
|
Граница = 5000000;
|
||||||
|
|
||||||
Если Размер > Граница Тогда
|
Если Размер > Граница Тогда
|
||||||
Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
|
Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
|
||||||
@ -94,9 +179,49 @@
|
|||||||
|
|
||||||
Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
|
Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
|
||||||
|
|
||||||
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
|
URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2";
|
||||||
|
|
||||||
Возврат "";
|
РазмерЧасти = 5000000;
|
||||||
|
ТекущаяПозиция = 0;
|
||||||
|
ПрочитаноБайт = 0;
|
||||||
|
ОбщийРазмер = Файл.Размер();
|
||||||
|
Сессия = ОткрытьСессию(Токен);
|
||||||
|
|
||||||
|
Пока ПрочитаноБайт < ОбщийРазмер Цикл
|
||||||
|
|
||||||
|
Отступ = ТекущаяПозиция;
|
||||||
|
Курсор = Новый Структура("offset,session_id", Отступ, Сессия);
|
||||||
|
|
||||||
|
Параметры = Новый Структура("cursor", Курсор);
|
||||||
|
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
|
||||||
|
|
||||||
|
ЧтениеДанных = Новый ЧтениеДанных(Файл);
|
||||||
|
ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
|
||||||
|
Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
|
||||||
|
ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
|
||||||
|
РазмерТекущих = ТекущиеДанные.Размер();
|
||||||
|
СледующаяПозиция = ТекущаяПозиция + РазмерТекущих;
|
||||||
|
|
||||||
|
Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
|
||||||
|
Прервать;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки);
|
||||||
|
|
||||||
|
ТекущаяПозиция = СледующаяПозиция;
|
||||||
|
|
||||||
|
// !OInt КБайт = 1024;
|
||||||
|
// !OInt МБайт = КБайт * КБайт;
|
||||||
|
// !OInt Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
|
||||||
|
|
||||||
|
// !OInt ВыполнитьСборкуМусора();
|
||||||
|
// !OInt ОсвободитьОбъект(ТекущиеДанные);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
@ -120,4 +245,35 @@
|
|||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОткрытьСессию(Знач Токен)
|
||||||
|
|
||||||
|
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, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
|
||||||
|
|
||||||
|
Возврат Ответ;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
@ -1,14 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="66ce7792-41e5-47e4-bfad-2dcff1c96287">
|
||||||
<name>OPI_Dropbox</name>
|
<name>OPI_Dropbox</name>
|
||||||
<synonym>
|
|
||||||
<key>ru</key>
|
|
||||||
<value>Drop box</value>
|
|
||||||
</synonym>
|
|
||||||
<synonym>
|
<synonym>
|
||||||
<key></key>
|
<key></key>
|
||||||
<value>OPI dropbox</value>
|
<value>OPI dropbox</value>
|
||||||
</synonym>
|
</synonym>
|
||||||
|
<synonym>
|
||||||
|
<key>ru</key>
|
||||||
|
<value>Drop box</value>
|
||||||
|
</synonym>
|
||||||
<server>true</server>
|
<server>true</server>
|
||||||
<externalConnection>true</externalConnection>
|
<externalConnection>true</externalConnection>
|
||||||
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
<clientOrdinaryApplication>true</clientOrdinaryApplication>
|
||||||
|
@ -177,6 +177,43 @@
|
|||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт
|
||||||
|
|
||||||
|
Заголовки = Новый Соответствие;
|
||||||
|
Заголовки.Вставить("Accept-Encoding", "gzip");
|
||||||
|
Заголовки.Вставить("Accept" , "*/*");
|
||||||
|
Заголовки.Вставить("Connection" , "keep-alive");
|
||||||
|
Заголовки.Вставить("Accept-Charset" , "utf-8");
|
||||||
|
|
||||||
|
Если ЗначениеЗаполнено(ТипДанных) Тогда
|
||||||
|
Заголовки.Вставить("Content-Type", ТипДанных);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
||||||
|
|
||||||
|
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
||||||
|
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
|
||||||
|
|
||||||
|
Возврат НовыйЗапрос;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
SSL = Новый ЗащищенноеСоединениеOpenSSL;
|
||||||
|
Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL);
|
||||||
|
Исключение
|
||||||
|
Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000);
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
@ -265,7 +302,7 @@
|
|||||||
ЗаписьJSON = Новый ЗаписьJSON;
|
ЗаписьJSON = Новый ЗаписьJSON;
|
||||||
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
|
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
|
||||||
|
|
||||||
ЗаписатьJSON(ЗаписьJSON, Данные);
|
ЗаписатьJSON(ЗаписьJSON, Данные,);
|
||||||
Возврат ЗаписьJSON.Закрыть();
|
Возврат ЗаписьJSON.Закрыть();
|
||||||
|
|
||||||
Исключение
|
Исключение
|
||||||
@ -694,43 +731,6 @@
|
|||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "")
|
|
||||||
|
|
||||||
Заголовки = Новый Соответствие;
|
|
||||||
Заголовки.Вставить("Accept-Encoding", "gzip");
|
|
||||||
Заголовки.Вставить("Accept" , "*/*");
|
|
||||||
Заголовки.Вставить("Connection" , "keep-alive");
|
|
||||||
Заголовки.Вставить("Accept-Charset" , "utf-8");
|
|
||||||
|
|
||||||
Если ЗначениеЗаполнено(ТипДанных) Тогда
|
|
||||||
Заголовки.Вставить("Content-Type", ТипДанных);
|
|
||||||
КонецЕсли;
|
|
||||||
|
|
||||||
Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
|
|
||||||
|
|
||||||
Для Каждого Заголовок Из ДопЗаголовки Цикл
|
|
||||||
Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
|
||||||
КонецЦикла;
|
|
||||||
|
|
||||||
КонецЕсли;
|
|
||||||
|
|
||||||
НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
|
|
||||||
|
|
||||||
Возврат НовыйЗапрос;
|
|
||||||
|
|
||||||
КонецФункции
|
|
||||||
|
|
||||||
Функция СоздатьСоединение(Знач Сервер)
|
|
||||||
|
|
||||||
Попытка
|
|
||||||
SSL = Новый ЗащищенноеСоединениеOpenSSL;
|
|
||||||
Возврат Новый HTTPСоединение(Сервер, 443, , , , 3000, SSL);
|
|
||||||
Исключение
|
|
||||||
Возврат Новый HTTPСоединение(Сервер, 443, , , , 3000);
|
|
||||||
КонецПопытки;
|
|
||||||
|
|
||||||
КонецФункции
|
|
||||||
|
|
||||||
Функция ЭтоПереадресация(Знач Ответ)
|
Функция ЭтоПереадресация(Знач Ответ)
|
||||||
|
|
||||||
Переадресация = 300;
|
Переадресация = 300;
|
||||||
|
@ -209,6 +209,7 @@
|
|||||||
НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
|
НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
|
||||||
|
|
||||||
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
|
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
|
||||||
|
НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс);
|
||||||
|
|
||||||
Возврат ТаблицаТестов;
|
Возврат ТаблицаТестов;
|
||||||
|
|
||||||
|
@ -3745,15 +3745,44 @@
|
|||||||
|
|
||||||
#Область Dropbox
|
#Область Dropbox
|
||||||
|
|
||||||
Функция ДропБокс_ЗагрузитьФайл() Экспорт
|
Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт
|
||||||
|
|
||||||
|
Ключ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Dropbox_Appkey");
|
||||||
|
Секрет = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Dropbox_Appsecret");
|
||||||
|
|
||||||
|
Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(Ключ);
|
||||||
|
|
||||||
|
// !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации");
|
||||||
|
|
||||||
|
Код = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Dropbox_Code");
|
||||||
|
|
||||||
|
Результат = OPI_Dropbox.ПолучитьТокен(Ключ, Секрет, Код);
|
||||||
|
|
||||||
|
Рефреш = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Dropbox_Refresh");
|
||||||
|
|
||||||
|
Результат = OPI_Dropbox.ОбновитьТокен(Ключ, Секрет, Рефреш);
|
||||||
|
|
||||||
|
// !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен");
|
||||||
|
|
||||||
|
Токен = Результат["access_token"];
|
||||||
|
|
||||||
|
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено();
|
||||||
|
|
||||||
|
OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ДропБокс_ЗагрузитьФайл() Экспорт
|
||||||
|
|
||||||
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Dropbox_Token");
|
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Dropbox_Token");
|
||||||
Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document");
|
Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Audio");
|
||||||
Путь = "/New/mydoc.docx";
|
Путь = "/New/Dogs.mp3";
|
||||||
|
|
||||||
Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, Файл, Путь);
|
Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, Файл, Путь);
|
||||||
|
|
||||||
КонецФункции
|
// !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user