1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-25 02:42:28 +02:00

Google Drive: загрузка, скачивание, копирование файлов

This commit is contained in:
Anton 2024-03-12 19:23:03 +03:00
parent 3b14128dfd
commit 57f4d81698
5 changed files with 348 additions and 12 deletions

View File

@ -29,6 +29,33 @@
#Область РаботаСФайлами
// Получить информацию об объекте.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор файла/каталога
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Получить список каталогов.
//
// Параметры:
// Токен - Строка - Токен
// ИмяСодержит - Строка - Отбор по имени
// Подробно - Булево - Добавляет список файлов к полям каталога
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий каталогов
Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
@ -51,6 +78,15 @@
КонецФункции
// Получить список файлов.
//
// Параметры:
// Токен - Строка - Токен
// ИмяСодержит - Строка - Отбор по имени
// Каталог - Строка - Отбор по ID каталога-родителя
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Массив соответствий файорв
Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
@ -73,16 +109,127 @@
КонецФункции
Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт
// Загрузить файл.
//
// Параметры:
// Токен - Строка - Токен
// Файл - ДвоичныеДанные,Строка - Файл или путь к файлу
// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт
MIME = Описание["MIME"];
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
Если ТипЗнч(Файл) <> Тип("ДвоичныеДанные") Тогда
Файл = Новый ДвоичныеДанные(Файл);
КонецЕсли;
СоответствиеФайла = Новый Соответствие;
СоответствиеФайла.Вставить(Файл, MIME);
СформироватьПараметрыЗагрузкиФайла(Описание);
Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
Возврат Ответ;
КонецФункции
// Скачать файл.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор файла
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция СкачатьФайл(Знач Токен, Знач Идентификатор) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
Параметры = Новый Соответствие;
Параметры.Вставить("alt", "media");
Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки);
Возврат Ответ;
КонецФункции
// Удалить объект.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор объекта для удаления
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
Возврат Ответ;
КонецФункции
// Скоприровать объект.
//
// Параметры:
// Токен - Строка - Токен
// Идентификатор - Строка - Идентификатор объекта
// НовоеИмя - Строка - Новое имя объекта
// НовыйРодитель - Строка - Новый каталог размещения
//
// Возвращаемое значение:
// HTTPОтвет - Ответ сервера Google
Функция СкоприроватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy";
Параметры = Новый Структура;
Если ЗначениеЗаполнено(НовоеИмя) Тогда
Параметры.Вставить("name", НовоеИмя);
КонецЕсли;
Если ЗначениеЗаполнено(НовыйРодитель) Тогда
МассивРодителей = Новый Массив;
МассивРодителей.Добавить(НовыйРодитель);
Параметры.Вставить("parents", МассивРодителей);
КонецЕсли;
Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина);
Возврат Ответ;
КонецФункции
// Получить описание файла.
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Получить описание файла
Функция ПолучитьОписаниеФайла() Экспорт
Описание = Новый Соответствие;
Описание.Вставить("MIME" , "image/jpeg");
Описание.Вставить("Имя" , "Новый файл.jpg");
Описание.Вставить("Описание" , "Это новый файл");
Описание.Вставить("Родитель" , Неопределено);
Возврат Описание;
КонецФункции
#КонецОбласти
#КонецОбласти
@ -95,6 +242,7 @@
Files = "files";
NPT = "nextPageToken";
Параметры = Новый Структура;
Параметры.Вставить("fields", "*");
Если ЗначениеЗаполнено(Страница) Тогда
Параметры.Вставить("pageToken", Страница);
@ -139,4 +287,38 @@
КонецПроцедуры
Процедура СформироватьПараметрыЗагрузкиФайла(Описание)
СформированноеОписание = Новый Соответствие;
OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание);
СоотвтетствиеПолей = Новый Соответствие;
СоотвтетствиеПолей.Вставить("MIME" , "mimeType");
СоотвтетствиеПолей.Вставить("Имя" , "name");
СоотвтетствиеПолей.Вставить("Описание" , "description");
СоотвтетствиеПолей.Вставить("Родитель" , "parents");
СоотвтетствиеПолей.Вставить("Расширение", "fileExtension");
Для Каждого Элемент Из Описание Цикл
Если Элемент.Ключ = "Родитель" Тогда
ТекущееЗначение = Новый Массив;
ТекущееЗначение.Добавить(Элемент.Значение);
Иначе
ТекущееЗначение = Элемент.Значение;
КонецЕсли;
ИмяПоля = СоотвтетствиеПолей.Получить(Элемент.Ключ);
СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение);
КонецЦикла;
Описание = OPI_Инструменты.JSONСтрокой(СформированноеОписание);
КонецПроцедуры
#КонецОбласти

View File

@ -6,4 +6,6 @@
<value>OPI google drive</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -1,4 +1,4 @@
// MIT License
// MIT License
// Copyright (c) 2023 Anton Tsitavets
@ -78,6 +78,10 @@
КонецФункции
Функция PostMultipartRelated(Знач URL, Знач JSON, Знач Файлы, Знач ДопЗаголовки) Экспорт
Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки);
КонецФункции
#КонецОбласти
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
@ -365,6 +369,44 @@
КонецФункции
Функция ВыполнитьЗапросМультипартРелэйтед(URL, Вид, JSON, Файлы, ДопЗаголовки)
Переадресация = 300;
Ошибка = 400;
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/related; boundary=" + Boundary;
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Соединение = СоздатьСоединение(Сервер);
ТелоЗапроса = Запрос.ПолучитьТелоКакПоток();
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", "", Ложь);
ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
ДобавитьContentLength(Запрос);
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадресация Тогда
Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"], "POST", JSON, Файлы, ДопЗаголовки);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "")
Заголовки = Новый Соответствие;
@ -385,7 +427,7 @@
КонецЕсли;
НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
Возврат НовыйЗапрос;
КонецФункции
@ -523,6 +565,51 @@
КонецПроцедуры
Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы)
РазделительСтрок = Символы.ВК + Символы.ПС;
Для Каждого Файл Из Файлы Цикл
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.Записать(Файл.Ключ);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON)
РазделительСтрок = Символы.ВК + Символы.ПС;
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8");
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку(JSON);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
КонецПроцедуры
Процедура ДобавитьContentLength(Запрос)
ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
Размер = ТелоЗапроса.Размер();
Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер));
КонецЕсли;
КонецПроцедуры
Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция)
Для Каждого ЭлементКоллекции Из Коллекция Цикл

View File

@ -163,13 +163,13 @@
МассивРазделов = Новый Массив;
МассивРазделов.Добавить("Телеграм");
МассивРазделов.Добавить("ВКонтакте");
МассивРазделов.Добавить("Яндекс.Диск");
МассивРазделов.Добавить("Google Calendar");
МассивРазделов.Добавить("Twitter");
МассивРазделов.Добавить("Viber");
МассивРазделов.Добавить("Google Drive");
МассивРазделов.Добавить("Twitter");
МассивРазделов.Добавить("Яндекс.Диск");
МассивРазделов.Добавить("Google Workspace");
МассивРазделов.Добавить("Google Calendar");
МассивРазделов.Добавить("Google Drive");
Возврат МассивРазделов;
КонецФункции
@ -255,6 +255,7 @@
НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий" , "Получить список событий" , Календарь);
НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов" , "Получить список каталогов" , Драйв);
НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить Файл" , Драйв);
НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , Твиттер);
НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен" , "Обновить токен" , Твиттер);

View File

@ -892,7 +892,7 @@
Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры);
OPI_Инструменты.Пауза(5);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) .ИмеетТип("Массив").ИмеетДлину(2);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2);
OPI_Инструменты.Пауза(5);
@ -1740,8 +1740,72 @@
Процедура ГД_ПолучитьСписокКаталогов() Экспорт
MimeType = "mimeType";
Name = "name";
Имя = "ОПИ";
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, "ОПИ", Истина);
Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина);
Каталог = Результат[0];
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Каталог["files"]).ИмеетТип("Массив");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Каталог[MimeType]).Равно("application/vnd.google-apps.folder");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Каталог[Name]).Равно(Имя);
OPI_Инструменты.Пауза(5);
Идентификатор = Каталог["id"];
OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Каталог", Идентификатор);
Каталог = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Каталог[MimeType]).Равно("application/vnd.google-apps.folder");
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Каталог[Name]).Равно(Имя);
OPI_Инструменты.Пауза(5);
КонецПроцедуры
Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт
MimeType = "mimeType";
Name = "name";
Id_ = "id";
МассивУдаляемых = Новый Массив;
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Картинка");
Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Каталог");
Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла();
Описание.Вставить("Родитель", Каталог);
Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание["MIME"]);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]);
Идентификатор = Результат[Id_];
МассивУдаляемых.Добавить(Идентификатор);
НовоеИмя = "Скопированный файл.jpeg";
Результат = OPI_GoogleDrive.СкоприроватьОбъект(Токен, Идентификатор, НовоеИмя, "root");
OPI_Инструменты.Пауза(5);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание["MIME"]);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
МассивУдаляемых.Добавить(Результат[Id_]);
Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
Для Каждого Удаляемый Из МассивУдаляемых Цикл
Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).Равно("");
OPI_Инструменты.Пауза(2);
КонецЦикла;
OPI_Инструменты.Пауза(5);
КонецПроцедуры