"""应用宝 Worker HTTP 客户端。""" from __future__ import annotations import os from typing import Any import requests class YybWorkerError(RuntimeError): """Worker 返回业务错误。""" class YybWorkerClient: def __init__(self) -> None: self.base_url = os.getenv("YYB_WORKER_URL", "http://127.0.0.1:8810").rstrip("/") self.key = os.getenv("YYB_WORKER_KEY", "") self.timeout = float(os.getenv("YYB_WORKER_TIMEOUT", "30")) def _request(self, method: str, path: str, payload: dict[str, Any] | None = None) -> dict[str, Any]: headers = {"Accept": "application/json"} if self.key: headers["Authorization"] = f"Bearer {self.key}" try: response = requests.request(method, self.base_url + path, json=payload, headers=headers, timeout=self.timeout) data = response.json() except (requests.RequestException, ValueError) as exc: raise YybWorkerError(f"应用宝 Worker 不可用: {exc}") from exc if response.status_code >= 400: raise YybWorkerError(str(data.get("detail", "Worker 请求失败"))) return data def create_job(self) -> dict[str, Any]: return self._request("POST", "/v1/jobs") def login(self, worker_job_id: str, provider: str, timeout: int = 600) -> dict[str, Any]: return self._request("POST", f"/v1/jobs/{worker_job_id}/login", {"provider": provider, "timeout": timeout}) def get_job(self, worker_job_id: str) -> dict[str, Any]: return self._request("GET", f"/v1/jobs/{worker_job_id}") def selection_options(self, worker_job_id: str, platform: str, points: int | None = None, zone_id: str | None = None) -> dict[str, Any]: return self._request("POST", f"/v1/jobs/{worker_job_id}/selection-options", {"platform": platform, "points": points, "zone_id": zone_id}) def selection(self, worker_job_id: str, selection: dict[str, Any]) -> dict[str, Any]: return self._request("POST", f"/v1/jobs/{worker_job_id}/selection", selection) def payment(self, worker_job_id: str) -> dict[str, Any]: return self._request("POST", f"/v1/jobs/{worker_job_id}/payment") def payment_check(self, worker_job_id: str) -> dict[str, Any]: return self._request("POST", f"/v1/jobs/{worker_job_id}/payment/check") def stop(self, worker_job_id: str) -> dict[str, Any]: return self._request("POST", f"/v1/jobs/{worker_job_id}/stop")