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