From 32a1244352bb22e3edbfc2bea197d03650f5d13b Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 17 Sep 2026 21:19:13 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?api=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/__init__.py | Bin 0 -> 1024 bytes api/disk_client.py | 100 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 api/__init__.py create mode 100644 api/disk_client.py diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..06d7405020018ddf3cacee90fd4af10487da3d20 GIT binary patch literal 1024 ScmZQz7zLvtFd70QH3R?z00031 literal 0 HcmV?d00001 diff --git a/api/disk_client.py b/api/disk_client.py new file mode 100644 index 0000000..ca63c75 --- /dev/null +++ b/api/disk_client.py @@ -0,0 +1,100 @@ +""" +Модуль клиента для взаимодействия с 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)