Загрузка файлов с яндекс диска без OAuth-токена

Публикация № 945965

Обработки - Универсальные обработки

Яндекс диск публичная папка обработка загрузка REST API

11
Приводится пример получения файлов по публичной ссылке, использую Яндекс API. Тестировалось на платформе 8.3.11.3034. Конфигурация 1C:ERP Управление предприятием 2 (2.4.5.41).

На Инфостарте есть не мало статей по работе  с Яндексом диском, но я не нашёл ни одной, которая бы демонстрировала работу без использования OAuth-авторизации.

//1c.a-franch.ru/public/561400/

//1c.a-franch.ru/public/853451/

//1c.a-franch.ru/public/536090/ И т.д.

Оказывается, если иметь публичную ссылку на директорию, то не обязательно получать токен для доступа к файлам.

В каждом запросе к чужим опубликованным ресурсам необходимо указывать публичный ключ, который возвращается Яндекс.Диском при публикации файла. OAuth-токен (и, соответственно, заголовок Authorization) в таких запросах указывать не нужно.

Источник: Операции над опубликованными файлами и папками (Описание Яндекс API)

Имеем: публичную ссылку на общую папку, куда сохраняются нужные нам документы для загрузки.

Чтобы получить конкретный файл или все файлы можно пойти двумя путями:

  1. Путь первый: лопатим в лоб

(В силу того, что описание получения файла по прямой ссылке было неверное (теперь исправили))

Get запросом получаем ответ сервера в формате JSON

Получим Метаинформацию об опубликованном ресурсе

Свойство Type указывает на тип файла, в нашем случае это расшаренная папка.

в public_url находится переданный нам публичный ключ для доступа к файлам.

А вот содержимое папки находится в Структуре _embedded. Там как раз и находится массив наших документов

Обходя массив элементов можно посмотреть всю информацию о каждом его элементе.

Нас же интересует свойство path  - которое содержит имя файла и file - ссылка на скачивание файла. Зная эти значения можно скопировать нужные нам файлы на диск.

Здесь, как и везде, наверное, присутствует ограничение на файлы размером не более 2 Гб. Сам не пробовал.

SSL = Новый ЗащищенноеСоединениеOpenSSL();
    Яндекс = новый HTTPСоединение("cloud-api.yandex.net",,,,,,SSL);
    HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/public/resources?public_key=https://yadi.sk/d/7VkxupioQEjcNQ&path=/");
    Ответ = Яндекс.Получить(HTTPЗапрос);
	Если Ответ.КодСостояния = 200 тогда
		Каталог = ВыбратьКаталогСохранения();
		Если НЕ Каталог = Неопределено Тогда
			ЧтениеJSON = Новый ЧтениеJSON;
			ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
			ЧтениеПубличнойПапки = ПрочитатьJSON(ЧтениеJSON);
			Если ЧтениеПубличнойПапки.свойство("_embedded") тогда
				СодержимоеПапки = ЧтениеПубличнойПапки._embedded;
				Если   СодержимоеПапки.Свойство("items")тогда
					Для каждого файл из СодержимоеПапки.items цикл
						Если  файл.Свойство("file") тогда
							СсылкаНаскачивание = файл.file;
							КопироватьФайл(файл.file,Каталог+файл.path);
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
    Иначе
        Сообщить("Что-то пошло не так, Код состояния = " + Ответ.КодСостояния);
    КонецЕсли;

 

      2. Путь второй Получение прямой ссылки на файл (Да-да, после 8 часового созерцания мануала и бесскончаемого количества получений ссылки "по примеру" до меня дошло, что в описании просто-напросто пропустили команду)

Итак: Второй вариант мало чем отличается от предыдущего, в плане запроса, но вот ответа сервера  - 3 параметра

Основной из них - href:  прямая ссылка на файл

 

SSL = Новый ЗащищенноеСоединениеOpenSSL();
	Яндекс = новый HTTPСоединение("cloud-api.yandex.net",,,,,,SSL);
	КаталогСохранения = ВыбратьКаталогСохранения();
	HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/public/resources/download?public_key=https://yadi.sk/d/7VkxupioQEjcNQ&path=/Test3.xlsx");
	Ответ = Яндекс.Получить(HTTPЗапрос);
	Если Ответ.КодСостояния = 200 тогда
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
		СсылкаНаСкачиваниеФайла = ПрочитатьJSON(ЧтениеJSON);
		Если ЗначениеЗаполнено(СсылкаНаСкачиваниеФайла.href) тогда
			КопироватьФайл(СсылкаНаСкачиваниеФайла.href,КаталогСохранения+"\Test3.xlsx");
		КонецЕсли;
	ИначеЕсли Ответ.КодСостояния = 404 тогда
		Сообщить("Файл не найден");
	Иначе
		Сообщить("Что-то пошло не так, Код состояния = " + Ответ.КодСостояния);
	КонецЕсли;

