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

20.11.18

Интеграция - WEB-интеграция

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

Скачать исходный код

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

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

//infostart.ru/public/561400/

//infostart.ru/public/853451/

//infostart.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 вариантами получения файлов.

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

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15955    13    18    

13

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    89037    163    216    

318

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25893    9    0    

7

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16498    42    49    

23

Merlion Commander Версия 1.3.9.2 - июль 2022 г. (Интеграция с 1С: УT, редакция 11.4, 1С:Розница 2.3,1С:ERP Управление предприятием 2, УТ 10.3, редакция веб-сервиса MERLION API 3.0 от 18.08.2021)

Оптовая торговля Розничная торговля WEB-интеграция Платформа 1С v8.3 1С:Управление торговлей 11 Россия Платные (руб)

Расширении конфигурации "Управление торговлей, редакция 11" для работы с веб-сервисом Мерлион с помощью Merlion API. Расширение и набор подключаемых дополнительных обработок позволяет без изменения конфигурации получить возможность работы с API крупнейшего российского дистрибьютора http://merlion.com. Логика работы максимально приближена к работе веб-сервиса b2b. Вы сможете создать и исправить заказ, зарезервировать товар прямо из 1С, посмотреть актуальные остатки и цены, импортировать штрихкода EAN13 товаров, загружать заказ c автоматическим созданием номенклатуры в 1С и корректности создания. Можно выбирать характеристики по товарным группам и загружать товар с выбранными характеристиками, загружать изображения товара. Не требуется установки дополнительного ПО для работы с веб-сервисом. Кроссплатформенное решение для ОС Windows и Linux. Весь код модулей открыт и доступен для просмотра и внесения изменений.

8280 руб.

02.05.2017    41109    43    64    

50
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. u_n_k_n_o_w_n 34 09.01.19 06:56 Сейчас в теме
Отличная статья! Все работает! Спасибо.
2. deniseek77 86 13.03.19 12:46 Сейчас в теме
Скачивается файл размером 0 байт и не открывается, если скачивать таким методом...Не понятно, почему возникает такая ошибка
simuljakr; SergeyRomanov; +2 Ответить
3. login1020 133 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/..................",Заголовки);
16. Вурдалак 23 20.10.20 07:14 Сейчас в теме
(3) а мне вот не помогли никакие Заголовки. Что по первому методу, что по второму скачиваются пустые файлы, хотя если полученную ссылку вставить в браузер все скачивается нормально. Тоже не могу понять в чем дело
SergeyRomanov; +1 Ответить
4. deniseek77 86 13.03.19 14:11 Сейчас в теме
У меня ошибки не выдавал. Но и скачивая записывал пустой файл, как если просто использовать метод КопироватьФайл();
SergeyRomanov; +1 Ответить
5. login1020 133 13.03.19 14:15 Сейчас в теме
(4) все правильно, скачивается пустой файл, т.к. не удалось определить тип получаемого файла, если бы Вы из отладки взяли прямую ссылку и поместили в строку браузера, то увидели бы: HTTP 422
No parameter: content_type,
6. login1020 133 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 46 03.04.19 13:45 Сейчас в теме
Здравствуйте, спасибо за статью, очень пригодилась. Подскажите еще, если в публичной папке есть еще папки, как извлечь из них файлы? Спасибо
8. login1020 133 03.04.19 14:00 Сейчас в теме
(7) Спускаться дальше по структуре вложения, и перед скачиванием указывать полный путь до элемента.
У (4) возникла проблема, что не получалось при большой вложенности скопировать файл, копировался пустой файл, однако путь на копирование был верный, если скопировать в строку браузера полученный путь, то файл успешно копировался на диск.
Копировался медиа контент (картинки), возможно, с документами такой проблемы нет.
Я тогда так и не понял, причину такого поведения.

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

А вы как решили эту задачу ?
10. boba13 81 18.08.19 19:27 Сейчас в теме
Спасибо за код.

В прямом виде не заработало по ссылке из href. Если файл копировать через HTTP-соединение, то получим код ответа: 302. Перенаправляет на https://s351myt.storage.yandex.net/rdisk/....
Оттуда уже файл нормально копируется.
11. demon752 10.11.19 21:44 Сейчас в теме
12. wrooom 176 23.12.19 02:31 Сейчас в теме
Вот так с переадресацией работает:
SSL = Новый ЗащищенноеСоединениеOpenSSL();
	Яндекс = новый HTTPСоединение("cloud-api.yandex.net",,,,,,SSL);
	КаталогСохранения = "C:\ttt";
	HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/public/resources/download?public_key=https://yadi.sk/d/_мой_файл_&path=/goods.zip");
	Ответ = Яндекс.Получить(HTTPЗапрос);
	Если Ответ.КодСостояния = 200 тогда
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
		СсылкаНаСкачиваниеФайла = ПрочитатьJSON(ЧтениеJSON);
		Если ЗначениеЗаполнено(СсылкаНаСкачиваниеФайла.href) тогда
			//КопироватьФайл(СсылкаНаСкачиваниеФайла.href,КаталогСохранения+"\1.txt");
			Соединение = Новый HTTPСоединение(СтрЗаменить(СсылкаНаСкачиваниеФайла.href,"https://",""),,,,,,
			Новый ЗащищенноеСоединениеOpenSSL()
			);
			
			Запрос = Новый HTTPЗапрос("");
			Результат = Соединение.Получить(Запрос);
			Если Результат.КодСостояния = 302 Тогда
				
				КопироватьФайл(Результат.Заголовки.Получить("Location"),КаталогСохранения+"\goods.zip");
				
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли Ответ.КодСостояния = 404 тогда
		Сообщить("Файл не найден");
		Возврат;
	Иначе
		Сообщить("Что-то пошло не так, Код состояния = " + Ответ.КодСостояния);
		Возврат;
	КонецЕсли;
Показать
julia-dev; ElVaska; Вурдалак; SergeyRomanov; +4 Ответить
17. Вурдалак 23 20.10.20 11:12 Сейчас в теме
(12) как ни странно подумал, что Ваш ответ не относится к моей ситуации, когда файл загружается пустым. И в итоге методом проб и ошибок пришел точно к такому же результату, хотел уже было его запостить, но тут попался Ваш коммент. И да, походу по СсылкаНаСкачиваниеФайла.href хранится только заголовок файла, а сам файл уже в "Location"
julia-dev; +1 Ответить
13. DanDy 52 06.05.20 18:00 Сейчас в теме
Спасибо, час ковырялся, не мог понять почему не работает. На гуглил эту статью и всё встало на свои места
14. aleksxx 71 14.08.20 08:33 Сейчас в теме
У меня другая проблема, есть файл, есть его путь.
https://yandex.ru/dev/disk/api/reference/publish-docpage/
Публикую его, чтобы пользователю дать внешнюю ссылку, но как получить ее?
Возвращает только апи код какой-то:

{"href":"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2F%D0%9B%D0%B8%D1%81%D1%82+Microsoft+Excel.xlsx","method":"GET","templated":false}

HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/resources/publish?path=" + path, Заголовки);
Соединение = Новый HTTPСоединение("cloud-api.yandex.net",,,,,, ЗащищенноеСоединение);
Результат = Соединение.ВызватьHTTPМетод("PUT", HTTPЗапрос);
			
СтрокаЗагрузки = "";
	
Если Результат.КодСостояния <> 200 Тогда
		
	ВызватьИсключение "Ошибка при получении URL для загрузки." + Символы.ПС + Результат.ПолучитьТелоКакСтроку();
		
Иначе
		
	Сообщить("URL для загрузки файла получен успешно." + Символы.ПС + Результат.ПолучитьТелоКакСтроку());
										
КонецЕсли;
Показать
15. login1020 133 19.08.20 11:39 Сейчас в теме
(14) а можно ссылку на файл, что Вы публикуете?
18. marat.coolls 13.05.21 23:37 Сейчас в теме
Мне выдет - Файл не найден.


SSL = Новый ЗащищенноеСоединениеOpenSSL();
	Яндекс = новый HTTPСоединение("cloud-api.yandex.net",,,,,,SSL);
	//КаталогСохранения = ВыбратьКаталогСохранения();
	HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/public/resources/download?public_key=https://yadi.sk/d/jGbwG3PGpt3am/LM0103C.jpg");
	//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,"D:\123456.jpg");
		КонецЕсли;
	ИначеЕсли Ответ.КодСостояния = 404 тогда
		Сообщить("Файл не найден");
	Иначе
		Сообщить("Что-то пошло не так, Код состояния = " + Ответ.КодСостояния);
	КонецЕсли;
Показать


Может ссылка не так?
19. rom-x 152 25.06.23 09:30 Сейчас в теме
(18)
Попробуйте так и токен добавьте.

СтрокаДляКодировки = КодироватьСтроку(public_key, СпособКодированияСтроки.КодировкаURL)
    + "&path=" + КодироватьСтроку(path, СпособКодированияСтроки.КодировкаURL);
    
	Заголовки = СформироватьЗаголовки();
    
    HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/public/resources/download?public_key=" + СтрокаДляКодировки, Заголовки); 

Функция СформироватьЗаголовки()
	
	Перем Заголовки;
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Accept", "application/json");
	Заголовки.Вставить("Content-Type", "application/json");
	Заголовки.Вставить("Authorization", "OAuth " + Токен);
	Возврат Заголовки;

КонецФункции
Показать


У меня часть фото не загружалось без токена, была ошибка 404.
simuljakr; +1 Ответить
22. simuljakr 203 26.10.23 15:03 Сейчас в теме
23. simuljakr 203 26.10.23 15:07 Сейчас в теме
(19)
Понял , что public_key это не токен)

Токен получил по этой инструкции:
https://yandex.ru/dev/direct/doc/start/token.html?ysclid=lo750u62tl704013192

public_key - это ссылка на папку Яндекс Диска ?
20. simuljakr 203 19.10.23 12:44 Сейчас в теме
Здравствуйте.
Все работает. Спасибо.
Но не получается считать файлы из вложенных папок....

Я считываю в цикле названия вложенных папок, и формирую новую строку для HTTPЗапроса - прибавляя к исходному имени папки, имя вложенной папки.... Но не работает... HTTPЗапрос выдает ошибку 404....
Хотя если вставить полученный таким образом путь в браузер - то папка откроется...

Удалось ли кому-нибудь считать данные из вложенных папок ?
26. simuljakr 203 26.10.23 16:23 Сейчас в теме
(20) Разобрался !!!!

Надо имя вложенной папки писать в параметр path !
А параметр public_key всегда остается неизмнным !!!

И после этого формировать новый http-запрос
21. simuljakr 203 19.10.23 12:55 Сейчас в теме
И еще заметил такую особенность: считывается не все содержимое папки.... Часть вложенных файлов и папок не считывается...

Кто-нибудь сталкивался с такой ошибкой ?
Как исправить ?
24. simuljakr 203 26.10.23 15:42 Сейчас в теме
Столкнулся с таким ограничением Яндекса - если в целевой папке много подпапко - то по-умолчанию возвращает только первые 20 штук. Если надо больше - то нужно передать в запросе параметр:

&limit=КоличествоВложенныхПодпапок



см. скриншот:

IMAGE
27. simuljakr 203 26.10.23 20:36 Сейчас в теме
В общем все заработало !

Программа будет в автоматическом режиме мониторить раз в сутки Яндекс диск - и при появлении на нем новых картинок - будет прикреплять их к карточке товара.

Сопоставление картинок будет производиться по НаименованиеФайлаНаЯндексДиске=АртикулТовараВ1С

Работает не особо быстро....
На Яндекс диске более 8 тысяч файлов, и все они еще по разным папкам....
Построение списка с таким количеством файлов идет около 3-х минут....

Интересно - забанит ли меня Яндекс за запросы в цикле ??
28. simuljakr 203 26.10.23 20:37 Сейчас в теме
(0) Прикольно я тут сам с собой общаюсь ))
Оставьте свое сообщение