яндекс диск api php

Простая работа с Yandex Disk API

Некоторое время назад мы уже рассматривали работу с Google Drive API на PHP.

На этот раз рассмотрим работу с Яндекс.Диск API на PHP. В этом примере я буду использовать библиотеку nixsolutions/yandex-php-library.

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

Описывать подробно процесс получения токена не стану, т.к. это выходит за рамки данной статьи. Однако, чтобы получить токен, для начала необходимо авторизироваться в Яндекс и попробовать создать новое приложение (в качестве доступа отмечаем все галочки в разделе Яндекс.Диск REST API).

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Листинг основного файла (index.php).

Листинг файла с разметкой (index.phtml).

А вот пример того, как это будет выглядеть, если запустить скрипт.

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Получился простой пример для работы с АПИ Яндекс диска. Пример довольно старый, но вполне рабочий. Для работы диска лучше завести свои токены (в статье используются тестовые токены, которые могут со временем перестать работать).

Спасибо за внимание и до новых встреч.

Полезные материалы:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Яндекс диск api php

PHP библиотека к API Яндекс диска

Неофициальное PHP SDK для сервиса Яндекс.Диск

Запуск тестов из корня библиотеки:

SDK для работы использует WebDAV API Яднекс Диска. Для работы необходим OAuth-токен(например, AQACc1234LDE2f_123UIbouFHzfxxcvDI), который необходимо получить самостоятельно:

OAuth-токен должен иметь разрешённые права «Яндекс.Диск WebDAV API«

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

Потоковое скачивание частями

Скачивание без потока

Первым параметром передаётся размер превью, может быть применён любой из документации

Превью может быть получена потоком, либо без потока

Так же первым параметром можно передать объект типа \Leonied7\Yandex\Disk\Collection\PropertyCollection для получения свойств для всех элементов.

Пример написан для файла, но метод так же применим для директории

Так как для проверки существования используется метод запроса свойств, то по умолчанию Яндекс.Диск отдаёт свойства. При вызове метода has() можно передать объект типа \Leonied7\Yandex\Disk\Collection\PropertyCollection.

Если объект не передаётся, то выбираются все доступные свойства автоматически.

Получить пришедшие свойства можно следущим образом:

Результат будет хранить только успешно полученные свойства.

Для получения ошибочных свойств

Пример написан для файла, но метод так же применим для директории

По стандарту если файл уже существует по назначения, то он будет перезаписан. Для запрета перезаписи, необходимо передать вторым параметром false

Пример написан для файла, но метод так же применим для директории

По стандарту если файл уже существует по назначения, то он будет перезаписан. Для запрета перезаписи, необходимо передать вторым параметром false

Пример написан для файла, но метод так же применим для директории

Пример написан для файла, но метод так же применим для директории

Результат будет хранить только успешно полученные свойства.

Для получения ошибочных свойств

Получение существующих свойств (Применимо для файла/директории)

Пример написан для файла, но метод так же применим для директории

Пример написан для файла, но метод так же применим для директории

Есть два способа изменения свойств у элемента:

Изменение переданных свойств

Добавляем свойства myprop и propmy с namespace mynamespace значения foo и bar соответственно. Удаляем свойство propprop

Сохранение заранее полученных свойств

Неименяемые свойства не сохраняются

В загруженной коллекции есть свойства двух видов, изменяемые и неименяемые

Свойства приходят неизменяемыми для встроенных свойств Яндекс.Диска. Например quota-available-bytes будет неизменяемым

Для получения только изменяемых свойств коллекции

Так же можно узнать можно ли изменять свойтво через метод у свойства canChanged()

После этого сохраняем измененные значения

Пример написан для файла, но метод так же применим для директории

Пример написан для файла, но метод так же применим для директории

Пример написан для файла, но метод так же применим для директории

Источник

Использование API Яндекс Диска на PHP

Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов на сайте, выгрузка больших файлов с целью экономии места на хостинге и т.д.

Для работы с диском, Яндекс предоставляет REST API, подробное описание можно посмотреть в документации.
Также есть готовый PHP SDK – https://github.com/jack-theripper/yandex.

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

Для доступа к API нужно создать приложение на Яндекс.OAuth – https://oauth.yandex.ru/client/new.

В форме указываем название приложения и нужные права для REST API:

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Выбираем URL для разработки:

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

После отправки формы, получим ID созданного приложения:

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Далее нужно получить OAuth токен, для этого формируем URL и переходим по нему.

https://oauth.yandex.ru/authorize?response_type=token&client_id= идентификатор приложения

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Разрешаем и получаем токен.

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Теперь можно работать с API, передовая токен в заголовке «Authorization».

Получить инфо о Диске

Метод возвращает общую информацию о диске – доступный объем, адреса системных папок и т.п.,
Выполняется GET-запросом, возвращает объект JSON.

Получить список директорий файлов

Также отправляется методом GET и возвращает JSON.

Параметры:

Создание папки

Запрос создания папки следует отправлять с помощью метода PUT. Если директория уже существует, API вернет ошибку.

Загрузка файлов на Диск

Чтобы загрузить файл на Диск, необходимо запросить URL для загрузки методом GET, отправив желаемое место и имя файла на диске. В ответ вернется URL на который нужно отправить файл PUT-методом. URL для загрузки действует 30 минут.

Метод загрузки файла возвращает код HTTP:

Скачивание файла с Диска

Чтобы скачать файл к себе на сервер нужно запросить URL ресурса, отправив путь к скачиваемому файлу. Далее скачать файл по полученной ссылке.

Удаление файла или папки

Если удаляется непустая папка, то она может удаляться в течение произвольного времени, поэтому API отвечает кодом 202.

Источник

Загрузка файла на Диск

Чтобы загрузить файл на Диск, необходимо:

Запрос URL для загрузки

Формат запроса

Запрос URL для загрузки следует отправлять с помощью метода GET.

Путь в значении параметра следует кодировать в URL-формате.

Признак перезаписи файла. Учитывается, если файл загружается в папку, в которой уже есть файл с таким именем.

false — не перезаписывать файл, отменить загрузку (используется по умолчанию);

true — удалить файл с совпадающим именем и записать загруженный файл.

Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.

Путь в значении параметра следует кодировать в URL-формате.

Признак перезаписи файла. Учитывается, если файл загружается в папку, в которой уже есть файл с таким именем.

false — не перезаписывать файл, отменить загрузку (используется по умолчанию);

true — удалить файл с совпадающим именем и записать загруженный файл.

Список свойств JSON, которые следует включить в ответ. Ключи, не указанные в этом списке, будут отброшены при составлении ответа. Если параметр не указан, ответ возвращается полностью, без сокращений.

Формат ответа

Если запрос вызвал ошибку, возвращается подходящий код ответа, а тело ответа содержит описание ошибки.

Признак URL, который был шаблонизирован согласно RFC 6570. Возможные значения:

Источник

Как написать собственное приложение с REST API Яндекс.Диска

Всем привет! Меня зовут Клеменс Ауэр, я занимаюсь разработкой десктопной версии Яндекс.Диска. Когда появился новый REST API, я был настолько впечатлен открывшимися возможностями, что в свободное время начал писать на его основе SDK для нового языка Swift. Я решил рассказать о своем опыте работы новым API и выступил с небольшим докладом о том, как просто начать с его помощью писать собственное приложение. Доклад был на английском, но по-русски я тоже говорю, хотя не так хорошо. На основе своего выступления я подготовил сегодняшний пост, с которым мне помогали мои коллеги.

Начать я хотел бы с некоторых общих вещей о Диске — скорее всего, большую часть из этого вы уже слышали. Затем я расскажу, почему же меня так впечатлил новый API и чем он отличается от WebDAV. Ну а ближе к концу я поделюсь опытом того, как начать разрабатывать под новый API, и разберу несколько примеров своего кода. Его будет совсем немного, но с новым API, чтобы заставить что-то работать, код писать практически не требуется.

WebDAV vs. REST

Наверное, многие из вас уже задались вопросом, в чем же разница между WebDAV и REST и каковы преимущества последнего? На первый взгляд разницы нет никакой: и там и там можно заливать и скачивать файлы, создавать папки, перемещать объекты, переносить их в корзину и удалять окончательно, создавать списки и т. д.

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

В общем, основная функциональность полностью совпадает. Если сравнивать работу с публичными файлами, то через WebDAV вы можете делать файлы публичными и снова делать их приватными. С папками то же самое. То есть вы можете получить ссылку на файл или папку, а позже сделать ее недействительной. REST API добавляет к этому новую функциональность.

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Например, вы можете просмотреть метаданные публичных файлов. Имея лишь ссылку на файл, одним запросом к API вы сможете узнать его размер и имя. Если это папка, можно даже просмотреть структуру ее содержимого. И конечно, все можно сохранять к себе на Диск. Это был один из самых популярных фичереквестов после выпуска наших SDK. И вот наконец мы это реализовали.

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

В REST API появилась поддержка работы с корзиной. Теперь посмотреть содержание корзины, очистить ее или восстановить нужные файлы можно не только через веб-интерфейс.

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Да, кое-чего действительно не хватает. Например, не стали добавлять базовую аутентификацию и не планируем этого делать. Кроме того, обращаться к новому API можно только через HTTPS. Это сделано ради безопасности пользователя. Когда я делал доклад, получить через REST API информацию о свободном и занятом месте на диске пользователя было невозможно. Поэтому в таблице напротив этого пункта стоит крестик. Однако сейчас эта функция уже появилась. Многие знают, что через WebDAV можно добавлять файлы без загрузки, через хэш-суммы. На стороне клиента вычисляются MD5, SHA, к ним добавляется размер файла, и эта информация передается на сервер. Если файл с такими же хэш-суммами и размером уже есть в хранилище, загрузки не происходит, файл просто добавляется на ваш Диск. К сожалению, в REST API этого пока нет.