Источник: https://tech.yandex.ru/disk/api/reference/public-docpage/

Надеюсь мой пример получения файлов из  публичных папок будет Вам полезен.

P.S. Тех поддержка Яндекса исправила описание API.

P.P.S. Кому трудно скопипастить код, ниже прикреплю обработку с 2 вариантами получения файлов.

11

Скачать файлы

Наименование Файл Версия Размер
Загрузка файлов с яндекс диска без OAuth-токена:
.epf 6,68Kb
19.11.18
0
.epf 6,68Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. u_n_k_n_o_w_n 31 09.01.19 06:56 Сейчас в теме
Отличная статья! Все работает! Спасибо.
2. deniseek77 86 13.03.19 12:46 Сейчас в теме
Скачивается файл размером 0 байт и не открывается, если скачивать таким методом...Не понятно, почему возникает такая ошибка
3. login1020 40 13.03.19 14:07 Сейчас в теме
(2) в Вашем случае мы получаем ошибку
HTTP 422
No parameter: content_type,
чтобы это убрать нужно добавить Заголовок и в нем Указать какое значение принимает параметр Content-Type
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type:", "application/json; charset=utf-8");


и в самом соединении указать заголовок, как параметр
HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/public/resources/download?public_key=https://yadi.sk/d/..................",Заголовки);
4. deniseek77 86 13.03.19 14:11 Сейчас в теме
У меня ошибки не выдавал. Но и скачивая записывал пустой файл, как если просто использовать метод КопироватьФайл();
5. login1020 40 13.03.19 14:15 Сейчас в теме
(4) все правильно, скачивается пустой файл, т.к. не удалось определить тип получаемого файла, если бы Вы из отладки взяли прямую ссылку и поместили в строку браузера, то увидели бы: HTTP 422
No parameter: content_type,
6. login1020 40 13.03.19 14:18 Сейчас в теме
(4) Заголовок-сущность Content-Type используется для того, чтобы определить MIME тип ресурса.

В ответах сервера заголовок Content-Type сообщает клиенту, какой будет тип передаваемого контента. В некоторых случаях браузеры пытаются сами определить MIME тип передаваемого контента, но их реакция может быть неадекватной.

MIME-тип (называемый "media type", а иногда "content type") - это строка, отправляемая вместе с файлом, которая указывает тип файла. (например, передаваемый аудиофайл может быть помечен как audio/ogg тип, а изображение - image/png). MIME-тип играет точно такую же роль, как и расширение файла в системе Windows. Когда HTTP-сообщение содержит Content-type заголовок, тело запроса будет парситься в соответствии с MIME-типом, указанным в заголовке.

как-то так
7. volconok27 29 03.04.19 13:45 Сейчас в теме
Здравствуйте, спасибо за статью, очень пригодилась. Подскажите еще, если в публичной папке есть еще папки, как извлечь из них файлы? Спасибо
8. login1020 40 03.04.19 14:00 Сейчас в теме
(7) Спускаться дальше по структуре вложения, и перед скачиванием указывать полный путь до элемента.
У (4) возникла проблема, что не получалось при большой вложенности скопировать файл, копировался пустой файл, однако путь на копирование был верный, если скопировать в строку браузера полученный путь, то файл успешно копировался на диск.
Копировался медиа контент (картинки), возможно, с документами такой проблемы нет.
Я тогда так и не понял, причину такого поведения.

В проблему большой вложенности особо не углублялся, на досуге посмотрю.
9. volconok27 29 03.04.19 15:28 Сейчас в теме
(8) Т.е. обходя в цикле все файлы в публичной папке, наткнувшись еще на одну папку я должна создать новый HTTPЗапрос с указанием пути к новой папке и обходить файлы в ней? Или есть какой-то специальный метод?
Прикрепленные файлы:
Оставьте свое сообщение