58 lines
2.4 KiB
Python
58 lines
2.4 KiB
Python
"""应用宝 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 stop(self, worker_job_id: str) -> dict[str, Any]:
|
|
return self._request("POST", f"/v1/jobs/{worker_job_id}/stop")
|