Когда вы работаете через OAuth, все, что у вас есть от пользователя, — это токен. Но узнать побольше о пользователе иногда бывает полезно: какой у него логин, e-mail и т. д. Получить эти данные можно через отдельный API, описание которого тут. С помощью этого API можно получить гораздо больше информации, чем через WebDAV.

Приступаем к разработке

В первую очередь нужно зарегистрировать приложение и создать аккаунт разработчика. Вы же не хотите, чтобы в результате ваших экспериментов что-нибудь случилось с файлами на вашем личном Диске. Далее вам нужно получить токен и немного разобраться с Полигоном. Вот и все, можно начинать писать код.

Процесс регистрации приложения достаточно прост: вы идете на страницу https://oauth.yandex.ru/client/new и вводите название и описание приложения. Название в дальнейшем будет использоваться в качестве наименования папки вашего приложения в Диске пользователя. Там же нужно указать, какие доступы вам потребуются: доступ к папке приложений на Диске, права чтение или запись всего Диска пользователя. Если поставить галочку в чекбоксе «Клиент для разработки», поле callback UI будет заполнено дефолтным URL, который никуда не редиректит, а просто показывает вам токен. Мобильные разработчики, скорее всего, будут использовать специальный URL handler и схему приложения. Поэтому в это поле можно ввести просто что-нибудь вроде my_application:/authoruze, а Яндекс.Диск средиректит на ваше приложение, и оно появится уже с одним из параметров вашего токена.

После регистрации приложения все совсем просто. Вы получаете ID приложения и пароль. Самое важное — это ID, так как он нужен для выдачи токенов пользователям. Пароль тоже важен, но это зависит от того, как вы используете API, как работаете с OAuth. Для веб-сервисов пароль может оказаться даже важней.

Скорее всего, потребуется сразу несколько таких аккаунтов, ведь вам нужно будет тестировать возможности передачи файлов между аккаунтами. Кроме того, в наши дни желательно использовать автотесты, для них может потребоваться еще пара аккаунтов. Просто отправляйте инвайты со своего личного аккаунта. В этом есть приятный бонус, ведь за каждый аккаунт вы получите по 500 мегабайт на своем Диске.

Получить токен вы можете либо на Полигоне, либо по этой ссылке: https://oauth.yandex.ru/authorize?response_type_token&client_id=, подставив ID, который вы получили при регистрации.

На Полигоне вы можете поэкспериментировать со всеми функциями нового API. При этом сервис обновляется одновременно с ним. Так что, даже если документация отстает на неделю или месяц, все новые функции уже будут на Полигоне. Можно сразу посмотреть, как каждая новая фича работает в боевых условиях. Там же есть таблица с HTTP-кодами ответов, где указано, что означают те или иные сообщения об ошибках или успешном завершении операций. Это гораздо лучше даже самой подробной документации.

Когда все приготовления окончены, можно начинать писать код. Как я уже говорил, сам я начал писать SDK для Swift.

Рассказывать о нем в полной мере не имеет смысла, так что для демонстрации я убрал самое сложное и сократил объем кода до 200 строк. Заставить что-то работать очень просто.

В этом примере я использую чистый JSON, но можно также использовать JSON+HAL. Обязательно нужно прописать авторизацию. Большинство вопросов о Яндекс.Диске касаются не самого API, а OAuth. Оказывается, что это вызывает гораздо больше сложностей при работе с Диском, чем сам API. Так что, если вы разобрались с OAuth, вы практически у цели. В User-Agent можно прописать все что угодно, например какой-нибудь идентификатор вашего приложения.

Кроме того, нужно инициализировать что-то вроде сессии, которую можно использовать для HTTP-запросов и т. п. Когда у вас будет готово какое-то более-менее серьезное приложение, можно добавить еще одну сессию, например для бэкграундных трансферов. Но по сути все JSON-запросы делают обычные запросы данных, так что при желании можно ограничиться и одной сессией. Понадобится еще небольшой инициализатор. Мы работаем с JSON, так что нам придется много сеарилизовать и десерилизовать JSON-объекты.

К сожалению, каким бы клевым ни был Swift, это все-таки язык со статической типизацией, так что при использовании API Objective-C приходится делать много подобных вещей. Допустим, возвращаются какие-то данные и вы хотите получить их как NSDictionary. Это генерирует много дополнительного кода, так что, как мне подсказывает опыт, вы начнете писать всякие вспомогательные штуки типа JSONDictionaryWithData. Таким образом, вы получаете данные, делаете запрос, обрабатываете ошибки, а затем возвращаете уже нужный объект. Работая с подобным API, нужно делать много запросов. Так что я также имплементировал что-то вроде JSON-тасков с методами: GET, POST, DELETE и т. д.

