PHP

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

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

Для работы с диском, Яндекс предоставляет 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».

1

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

Метод возвращает общую информацию о диске – доступный объем, адреса системных папок и т.п.,
Выполняется 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
)
2

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

Также отправляется методом 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
            )
        )
    )
)
3

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

Запрос создания папки следует отправлять с помощью метода 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);
4

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

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

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

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

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

Удаление происходит методом 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 'Успешно удалено';
}
29 ноября 2017
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают или совсем не...
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать...