Files
Yandex-disk-API-test/api/disk_client.py
T

101 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Модуль клиента для взаимодействия с REST API Яндекс Диска.
Документация API: https://yandex.ru/dev/disk/api/concepts/about.html
Полигон: https://cloud-api.yandex.net
"""
import requests
from typing import Optional, Dict, Any
class YandexDiskClient:
"""
HTTP-клиент-обёртка для выполнения запросов к API Яндекс Диска.
Инкапсулирует базовые методы (GET, POST, PUT, DELETE) и авторизацию.
"""
BASE_URL = "https://cloud-api.yandex.net/v1/disk/resources"
def __init__(self, token: str, timeout: int = 10):
"""
Инициализация сессии с предустановленными заголовками авторизации.
:param token: OAuth-токен сервиса Яндекс
:param timeout: Дефолтный таймаут для HTTP-запросов в секундах
"""
self.timeout = timeout
self.session = requests.Session()
# Все запросы к API Яндекс Диска требуют заголовок Authorization с префиксом OAuth
self.session.headers.update({
"Authorization": f"OAuth {token}",
"Accept": "application/json",
"Content-Type": "application/json"
})
def create_folder(self, path: str) -> requests.Response:
"""
PUT /v1/disk/resources
Создание папки на Яндекс Диске.
:param path: Путь к создаваемой папке (например, 'test_dir' или 'disk:/test_dir')
:return: Объект ответа requests.Response (201 Created при успехе)
"""
url = self.BASE_URL
params = {"path": path}
return self.session.put(url, params=params, timeout=self.timeout)
def get_resource_info(self, path: str, fields: Optional[str] = None) -> requests.Response:
"""
GET /v1/disk/resources
Получение метаинформации о ресурсе (файле или папке).
:param path: Путь к ресурсу на Диске
:param fields: Список возвращаемых полей через запятую (для фильтрации ответа)
:return: Объект ответа requests.Response (200 OK при успехе)
"""
url = self.BASE_URL
params = {"path": path}
if fields:
params["fields"] = fields
return self.session.get(url, params=params, timeout=self.timeout)
def publish_resource(self, path: str) -> requests.Response:
"""
POST /v1/disk/resources/publish
Публикация ресурса (создание публичной ссылки).
:param path: Путь к ресурсу, который необходимо опубликовать
:return: Объект ответа requests.Response (200 OK при успехе)
"""
url = f"{self.BASE_URL}/publish"
params = {"path": path}
return self.session.post(url, params=params, timeout=self.timeout)
def unpublish_resource(self, path: str) -> requests.Response:
"""
PUT /v1/disk/resources/unpublish
Закрытие публичного доступа к ресурсу.
:param path: Путь к ресурсу, доступ к которому закрывается
:return: Объект ответа requests.Response (200 OK при успехе)
"""
url = f"{self.BASE_URL}/unpublish"
params = {"path": path}
return self.session.put(url, params=params, timeout=self.timeout)
def delete_resource(self, path: str, permanently: bool = True) -> requests.Response:
"""
DELETE /v1/disk/resources
Удаление файла или папки.
:param path: Путь к удаляемому ресурсу
:param permanently: True — удалить безвозвратно мимо Корзины; False — переместить в Корзину
:return: Объект ответа requests.Response (204 No Content при успешном синхронном удалении)
"""
url = self.BASE_URL
params = {
"path": path,
"permanently": str(permanently).lower()
}
return self.session.delete(url, params=params, timeout=self.timeout)