Как загрузить из консоли файл по ссылке с яндекс диск
Чтобы получить URL для непосредственной загрузки файла, необходимо передать API путь на Диске, по которому загруженный файл должен быть доступен.
Загрузка файла на полученный URL
Пример URL для загрузки:
Формат ответа
Если запрос был обработан без ошибок, API отвечает кодом 200 OK . В теле ответа, в объекте Link, возвращается сгенерированный URL для скачивания файла.
Если запрос вызвал ошибку, возвращается подходящий код ответа, а тело ответа содержит описание ошибки.
URL. Может быть шаблонизирован, см. ключ templated .
Признак URL, который был шаблонизирован согласно RFC 6570. Возможные значения:
«true» — URL шаблонизирован: прежде чем отправлять запрос на этот адрес, следует указать нужные значения параметров вместо значений в фигурных скобках.
Для работы с клиентом используются следующие команды:
При вводе команды вы можете задать имя файла для хранения токена и путь к нему (FILE). Если дополнительные параметры не будут указаны, для хранения токена будет создан файл passwd в каталоге ~/.config/yandex-disk .
Вводить логин и пароль в клиенте не нужно. После вызова команды Диск предложит вам открыть определенную страницу в браузере и ввести там уникальный код.
start — запустить демон и синхронизировать все папки, кроме указанных в списке исключений exclude-dirs.
status — отобразить статус работы демона (состояние синхронизации, ошибки синхронизации, список синхронизированных файлов, общее и свободное пространство на Диске).
Формат запроса
Запрос URL для скачивания следует отправлять с помощью метода GET.
Путь к скачиваемому файлу. Например, %2Fbar%2Fphoto.jpg
Путь в значении параметра следует кодировать в URL-формате.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Путь к скачиваемому файлу. Например, %2Fbar%2Fphoto.jpg
Путь в значении параметра следует кодировать в URL-формате.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Программа для загрузки файлов
Сейчас можно приступить к разработке самой программы, назовем ее backup.py
Программа готова, добавим новую системную переменную
Теперь мы может загружать наши файлы из проводника используя переменную %backup%
Запрос URL для загрузки
Сообщив API Диска желаемый путь для загружаемого файла, вы получаете URL для обращения к загрузчику файлов.
Формат ответа
Если запрос был обработан без ошибок, API отвечает кодом 201 Created .
Дополнительные параметры [OPTION]
Указать файл конфигурации. По умолчанию используется файл config.cfg в каталоге ~/.config/yandex-disk .
Указать каталог для хранения локальной копии Диска. Если его название не было задано при выполнении начальной настройки, по умолчанию будет использоваться каталог ~/Yandex.Disk .
--auth=FILE, -a FILE
Указать файл с данными авторизации. По умолчанию используется файл passwd , который создается с помощью команды token или мастера начальной настройки и хранится в каталоге ~/.config/yandex-disk .
Не синхронизировать указанные каталоги. Чтобы настройка действовала всегда, каталоги необходимо добавить в список исключений exclude-dirs в файле config.cfg . Чтобы настройка действовала корректно, названия исключаемых директорий нужно перечислять через запятую, без пробелов.
Запретить изменение файлов на сервере Диска и выполнить синхронизацию только в локальной копии. При возникновении конфликтов синхронизации локальные файлы будут переименованы. Если дополнительно указан параметр --overwrite , локальные файлы будут перезаписаны.
При синхронизации с сервером разрешить перезапись изменений, сделанных в локальной копии Диска. Используется вместе с параметром --read-only .
Запустить демон без возврата управления в консоль. Чтобы вернуть управление, демон необходимо остановить, запустив в другой консоли команду yandex-disk stop или закрыв текущую консоль.
Если используется этот параметр, приложение не читает файл конфигурации. Поэтому все необходимые настройки нужно вводить через командную строку. Так, параметру exclude-dirs соответствует аргумент --exclude-dirs .
Примечание. При использовании --no-daemon не нужно указывать команду start : в этом режиме все команды игнорируются.
Сообщив API Диска желаемый путь для загружаемого файла, вы получаете URL для обращения к загрузчику файлов.
Создать приложение и получить токен
Зарегистрируем приложение на oauth.yandex.ru и назовем его к примеру Backup1 , укажем платформу "Веб-сервисы" (воспользуемся URL для разработки), и разрешим API полный доступ к Диску.
В ответ мы должны получить информацию о новом приложение, сейчас нас интересует его ID
Что бы получить отладочный токен перейдем по ссылке ниже, заменив ID приложения на свой
Формат запроса
Запрос URL для скачивания следует отправлять с помощью метода GET.
Путь к скачиваемому файлу. Например, %2Fbar%2Fphoto.jpg
Путь в значении параметра следует кодировать в URL-формате.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Путь к скачиваемому файлу. Например, %2Fbar%2Fphoto.jpg
Путь в значении параметра следует кодировать в URL-формате.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Формат запроса
Запрос URL для скачивания следует отправлять с помощью метода GET.
Путь к скачиваемому файлу. Например, %2Fbar%2Fphoto.jpg
Путь в значении параметра следует кодировать в URL-формате.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Путь к скачиваемому файлу. Например, %2Fbar%2Fphoto.jpg
Путь в значении параметра следует кодировать в URL-формате.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Формат ответа
Если запрос был обработан без ошибок, API отвечает кодом 200 OK . В теле ответа, в объекте Link, возвращается сгенерированный URL для скачивания файла.
Если запрос вызвал ошибку, возвращается подходящий код ответа, а тело ответа содержит описание ошибки.
URL. Может быть шаблонизирован, см. ключ templated .
Признак URL, который был шаблонизирован согласно RFC 6570. Возможные значения:
«true» — URL шаблонизирован: прежде чем отправлять запрос на этот адрес, следует указать нужные значения параметров вместо значений в фигурных скобках.
URL. Может быть шаблонизирован, см. ключ templated .
Признак URL, который был шаблонизирован согласно RFC 6570. Возможные значения:
«true» — URL шаблонизирован: прежде чем отправлять запрос на этот адрес, следует указать нужные значения параметров вместо значений в фигурных скобках.
Запрос URL для скачивания
Чтобы получить URL для непосредственной загрузки файла, необходимо передать API путь на Диске, по которому загруженный файл должен быть доступен.
Формат запроса
Запрос URL для загрузки следует отправлять с помощью метода GET.
Путь, по которому следует загрузить файл. Например, %2Fbar%2Fphoto.jpg . Максимальная длина имени загружаемого файла — 255 символов; максимальная длина пути — 32760 символов.
Путь в значении параметра следует кодировать в URL-формате.
Признак перезаписи файла. Учитывается, если файл загружается в папку, в которой уже есть файл с таким именем.
false — не перезаписывать файл, отменить загрузку (используется по умолчанию);
true — удалить файл с совпадающим именем и записать загруженный файл.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Путь, по которому следует загрузить файл. Например, %2Fbar%2Fphoto.jpg . Максимальная длина имени загружаемого файла — 255 символов; максимальная длина пути — 32760 символов.
Путь в значении параметра следует кодировать в URL-формате.
Признак перезаписи файла. Учитывается, если файл загружается в папку, в которой уже есть файл с таким именем.
false — не перезаписывать файл, отменить загрузку (используется по умолчанию);
true — удалить файл с совпадающим именем и записать загруженный файл.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
REST API Яндекс.Диск
Теперь можно потренироваться на полигоне.
Вы можете оценить, как работает API Яндекс.Диска, отправляя запросы из удобного интерфейса.
Для примера создадим папку, укажем ее имя и нажмем кнопку попробовать
Заходим на Яндекс Диск, и видим что папка появилась.
Так же попробуем удалить нашу ранее созданную папку, укажем ее имя и нажмем кнопку попробовать
Таким способом вы можете проверить работу всех функций.
Воспользуемся параметрами запроса из полигона, и с помощью библиотеки requests повторить все на Python.
Импортирует библиотеку, укажем заголовок запроса, url, и token
Напишем две функции для нашей будущей программы
Создать папку
Создаст папку hello world и API
Загрузить файл
Загрузит файл images.rar в папку hello world
Формат ответа
Если запрос был обработан без ошибок, API отвечает кодом 200 OK . В теле ответа, в объекте Link, возвращается сгенерированный URL для загрузки файла. Если в течение 30 минут этот URL не будет запрошен, он перестанет работать, и нужно будет запросить новую ссылку.
Если запрос вызвал ошибку, возвращается подходящий код ответа, а тело ответа содержит описание ошибки.
URL. Может быть шаблонизирован, см. ключ templated .
Признак URL, который был шаблонизирован согласно RFC 6570. Возможные значения:
«true» — URL шаблонизирован: прежде чем отправлять запрос на этот адрес, следует указать нужные значения параметров вместо значений в фигурных скобках.
URL. Может быть шаблонизирован, см. ключ templated .
Признак URL, который был шаблонизирован согласно RFC 6570. Возможные значения:
«true» — URL шаблонизирован: прежде чем отправлять запрос на этот адрес, следует указать нужные значения параметров вместо значений в фигурных скобках.
Возможные коды ответа при загрузке файла
API отвечает кодом 201 Created , если файл был загружен без ошибок.
202 Accepted — файл принят сервером, но еще не был перенесен непосредственно в Яндекс.Диск.
412 Precondition Failed — при дозагрузке файла был передан неверный диапазон в заголовке Content-Range .
413 Payload Too Large — размер файла превышает 10 ГБ.
500 Internal Server Error или 503 Service Unavailable — ошибка сервера, попробуйте повторить загрузку.
507 Insufficient Storage — для загрузки файла не хватает места на Диске пользователя.
Чтобы загрузить файл на Диск, необходимо:
Формат ответа
Если запрос был обработан без ошибок, API отвечает кодом 200 OK . В теле ответа, в объекте Link, возвращается сгенерированный URL для загрузки файла. Если в течение 30 минут этот URL не будет запрошен, он перестанет работать, и нужно будет запросить новую ссылку.
Если запрос вызвал ошибку, возвращается подходящий код ответа, а тело ответа содержит описание ошибки.
URL. Может быть шаблонизирован, см. ключ templated .
Признак URL, который был шаблонизирован согласно RFC 6570. Возможные значения:
«true» — URL шаблонизирован: прежде чем отправлять запрос на этот адрес, следует указать нужные значения параметров вместо значений в фигурных скобках.
Сегодня мы представляем долгожданный клиент Яндекс.Диска для Linux. Можно было бы даже сказать «специально для Хабрахабра», так как ни одно упоминание Диска здесь не обходилось без вопросов о клиенте для Линукса.
У него есть вся основная функциональность, которая есть у клиентов для OS X и Windows, и даже больше (симлинки!), и одна особенность — он консольный.
Ниже читайте о том, как он настраивается, что конкретно умеет, и о том, как именно он устроен и что в нём было непросто сделать.
Установить его можно здесь. Сразу после установки пакета в терминале появится команда yandex-disk, через которую в дальнейшем и идет общение с облаком Яндекса. После этого нужно вручную запустить команду setup.
Визард настройки позволяет в режиме диалога выбрать папку для синхронизации, включить автозапуск при старте системы, настроить работу через прокси-сервер (если конечно вы им пользуетесь) и авторизоваться в Яндекс.Диске. При настройке вручную первым делом необходимо авторизоваться. После этого в папке .config, расположенной в домашнем каталоге, будет создан конфиг, в котором можно будет настроить путь к папке синхронизации (можно указать в консоли вручную), прописать путь к файлу токена, указать папки, которые будут или не будут синхронизироваться, и прописать настройки прокси-сервера.
Команды
Подготовительная работа окончена, осталось запустить демон одной из команд. Они позволят вам синхронизировать файлы и папки и пользоваться ими везде, где есть интернет.
- Sync запустит демон, синхронизирует все, находящееся в папке Диска, и остановит демон.
- Start сделает то же самое, но без остановки демона после завершения синхронизации. При использовании start демон остается запущен и все изменения, происходящие в папке Диска, будут синхронизироваться автоматически.
- Введя в терминале stop, можно в любой момент остановить запущенный демон, если он вам мешает.
- Командой status можно узнать, в каком статусе находится ядро синхронизации.
Что умеет
Консольный клиент позволяет поделиться файлом или папкой с помощью команды publish (если файл находится не в папке диска, перед публикацией он будет туда скопирован). Ссылка будет доступна в терминале, и любой человек, пройдя по ней, сможет посмотреть или сохранить себе опубликованный вами файл или папку. Если случайно был опубликован не тот файл, с помощью команды unpublish можно закрыть доступ к публичному объекту.
В Яндекс.Диске возможна выборочная синхронизация. Команда exclude позволит исключить папку из синхронизации: все изменения, производимые в ней после этого, не будут отправлены в облако.
Опция read-only позволит менять файлы локально, без заливки их в облако. При возникновении конфликтов с локальными изменениями, последние будут сохранены в переименованных файлах, а изменения из облака будут синхронизированы. Опция overwrite будет перезаписывать локально измененные файлы в режиме read-only.
Не можем не похвастаться самым интересным нововведением в ядре синхронизации — отныне мы поддерживаем синхронизацию симлинков! Если возникнут трудности и вопросы в использовании консольного клиента команды man и help просто и доступно помогут в них разобраться.
Как сделан
Чтобы в будущем код можно было использовать для реализации клиентов под разные ОС, было принято решение писать его на C++. Специфичные для разных операционных систем куски кода мы вынесли в отдельные функции или классы, а под каждую платформу писали свою реализацию. В качестве основных кроссплатформенных библиотек мы взяли Boost, OpenSSL и JsonCpp, а системой контроля версий стал git. Клиент под Linux собирался с помощью autoconf. Код писался и отлаживался в связке KDevelop + консольный gdb, либо в Qt Creator'е (в зависимости от предпочтений разработчика).
Взаимодействие с облаком и синхронизация производятся с помощью библиотеки ядра Яндекс.Диска, которую используют десктопные клиенты сервиса.
Как работает
Для локализации мы используем библиотеку boost::locale. Текст внутри клиента закодирован в utf-8 и по необходимости преобразовывается в специфичном для каждой операционной системы коде. Мониторинг файловой системы для Linux использует inotify, прекрасно вписыващийся в асинхронную работу boost::asio.
Как устроена синхронизация
Синхронизация — сердце Яндекс.Диска, его ключевая возможность. Задача синхронизации файлового дерева с облаком делится на несколько независимых частей.
1. Мониторинг файловой системы. Ядро синхронизации Яндекс.Диска проектировалось и создавалось как переносимая абстракция, способная выполнять поставленные задачи на всех поддерживаемых платформах. Но такая проблема, как мониторинг файловой системы не реализуется ни стандартной библиотекой C++, ни даже такими монстрами как boost. Более того, даже используя «родное» API операционной системы, мы получаем набор событий, специфический для каждой платформы.
Для мониторинга файловой системы был спроектирован интерфейс «наблюдателя», способного следить за событиями в определённой директории и возвращающего список событий, произошедших в ней. Причём для каждой поддерживаемой платформы набор этих событий отличается. Например, Mac OS X способна сообщить только о факте какого-то изменения в одной из дочерних директорий без детализации. А вот Windows и Linux возвращают полный набор, включая создание, удаление, модификацию и перемещение объектов. Хотя практика показывала, что событиям на платформе Windows доверять не стоит и самым надёжным вариантом остаётся листинг директории после получения оповещения.
2. Индексация локальных файлов и директорий. Для контроля целостности и реализации дельта-обновления файлов ядро синхронизации Яндекс.Диска использует дайджесты — наборы контрольных сумм файла и отдельных его частей. Для всего файла мы рассчитываем стойкий хэш SHA-256 и набор менее стойких сумм для отдельных блоков. Каждый файл, находящийся в папке Яндекс.Диска и не попадающий в список исключений, должен быть проиндексирован. Но вычисление хэша SHA-256 -достаточно дорогая операция, а расчёт хэшей при каждом запуске ПО был бы непростительной тратой ресурсов. Поэтому после того, как завершается индексация файла, ядро синхронизации сохраняет полученный дайджест в «банке» — специальном хранилище, находящемся в служебной директории Яндекс.Диска. Для поиска дайджестов в хранилище используется уникальный идентификатор файла — inode (размер и время последнего изменения). К сожалению, подобный подход не лишён недостатков. Например, многие файлы-криптоконтейнеры сохраняют время последней модификации неизменным даже после записи.
Наверное, кроме тонкостей работы с символическими ссылками, ничего в листинге директорий не представляет особого интереса. Для успешного завершения синхронизации ядро должно обнаруживать и исключать из синхронизации циклические ветки.
Вообще, символические ссылки — это настоящая «головная боль» для ядра синхронизации. Они могут указывать в произвольные места файловой системы, и ни ко всем из них можно применять одинаковые правила синхронизации. Например, пакеты приложений Mac OS X очень часто содержат в себе символические ссылки на директории системных библиотек, и их синхронизация в облако была бы нежелательна — особенно между разными версиями ОС. Но в то же время возможность синхронизировать дополнительные директории с помощью символических ссылок — очень заманчивая возможность, упускать которую не хотелось.
Поэтому для синхронизации символических ссылок была введена особая политика, благодаря которой ядро может выбирать специфический вариант синхронизации для каждой символической ссылки — в зависимости от расположения объекта, на который она указывает.
3. Получение дерева облачной файловой системы. Для решения проблемы синхронизации мало иметь локальную файловую структуру и дайджесты файлов — необходимо получить текущее состояние файловой системы в облаке. Если бы ядру синхронизации каждый раз приходилось обходить дерево с помощью метода PROPFIND, то каждый цикл синхронизации занимал бы неоправданно много времени и создавал бы излишнюю нагрузку на канал. Поэтому ПО Яндекс.Диска использует специальный API, который даёт возможность получать текущее состояние дерева файлов в облаке и изменения, произошедшие в нём, начиная с некоторого известного момента, определяемого версией дерева.
4. Получение оповещений об изменении облачной файловой системы. Синхронизация файлов в реальном времени требует своевременного получения оповещений об изменениях, произошедших с файлами в облаке. Можно было бы использовать периодический опрос сервера клиентами, но, оценив возможное количество клиентов, мы пришли к выводу, что такой подход окажется слабо масштабируемым и приведёт к быстрой перегрузке инфраструктуры сервиса. После недолгих поисков мы остановились на протоколе XMPP. Одна из его реализаций уже долгое время работает в Яндексе. Она была разработана командой, которая позже занимались созданием сервера WebDAV для проекта Яндекс.Диск, поэтому сложностей с интеграцией этого протокола не возникло.
5. Создание списка операций синхронизации. После того как в распоряжении ядра синхронизации оказываются оба дерева файлов — локальное и удалённое — можно приступать к самой процедуре синхронизации. Для этого применяется специальный алгоритм сравнения деревьев, принимающий на вход кроме двух упомянутых деревьев, ещё и третье — последнее синхронизированное. В результате работы алгоритма получается список операций, которые необходимо произвести над локальными и удалёнными файлами и директориям для приведения деревьев к общему виду.
6. Обработка очереди операций синхронизации. Создание списка операций для локального и удалённого деревьев происходит независимо. В результате могут появиться конфликтующие операции. Например, удаление в облаке файла, который был в нём изменён и ещё не синхронизирован локально, или изменение файла одновременно локально и в облаке. Конфликты модификации/удаления всегда разрешаются ядром в пользу модификации, а конфликты двойной модификации разрешаются переименованием одной из версий файла. Таким образом мы можем гарантировать сохранность данных и даём возможность после завершения синхронизации самому пользователю решить, какое из изменений больше ему подходит в каждом конкретном случае.
Операции синхронизации должны подчиняться строгому порядку, нельзя передавать файл, пока не создана его родительская директория. Так же директорию нельзя удалять, пока внутри неё остаются файлы, которые нужно переместить на новое место. Алгоритм сравнения деревьев уже создаёт операции в нужном порядке, но при возникновении ошибок он может нарушиться. Для предотвращения этой ситуации у каждой операции есть список зависимостей — набор операций, которые должны завершиться до начала её выполнения, и набор операций, которые не должны начаться, пока она не будет выполнена.
Кроме зависимостей на порядок выполнения операций оказывает влияние её приоритет. Например, операции передачи файлов выполняются в зависимости от размеров файлов — от маленьких к большим.
Яндекс не ободряет когда его сервис используют только как хранилище для резервных копий.
Скачивание файла по полученному URL
Скачивать файл следует с помощью метода GET:
Если запрос был обработан без ошибок, API отвечает файлом с кодом 200 OK .
Чтобы скачать файл с Диска, необходимо:
Формат запроса
Запрос URL для загрузки следует отправлять с помощью метода GET.
Путь, по которому следует загрузить файл. Например, %2Fbar%2Fphoto.jpg . Максимальная длина имени загружаемого файла — 255 символов; максимальная длина пути — 32760 символов.
Путь в значении параметра следует кодировать в URL-формате.
Признак перезаписи файла. Учитывается, если файл загружается в папку, в которой уже есть файл с таким именем.
false — не перезаписывать файл, отменить загрузку (используется по умолчанию);
true — удалить файл с совпадающим именем и записать загруженный файл.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Путь, по которому следует загрузить файл. Например, %2Fbar%2Fphoto.jpg . Максимальная длина имени загружаемого файла — 255 символов; максимальная длина пути — 32760 символов.
Путь в значении параметра следует кодировать в URL-формате.
Признак перезаписи файла. Учитывается, если файл загружается в папку, в которой уже есть файл с таким именем.
false — не перезаписывать файл, отменить загрузку (используется по умолчанию);
true — удалить файл с совпадающим именем и записать загруженный файл.
Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.
Имена ключей следует указывать через запятую, а вложенные ключи разделять точками. Например: name,_embedded.items.path .
Читайте также: