mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2024-12-29 02:57: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
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
|
||||
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
|
||||
Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
|
||||
@ -54,7 +139,7 @@
|
||||
|
||||
Режим = ?(Перезаписывать, "overwrite", "add");
|
||||
Размер = Файл.Размер();
|
||||
Граница = 50000000;
|
||||
Граница = 5000000;
|
||||
|
||||
Если Размер > Граница Тогда
|
||||
Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
|
||||
@ -94,10 +179,50 @@
|
||||
|
||||
Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
|
||||
|
||||
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
|
||||
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"?>
|
||||
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="66ce7792-41e5-47e4-bfad-2dcff1c96287">
|
||||
<name>OPI_Dropbox</name>
|
||||
<synonym>
|
||||
<key>ru</key>
|
||||
<value>Drop box</value>
|
||||
</synonym>
|
||||
<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>
|
||||
|
@ -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.Закрыть();
|
||||
|
||||
Исключение
|
||||
@ -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;
|
||||
|
@ -209,6 +209,7 @@
|
||||
НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
|
||||
|
||||
НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
|
||||
НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс);
|
||||
|
||||
Возврат ТаблицаТестов;
|
||||
|
||||
|
@ -3745,15 +3745,44 @@
|
||||
|
||||
#Область 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_ПолучениеДанныхТестов.ПолучитьДвоичные("Document");
|
||||
Путь = "/New/mydoc.docx";
|
||||
Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Audio");
|
||||
Путь = "/New/Dogs.mp3";
|
||||
|
||||
Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, Файл, Путь);
|
||||
|
||||
КонецФункции
|
||||
// !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user