Заканчивая основную часть курса, в последнем уроке мы с вами рассмотрим полноценный класс для отправки запросов в API Яндекс.Диск. Мы упростим весь написанный ранее код и оставим только необходимые методы.
Зная методы и URL для запросов я решил убрать методы которые являются оболочками и обращаться напрямую к методу sendQueryYaDisk().
Так же я решил строку https://cloud-api.yandex.net/v1/disk добавить в свойство $basicApiUrl, а метод sendQueryYaDisk() теперь первым параметром будет принимать не полный URL, а его окончание в котором указываются методы.
Полный список всех записей курса находится на сайте https://prog-time.ru/course_cat/yandeks-disk-api-php/ или в публикациях на Хабр https://habr.com/ru/users/Prog-Time/posts/
Класс для работы с Яндекс.Диск через API
class Backup
{
protected $token = 'y0_AgAAAAAN-K9DAAm3K13AAAhGaGI8223NaryL2TbKJe-KBHnVbafWjkEI';
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');
Комментарии (2)
plFlok
20.07.2023 17:50+2protected $token = 'y0_AgAAAAAN-K9DAAm3KAAAAADhGaGI82NaryL2TbKJe-KBHnVbafWjkEI';
Чекнул. Это прямо настоящий токен автора. Листинг файлов выкачивается. Забавно, что там есть папка "Книги по программированию".
Имхо, это критично для обучающих курсов - выкладывать настолько чувствительные данные хардкодом.p.s.: автору в личку сообщил
Wakeonlan
Я дико извиняюсь, а есть какая то возможность на лету шифровать файлы, которые Яндекс диск переносит в облако? Без костылей в виде отдельно зашифрованного диска и синхронизацией этого диска с папкой Яндекса на локальном компе