API Яндекс.Диск (PHP) #6: Готовый класс для работы с API через Curl — PROG-TIME

API Яндекс.Диск (PHP) #6: Готовый класс для работы с API через Curl

18.04.2023
Содержание
  1. Класс для работы с Яндекс.Диск через API
  2. Получения общей информации об аккаунте Яндекс.Диска через API
  3. Получение метаинформации о папках и файлах на Яндекс.Диске через API
  4. Получение метаинформации о папках и файлах в корзине на Яндекс.Диске через API
  5. Получение плоского списка всех файлов с Яндекс.Диска через API
  6. Получение последних загруженных элементов на Яндекс.Диск через API
  7. Метод для создания директории на Яндекс.Диске через API
  8. Метод для загрузки файлов на Яндекс.Диск через API
  9. Метод для скачивания файлов с Яндекс.Диска на сервера через API
  10. Удаление ресурса с Яндекс.Диск через API
  11. Публикация файла в Яндекс.Диске через API
  12. Снятие с публикации файла в Яндекс.Диске через API
  13. Получение списка публичных файлов с Яндекс.Диска через API
  14. Метод для востановления файла из корзины в Яндекс.Диске через API
  15. Очистка корзины в Яндекс.Диске через API

Заканчивая основную часть курса, в последнем уроке мы с вами рассмотрим полноценный класс для отправки запросов в API Яндекс.Диска. Мы упростим весь написанный ранее код и оставим только необходимые методы.

Зная методы и URL для запросов я решил убрать методы которые являются оболочками и обращаться напрямую к методу sendQueryYaDisk().

Так же я решил строку https://cloud-api.yandex.net/v1/disk добавить в свойство $basicApiUrl, а метод sendQueryYaDisk() теперь первым параметром будет принимать не полный URL, а его окончание в котором указываются методы.

Класс для работы с Яндекс.Диск через API


class Backup
{
    protected $token = 'токен';
    protected $basicApiUrl = 'https://cloud-api.yandex.net/v1/disk/';

    /**
     * Method sendQueryYaDisk
     *
     * @param string $urlQuery URL для отправки запросов
     * @param array $arrQuery массив параметров
     * @param string $methodQuery метод отправки
     *
     * @return array
     */
    public function sendQueryYaDisk(string $methodAPI = '', array $arrQuery = [], string $methodQuery = 'GET'): array
    {
        if($methodQuery == 'POST') {
            $fullUrlQuery = $this->basicApiUrl . $methodAPI;
        } else {
            $fullUrlQuery = $this->basicApiUrl . $methodAPI . '?' . http_build_query($arrQuery);
        }

        $ch = curl_init($fullUrlQuery);
        switch ($methodQuery) {
            case 'PUT':
                curl_setopt($ch, CURLOPT_PUT, true);
                break;

            case 'POST':
                curl_setopt($ch, CURLOPT_POST, 1);
	            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($arrQuery));
                break;

            case 'DELETE':
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
                break;
        }

        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: OAuth ' . $this->token]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $resultQuery = curl_exec($ch);
        curl_close($ch);

        return (!empty($resultQuery)) ? json_decode($resultQuery, true) : [];
    }


    
    /**
     * Метод для загрузки файлов
     *
     * @param string $filePath путь до файла
     * @param string $dirPath путь до директории на Яндекс.Диск
     *
     * @return string
     */
    public function disk_resources_upload(string $filePath, string $dirPath = ''): string
    {
        $arrParams = [
            'path' => $dirPath . basename($filePath),
            'overwrite' => 'true',
        ];

        $urlQuery = 'https://cloud-api.yandex.net/v1/disk/resources/upload';
        $resultQuery = $this->sendQueryYaDisk('resources/upload', $arrParams);

        if (empty($resultQuery['error'])) {
            $fp = fopen($filePath, 'r');
        
            $ch = curl_init($resultQuery['href']);
            curl_setopt($ch, CURLOPT_PUT, true);
            curl_setopt($ch, CURLOPT_UPLOAD, true);
            curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filePath));
            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);
            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
        
            return $http_code;
        } else {
            return $resultQuery['message'];
        }
    }
    

    
    /**
     * Метод для скачивания файлов на сервера
     *
     * @param string $filePath путь до файла в Яндекс.Диске
     * @param string $dirPath путь до директории на сервере
     *
     * @return array
     */
    public function disk_resources_download(string $filePath, string $dirPath = ''): array
    {
        $arrParams = [
            'path' => $filePath,
        ];
        $resultQuery = $this->sendQueryYaDisk('resources/download', $arrParams);

        if(empty($resultQuery['error'])) {
            $file_name = $dirPath . basename($filePath);
            $file = @fopen($file_name, 'w');
        
            $ch = curl_init($resultQuery['href']);
            curl_setopt($ch, CURLOPT_FILE, $file);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $this->token));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_HEADER, false);
            $resultQuery = curl_exec($ch);
            curl_close($ch);

            fclose($file);

            return [
                'message' => 'Файл успешно загружен',
                'path' => $file_name,
            ];
        } else {
            return $resultQuery;
        }
    }
    

}

