import requests import uuid import time from framework.core.exceptions import TokenExpiredError, APIError from framework.core.logger import get_logger logger = get_logger("BaseAPI") class BaseAPI: def __init__(self, base_url, token=None, cookie=None): self.base_url = base_url self.token = token self.cookie = cookie self.session = requests.Session() def get_common_headers(self, referer_path=""): headers = { "accept": "application/json, text/plain, */*", "accept-language": "zh-CN,zh;q=0.9", "authorization": self.token, "cookie": self.cookie, "origin": self.base_url, "referer": f"{self.base_url}{referer_path}", "sourceapp": "artificer", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36", "x-request-id": uuid.uuid4().hex[:21], } return headers def request(self, method, endpoint, headers=None, **kwargs): url = f"{self.base_url}{endpoint}" # Merge default headers if none provided if headers is None: headers = self.get_common_headers() try: resp = self.session.request(method, url, headers=headers, **kwargs) return self._check_response(resp, endpoint) except Exception as e: logger.error(f"Request failed: {method} {url} - {str(e)}") raise e def _check_response(self, resp, step_name): if resp.status_code in (401, 403): raise TokenExpiredError(f"[{step_name}] HTTP {resp.status_code}: 认证失败") if resp.status_code < 200 or resp.status_code >= 300: raise APIError(f"[{step_name}] HTTP {resp.status_code}: {resp.text}") try: data = resp.json() except Exception: raise APIError(f"[{step_name}] 非 JSON 响应: {resp.text}") body_status = data.get("status", 0) if body_status != 0: msg = data.get("message", "") if body_status in (401, 403) or "token" in msg.lower(): raise TokenExpiredError(f"[{step_name}] 认证失效: {msg}") raise APIError(f"[{step_name}] 业务错误: {msg}") return data