64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
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
|