1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-31 03:10:45 +02:00
OpenIntegrations/OInt/core/Modules/OPI_Dropbox.os

395 lines
20 KiB
Plaintext
Raw Normal View History

// Расположение 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
// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file
// Путь - Строка - Путь сохранения на Dropbox - path
// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
Режим = ?(Перезаписывать, "overwrite", "add");
Размер = Файл.Размер();
Граница = 100000000;
Если Размер > Граница Тогда
Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
Иначе
Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим);
КонецЕсли;
Возврат Ответ;
КонецФункции
// Удалить объект
// Удаляет объект с облачного диска
//
// Параметры:
// Токен - Строка - Токен - token
// Путь - Строка - Путь к объекту удаления - path
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция УдалитьОбъект(Знач Токен, Знач Путь) Экспорт
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
// Путь - Строка - Целевой путь создания каталога - path
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
URL = "https://api.dropboxapi.com/2/files/create_folder_v2";
Ответ = ОбработатьОбъект(Токен, URL, Путь);
Возврат Ответ;
КонецФункции
// Скачать файл
// Скачивает файл по указанному пути или ID
//
// Параметры:
// Токен - Строка - Токен - token
// Путь - Строка - Путь или ID файла - path
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт
URL = "https://api.dropboxapi.com/2/files/download";
Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
Возврат Ответ;
КонецФункции
// Скачать папку
// Скачивает zip архив с содержимым указанного каталога
//
// Параметры:
// Токен - Строка - Токен - token
// Путь - Строка - Путь или ID каталога - path
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт
URL = "https://api.dropboxapi.com/2/files/download_zip";
Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь)
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры);
Если ВЗаголовках Тогда
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
Ответ = OPI_Инструменты.Post(URL, , Заголовки);
Иначе
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "")
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization" , "Bearer " + Токен);
Если ЗначениеЗаполнено(Параметры) Тогда
JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет");
JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, "");
Заголовки.Вставить("Dropbox-API-Arg", JSON);
КонецЕсли;
Возврат Заголовки;
КонецФункции
Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2";
РазмерЧасти = 100000000;
ТекущаяПозиция = 0;
ПрочитаноБайт = 0;
ОбщийРазмер = Файл.Размер();
Сессия = ОткрытьСессию(Токен);
Пока ПрочитаноБайт < ОбщийРазмер Цикл
Отступ = ТекущаяПозиция;
Курсор = Новый Структура("offset,session_id", Отступ, Сессия);
Параметры = Новый Структура("cursor", Курсор);
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
ЧтениеДанных = Новый ЧтениеДанных(Файл);
ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
РазмерТекущих = ТекущиеДанные.Размер();
СледующаяПозиция = ТекущаяПозиция + РазмерТекущих;
Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
Прервать;
КонецЕсли;
Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки);
ТекущаяПозиция = СледующаяПозиция;
КБайт = 1024;
МБайт = КБайт * КБайт;
Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
ВыполнитьСборкуМусора();
ОсвободитьОбъект(ТекущиеДанные);
КонецЦикла;
Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
Возврат Ответ;
КонецФункции
Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
URL = "https://content.dropboxapi.com/2/files/upload";
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , "Булево", Параметры);
OPI_Инструменты.ДобавитьПоле("mode" , Режим, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("mute" , Ложь , "Булево", Параметры);
OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , "Булево", Параметры);
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки);
Возврат Ответ;
КонецФункции
Функция ОткрытьСессию(Знач Токен)
SessionId = "session_id";
URL = "https://content.dropboxapi.com/2/files/upload_session/start";
Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
Возврат Ответ[SessionId];
КонецФункции
Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия)
URL = "https://content.dropboxapi.com/2/files/upload_session/finish";
Коммит = Новый Структура();
OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит);
OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит);
Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия);
Параметры = Новый Структура("commit,cursor", Коммит, Курсор);
Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
Возврат Ответ;
КонецФункции
#КонецОбласти