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

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

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

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

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

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

Приложение на Яндекс.OAuth
Яндекс Диск REST API - права

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

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

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

Получаем 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);
}
PHP
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);
PHP
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);
PHP

Чтобы загрузить файл на Диск, необходимо запросить 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 'Файл успешно загружен.';
	}
} 
PHP

Чтобы скачать файл к себе на сервер нужно запросить 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);
}
PHP

Удаление происходит методом 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 'Успешно удалено';
}
PHP
29.11.2017, обновлено 09.11.2021
37987

Комментарии 3

Кирилл Чекрыгин Кирилл Чекрыгин
27 сентября 2020 в 13:45
-1
По поводу скачивания файла с Диска. Файл скачивается, но он пустой.
Ира Левицкая Ира Левицкая
13 января 2021 в 12:32
0
Чтобы файл с яндекс диска скачался нужно добавить curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
николай h николай h
10 сентября 2021 в 11:34
+1
Я смог сохранить в скаченный файл данные только таким образом:
if (empty($res['error'])) {
$file_name = $path . '/' . basename($yd_file);
$ch = curl_init($res['href']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
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);
file_put_contents($file_name, $res);
}
Через
$file = @fopen($file_name, 'w'); получался размер 0 байт, объясните пожалуйста в чем ошибка?

, чтобы добавить комментарий.

Другие публикации

Метрика API
API Яндекс метрики позволяет получить информацию о посещаемости сайта и формировать отчеты, но с ограничением в 30 запросов в секунду и 5000 в сутки.
9566
+7
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
15906
+8
Яндекс.Доставка работа с API в PHP
Примеры работы с API Яндекс.Доставки (для заказа перевозки грузов корпоративным клиентам).
637
+1
Публикация записей на стену сообщества VK
Для начала вы должны быть авторизированы в VK и являться администратором группы или страницы. Далее нужно создать...
19581
+3
Подключение к платежной системе Сбербанка
После регистрации в системе эквайринга Сбербанка и получив доступ к тестовой среде, можно приступить к интеграции с...
38257
+18
HTTP коды
Список основных кодов состояния HTTP, без WebDAV.
6369
+1