И еще URL с обработчиком ошибок и завершений. Swift очень эффективен при работе с замыканиями, там это один из базовых типов. По сравнению с питоном замыкания тут хорошо интегрированы синтаксически, работать с ними гораздо приятнее. Кроме того, можно сделать специальную зону для трехсотых и четырехсотых кодов прямо в этих вспомогательных блоках.

Давайте еще посмотрим, как происходит загрузка файла. Я сделал пару скриншотов прямо с Полигона. Верхний — про параметры. Тут у нас путь на Диске, куда будут сохраняться файлы, а также пометка о том, нужно ли файл перезаписывать. В ответ вы получите от Диска что-то вроде этого:

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Работая с REST API, вы будете сталкиваться с такой конструкцией чаще всего.

Как же происходит загрузка файла? Вы делаете запрос, сервис в ответ передает вам эту конструкцию. Загрузить файл вы можете на выданный URL при помощи указанного HTTP-метода. Отпадает необходимость обращаться к WebDAV-прокси, вы работаете напрямую с бэкэндом хранилища. Помимо всего прочего это хорошо сказывается на пропускной способности и скорости. Если проведете замеры, увидите разницу.

В JSONDictionary полезно завести topper, тоже неплохой тип из Swift. Вот и вся загрузка. Просто выстраиваете URL, указываете, хотите ли вы делать перезапись, создаете обработчик ошибок. Это просто замыкание, которое оборачивает обычный обработчик в случае ошибки. Особенно интересно создавать подобные вещи, когда у вас больше одного параметра. Типы возвращаемых значений в этом случае немного сложнее.

Скачивание файлов практически не отличается. Нужно лишь заменить upload на download.

Перейдем к удалению файлов. Снова обратимся к Полигону. Опять видим путь, какой-то параметр и ответ в виде все той же конструкции. Отличие — в другом HTTP-коде.

яндекс диск api php. Смотреть фото яндекс диск api php. Смотреть картинку яндекс диск api php. Картинка про яндекс диск api php. Фото яндекс диск api php

Удаление не всегда проходит моментально. Если процесс запущен, но еще не закончен, вы получите ошибку 202. Статус выполнения можно проверять отдельным запросом. Я забыл упомянуть, что в REST API предусмотрены асинхронные операции. Так что многие операции типа перемещения и удаления могут проводиться сервером асинхронно, так как на их выполнение может уходить несколько секунд или даже больше. WebDAV в таких случаях выдает только сообщения об ошибках или необходимости подождать.

По сути функция удаления не отличается от заливки и скачивания. Очень удобно, что у нас есть тип enum, который может принимать дополнительные объекты. Применение enum в качестве типа возвращаемых данных для обработчика дает неплохое преимущество. Вы пишете код, используете тип возвращаемых данных enum, присоединяете к нему какие-то объекты. Чем это хорошо? Единственный способ работы с enum — применение switch, а это подразумевает, что вы покрываете все вероятные сценарии в Swift. Таким образом, используя enum, вы автоматически вынуждаете делать обработку большинства возможных событий.

Выводы

Что касается REST API, то главный совет тут — используйте Полигон, он прекрасен. На создание документации ушло немало сил, но поддерживать ее в актуальном состоянии еще сложнее. А Полигон актуален всегда. Как только выходит новая версия, вся информация о ней уже там. Кроме того, REST API достаточно быстр. Он действительно заметно быстрее WebDAV. А работать с OAuth приятно всегда. Да, это требует писать больше кода, но, скорее всего, у вас уже есть какая-нибудь имплементация, так что особого значения это не имеет. У REST API многое еще впереди. В API еще остались белые пятна, но у нас есть множество идей, реализацией которых мои коллеги активно занимаются.

Подводя итог, я хочу посоветовать заниматься разработкой через тестирование. Это сохранит вам много времени. Особенно когда вы пишете что-то вроде SDK. Гораздо легче написать небольшой тест для имплементируемой вами функции, чем пытаться вызывать ее из приложения. Просто пишите тесты, вызывайте свои функции, проверяйте результаты. В наше время даже разработка под асинхронные API не вызывает проблем. Xcode позволяет создавать асинхронные тесты: вы задаете условия и запускаете тест, а обработчик говорит, успешно ли все выполнено. Тестирование асинхронных API там устроено очень просто. Кроме того, это помогает находить баги. Ошибки делают все, и мы не исключение, поэтому мы рады каждому багрепорту. Вы можете использовать ФОС на странице API Диска. Обычно мы быстро все чиним — в зависимости от сложности и критичности проблемы, конечно.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *