| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- """CPA upload helpers for the zhuce6 ChatGPT platform."""
- from __future__ import annotations
- import json
- from typing import Any
- from curl_cffi import CurlMime
- from curl_cffi import requests as cffi_requests
- from .constants import (
- OPENAI_IMPERSONATE,
- OPENAI_SEC_CH_UA,
- OPENAI_SEC_CH_UA_MOBILE,
- OPENAI_SEC_CH_UA_PLATFORM,
- OPENAI_USER_AGENT,
- )
- def _upload_url(api_url: str) -> str:
- return f"{api_url.rstrip('/')}/v0/management/auth-files"
- def _headers(api_key: str | None) -> dict[str, str]:
- return {
- "Authorization": f"Bearer {api_key or ''}",
- "User-Agent": OPENAI_USER_AGENT,
- "sec-ch-ua": OPENAI_SEC_CH_UA,
- "sec-ch-ua-mobile": OPENAI_SEC_CH_UA_MOBILE,
- "sec-ch-ua-platform": OPENAI_SEC_CH_UA_PLATFORM,
- }
- def _error_message(response: Any) -> str:
- base = f"upload failed: HTTP {response.status_code}"
- try:
- payload = response.json()
- except Exception:
- payload = None
- if isinstance(payload, dict):
- message = str(payload.get("message") or payload.get("error") or "").strip()
- if message:
- return message
- text = str(getattr(response, "text", "") or "").strip()
- if text:
- return f"{base} - {text[:200]}"
- return base
- def generate_token_json(account: Any) -> dict[str, str]:
- expires_at = getattr(account, "expires_at", None)
- last_refresh = getattr(account, "last_refresh", None)
- return {
- "type": "codex",
- "email": str(getattr(account, "email", "") or "").strip(),
- "expired": expires_at.strftime("%Y-%m-%dT%H:%M:%S+08:00") if expires_at else "",
- "id_token": str(getattr(account, "id_token", "") or "").strip(),
- "account_id": str(getattr(account, "account_id", "") or "").strip(),
- "access_token": str(getattr(account, "access_token", "") or "").strip(),
- "last_refresh": last_refresh.strftime("%Y-%m-%dT%H:%M:%S+08:00") if last_refresh else "",
- "refresh_token": str(getattr(account, "refresh_token", "") or "").strip(),
- }
- def upload_to_cpa(
- token_data: dict[str, str],
- api_url: str | None = None,
- api_key: str | None = None,
- proxy: str | None = None,
- ) -> tuple[bool, str]:
- del proxy # CPA is direct-connect by default in zhuce6.
- if not api_url:
- return False, "CPA API URL is required"
- upload_url = _upload_url(api_url)
- payload = json.dumps(token_data, ensure_ascii=False, indent=2).encode("utf-8")
- mime = CurlMime()
- mime.addpart(
- name="file",
- data=payload,
- filename=f"{token_data.get('email', 'account')}.json",
- content_type="application/json",
- )
- try:
- response = cffi_requests.post(
- upload_url,
- multipart=mime,
- headers=_headers(api_key),
- timeout=30,
- impersonate=OPENAI_IMPERSONATE,
- )
- except Exception as exc:
- return False, f"upload exception: {exc}"
- if response.status_code in {200, 201}:
- return True, "upload success"
- return False, _error_message(response)
- def upload_to_team_manager(account: Any, api_url: str | None = None, api_key: str | None = None) -> tuple[bool, str]:
- ok, message = upload_to_cpa(
- generate_token_json(account),
- api_url=api_url,
- api_key=api_key,
- proxy=None,
- )
- if ok:
- return True, "team manager upload success"
- return False, message
- def test_cpa_connection(api_url: str | None = None, api_key: str | None = None) -> tuple[bool, str]:
- if not api_url:
- return False, "CPA API URL is required"
- try:
- response = cffi_requests.options(
- _upload_url(api_url),
- headers=_headers(api_key),
- timeout=10,
- impersonate=OPENAI_IMPERSONATE,
- )
- except Exception as exc:
- return False, f"connection failed: {exc}"
- if response.status_code in {200, 204, 401, 403, 405}:
- if response.status_code == 401:
- return False, "connection reached server but API key is invalid"
- return True, "connection ok"
- return False, f"connection failed: HTTP {response.status_code}"
|