From 35a750ca1c7547480f80e1302a3d84cc0cb9ac4c Mon Sep 17 00:00:00 2001 From: redlineo Date: Wed, 16 Sep 2026 18:37:42 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20endpoint=20PT=20Sandbox=20/api/v1/files/up?= =?UTF-8?q?load=20->=20/api/v1/scan/checkFile=20+=20async=5Fresult&scan=5F?= =?UTF-8?q?id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yaml | 4 ++-- main.py | 22 +++++++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/config.yaml b/config.yaml index 5e29fb8..0153ed0 100644 --- a/config.yaml +++ b/config.yaml @@ -49,8 +49,8 @@ pt_sandbox: # Отключать проверку SSL-сертификата (для самоподписанных сертификатов) verify_ssl: true - # Endpoint для загрузки файла на анализ - upload_endpoint: "/api/v1/files/upload" + # Endpoint для загрузки и запуска проверки файла + upload_endpoint: "/api/v1/scan/checkFile" # Заголовок и значение для авторизации в Sandbox auth_header: "X-API-Key" diff --git a/main.py b/main.py index 30dd4ed..04bbe0b 100644 --- a/main.py +++ b/main.py @@ -355,7 +355,7 @@ class PTSandboxClient: def __init__(self, cfg: dict): sb_cfg = cfg["pt_sandbox"] self.base_url = sb_cfg["base_url"].rstrip("/") - self.upload_endpoint = sb_cfg.get("upload_endpoint", "/api/v1/files/upload") + self.upload_endpoint = sb_cfg.get("upload_endpoint", "/api/v1/scan/checkFile") self.auth_header = sb_cfg.get("auth_header", "X-API-Key") self.api_key = sb_cfg.get("api_key", "") self.file_field_name = sb_cfg.get("file_field_name", "file") @@ -380,9 +380,13 @@ class PTSandboxClient: def upload_file(self, file_path: Path) -> Optional[str]: """ - Отправить файл в PT Sandbox на анализ. - Возвращает ID задачи (task_id) или None при ошибке. + Отправить файл в PT Sandbox на анализ (одним запросом — загрузка + запуск проверки). + Возвращает ID задачи (scan_id) или None при ошибке. """ + params = { + "file_name": file_path.name, + "async_result": "true", + } url = f"{self.base_url}{self.upload_endpoint}" logger.info("Отправка файла в Sandbox: %s (%d bytes)", file_path.name, file_path.stat().st_size) @@ -393,18 +397,18 @@ class PTSandboxClient: fields = dict(self.extra_fields) resp = self._session.post( - url, files=files, data=fields, + url, params=params, files=files, data=fields, timeout=(self.timeout_connect, self.timeout_read), verify=self.verify_ssl, ) if resp.status_code in (200, 201, 202): result = resp.json() - task_id = (result.get("task_id") or result.get("id") - or result.get("uuid") or str(result)) - logger.info("Файл %s принят Sandbox. task_id=%s", - file_path.name, task_id) - return str(task_id) + data = result.get("data", {}) + scan_id = data.get("scan_id") or result.get("task_id") or result.get("id") + logger.info("Файл %s принят Sandbox. scan_id=%s", + file_path.name, scan_id) + return str(scan_id) if scan_id else None else: logger.error("Sandbox вернул %s: %s", resp.status_code, resp.text[:500])