На Инфостарте есть не мало статей по работе с Яндексом диском, но я не нашёл ни одной, которая бы демонстрировала работу без использования OAuth-авторизации.
//infostart.ru/public/536090/ И т.д.
Оказывается, если иметь публичную ссылку на директорию, то не обязательно получать токен для доступа к файлам.
В каждом запросе к чужим опубликованным ресурсам необходимо указывать публичный ключ, который возвращается Яндекс.Диском при публикации файла. OAuth-токен (и, соответственно, заголовок Authorization
) в таких запросах указывать не нужно.
Источник: Операции над опубликованными файлами и папками (Описание Яндекс API)
Имеем: публичную ссылку на общую папку, куда сохраняются нужные нам документы для загрузки.
Чтобы получить конкретный файл или все файлы можно пойти двумя путями:
- Путь первый: лопатим в лоб
(В силу того, что описание получения файла по прямой ссылке было неверное (теперь исправили))
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 вариантами получения файлов.