Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов на сайте, выгрузка больших файлов с целью экономии места на хостинге и т.д.
Для работы с диском, Яндекс предоставляет REST API, подробное описание можно посмотреть в документации.
Также есть готовый PHP SDK – https://github.com/jack-theripper/yandex.
В статье рассмотрим, как получить OAuth токен для доступа к методам диска и базовые операции с файлами и директориями с помощью CURL.
Для доступа к API нужно создать приложение на Яндекс.OAuth – https://oauth.yandex.ru/client/new.
В форме указываем название приложения и нужные права для REST API:
Выбираем URL для разработки:
После отправки формы, получим ID созданного приложения:
Далее нужно получить OAuth токен, для этого формируем URL и переходим по нему.
https://oauth.yandex.ru/authorize?response_type=token&client_id=
идентификатор приложения
Разрешаем и получаем токен.
Теперь можно работать с API, передовая токен в заголовке «Authorization».
Метод возвращает общую информацию о диске – доступный объем, адреса системных папок и т.п.,
Выполняется GET-запросом, возвращает объект JSON.
$token = 'xxx';
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
if (empty($res['error'])) {
print_r($res);
}
Array
(
[max_file_size] => 53687091200
[unlimited_autoupload_enabled] =>
[total_space] => 18253611008
[trash_size] => 0
[is_paid] =>
[used_space] => 1246159288
[system_folders] => Array(
[odnoklassniki] => disk:/Социальные сети/Одноклассники
[google] => disk:/Социальные сети/Google+
[instagram] => disk:/Социальные сети/Instagram
[vkontakte] => disk:/Социальные сети/ВКонтакте
[mailru] => disk:/Социальные сети/Мой Мир
[downloads] => disk:/Загрузки/
[applications] => disk:/Приложения
[facebook] => disk:/Социальные сети/Facebook
[social] => disk:/Социальные сети/
[screenshots] => disk:/Скриншоты/
[photostream] => disk:/Фотокамера/
)
[user] => Array(
[login] =>
[uid] =>
)
[revision] => 1505733891467620
)
Также отправляется методом GET и возвращает JSON.
Параметры:
path
– путь к ресурсу относительно корневого каталога Диска;fields
– список ключей, которые следует включить в ответ;limit
– количество ресурсов которые вернуться в ответе, по умолчанию 20.
$token = 'xxx';
// Выведем список корневой папки.
$path = '/';
// Оставим только названия и тип.
$fields = '_embedded.items.name,_embedded.items.type';
$limit = 100;
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources?path=' . urlencode($path) . '&fields=' . $fields . '&limit=' . $limit);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
print_r($res);
Array
(
[_embedded] => Array(
[items] => Array(
[0] => Array(
[type] => dir
[name] => Документы
)
[1] => Array(
[type] => dir
[name] => Загрузки
)
[2] => Array(
[type] => dir
[name] => Мои Яндекс.Картинки
)
[3] => Array(
[type] => dir
[name] => Музыка
)
[4] => Array(
[type] => file
[name] => Добро Пожаловать.pdf
)
[5] => Array(
[type] => file
[name] => Обои для рабочего стола.jpg
)
)
)
)
Запрос создания папки следует отправлять с помощью метода PUT. Если директория уже существует, API вернет ошибку.
$token = 'xxx';
// Путь новой директории.
$path = '/uploads';
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources/?path=' . urlencode($path));
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
print_r($res);
Чтобы загрузить файл на Диск, необходимо запросить URL для загрузки методом GET, отправив желаемое место и имя файла на диске. В ответ вернется URL на который нужно отправить файл PUT-методом. URL для загрузки действует 30 минут.
Метод загрузки файла возвращает код HTTP:
- 202 – файл принят сервером.
- 413 – размер файла превышает 10 ГБ.
- 500, 503 – ошибка сервера, попробуйте повторить загрузку.
- 507 – для загрузки файла не хватает места на Диске пользователя.
$token = 'xxx';
// Путь и имя файла на нашем сервере.
$file = __DIR__ . '/image.jpg';
// Папка на Яндекс Диске (уже должна быть создана).
$path = '/uploads/';
// Запрашиваем URL для загрузки.
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources/upload?path=' . urlencode($path . basename($file)));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
if (empty($res['error'])) {
// Если ошибки нет, то отправляем файл на полученный URL.
$fp = fopen($file, 'r');
$ch = curl_init($res['href']);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 201) {
echo 'Файл успешно загружен.';
}
}
Чтобы скачать файл к себе на сервер нужно запросить URL ресурса, отправив путь к скачиваемому файлу. Далее скачать файл по полученной ссылке.
$token = 'xxx';
// Файл на Диске.
$yd_file = '/uploads/image.jpg';
// Директория, куда будет сохранен файл.
$path = __DIR__;
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources/download?path=' . urlencode($yd_file));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
if (empty($res['error'])) {
$file_name = $path . '/' . basename($yd_file);
$file = @fopen($file_name, 'w');
$ch = curl_init($res['href']);
curl_setopt($ch, CURLOPT_FILE, $file);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
fclose($file);
}
Удаление происходит методом DELETE, если не указать параметр permanently=true
, то файлы будут перемещены в корзину.
Если удаляется непустая папка, то она может удаляться в течение произвольного времени, поэтому API отвечает кодом 202.
$token = 'xxx';
// Файл или папка на Диске.
$path = '/uploads/image.jpg';
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources?path=' . urlencode($path) . '&permanently=true');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (in_array($http_code, array(202, 204))) {
echo 'Успешно удалено';
}
Через
$file = @fopen($file_name, 'w'); получался размер 0 байт, объясните пожалуйста в чем ошибка?