Получения общей информации об аккаунте Яндекс.Диска через API

$resultQuery = $backupClass->sendQueryYaDisk();

Получение метаинформации о папках и файлах на Яндекс.Диске через API

$arrParams = [
    'path' => '/uploads',
    'fields' => 'name,_embedded.items.path',
    'limit' => 100,
    'offset' => 0,
    'preview_crop' => false,
    'preview_size' => '',
    'sort' => 'created'
];
$resultQuery = $backupClass->sendQueryYaDisk('resources', $arrParams);

Получение метаинформации о папках и файлах в корзине на Яндекс.Диске через API

$arrParams = [
    'path' => '/',
    'fields' => 'name,_embedded.items.path',
    'limit' => 100,
    'offset' => 0,
    'preview_crop' => false,
    'preview_size' => '',
    'sort' => 'created'
];
$resultQuery = $backupClass->sendQueryYaDisk('trash/resources', $arrParams);

Получение плоского списка всех файлов с Яндекс.Диска через API

$arrParams = [
    'limit' => 100,
    'media_type' => 'image',
    'offset' => 0,
    'fields' => 'name,_embedded.items.path',
    'preview_size' => '',
    'preview_crop' => false,
];
$resultQuery = $backupClass->sendQueryYaDisk('resources/files', $arrParams);

Получение последних загруженных элементов на Яндекс.Диск через API

$arrParams = [
    'limit' => 10,
    'media_type' => 'image',
    'fields' => 'name,_embedded.items.path',
    'preview_size' => '',
    'preview_crop' => false,
];
$resultQuery = $backupClass->sendQueryYaDisk('resources/last-uploaded', $arrParams);

Метод для создания директории на Яндекс.Диске через API

$arrParams = [
    'path' => '/uploads/prog_time',
    'fields' => 'name,_embedded.items.path',
];
$resultQuery = $backupClass->sendQueryYaDisk('resources', $arrParams, 'PUT');

Метод для загрузки файлов на Яндекс.Диск через API

$filePath = $_SERVER['DOCUMENT_ROOT'] . '/public/image.png';
$dirPath = '/uploads';
$resultQuery = $backupClass->disk_resources_upload($filePath, $dirPath);

Метод для скачивания файлов с Яндекс.Диска на сервера через API

$filePath = '/test.docx';
$dirPath = $_SERVER['DOCUMENT_ROOT'] . '/public';
$resultQuery = $backupClass->disk_resources_download($filePath, $dirPath);

Удаление ресурса с Яндекс.Диск через API

$arrParams = [
    'path' => '/test.docx',
    'permanently' => false,
    'fields' => 'name,_embedded.items.path',
];
$resultQuery = $backupClass->sendQueryYaDisk('resources', $arrParams, 'DELETE');

Публикация файла в Яндекс.Диске через API

$arrParams = [
    'path' => '/uploads/test.xlsx',
];
$resultQuery = $backupClass->sendQueryYaDisk('resources/publish', $arrParams, 'PUT');

Снятие с публикации файла в Яндекс.Диске через API

$arrParams = [
    'path' => '/uploads/test.xlsx',
];
$resultQuery = $backupClass->sendQueryYaDisk('resources/unpublish', $arrParams, 'PUT');

Получение списка публичных файлов с Яндекс.Диска через API

$arrParams = [
    'limit' => 10,
    'offset' => 0,
    'type' => 'dir',
    'fields' => 'name,_embedded.items.path',
    'preview_size' => '',
];
$resultQuery = $backupClass->sendQueryYaDisk('resources/public', $arrParams);

Метод для востановления файла из корзины в Яндекс.Диске через API

$arrParams = [
    'path' => 'trash:/test.docx_f8fb153e7cb73695ee2fdada79a7871b0093596e',
    'name' => 'new_name.docx'
];
$resultQuery = $backupClass->sendQueryYaDisk('trash/resources/restore', $arrParams, 'PUT');

Очистка корзины в Яндекс.Диске через API

$resultQuery = $backupClass->sendQueryYaDisk('trash/resources', [], 'DELETE');