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

20.11.18

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Загрузка файлов с яндекс диска без OAuth-токена:
.epf 6,68Kb
13
13
1 SM
Скачать Купить за 1 850 руб.

На Инфостарте есть не мало статей по работе  с Яндексом диском, но я не нашёл ни одной, которая бы демонстрировала работу без использования 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

См. также

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    19024    10    16    

16

Управление взаимоотношениями с клиентами (CRM) WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Подсистема интеграции Amo CRM с 1С: технические требования, порядок работы, возможности, доработки и обновления. Бесплатный период техподдержки - 1 месяц.

60000 руб.

07.05.2019    31887    62    40    

23

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

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

36000 руб.

03.08.2020    16773    15    19    

15

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

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

12000 руб.

02.02.2021    17014    45    49    

26

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13383    36    8    

15

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    87251    26    51    

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

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

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

В прямом виде не заработало по ссылке из href. Если файл копировать через HTTP-соединение, то получим код ответа: 302. Перенаправляет на https://s351myt.storage.yandex.net/rdisk/....
Оттуда уже файл нормально копируется.
11. demon752 10.11.19 21:44 Сейчас в теме
12. wrooom 214 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 тогда
		Сообщить("Файл не найден");
		Возврат;
	Иначе
		Сообщить("Что-то пошло не так, Код состояния = " + Ответ.КодСостояния);
		Возврат;
	КонецЕсли;
Показать
Dmitrij-2; julia-dev; ElVaska; Вурдалак; SergeyRomanov; +5 Ответить
17. Вурдалак 23 20.10.20 11:12 Сейчас в теме
(12) как ни странно подумал, что Ваш ответ не относится к моей ситуации, когда файл загружается пустым. И в итоге методом проб и ошибок пришел точно к такому же результату, хотел уже было его запостить, но тут попался Ваш коммент. И да, походу по СсылкаНаСкачиваниеФайла.href хранится только заголовок файла, а сам файл уже в "Location"
julia-dev; +1 Ответить
13. DanDy 53 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 136 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) Прикольно я тут сам с собой общаюсь ))
Оставьте свое сообщение