import json import random import time from fastapi import HTTPException from utils.Client import Client from utils.Logger import logger from utils.configs import proxy_url_list import utils.globals as globals async def rt2ac(refresh_token, force_refresh=False): if not force_refresh and (refresh_token in globals.refresh_map and int(time.time()) - globals.refresh_map.get(refresh_token, {}).get("timestamp", 0) < 5 * 24 * 60 * 60): access_token = globals.refresh_map[refresh_token]["token"] # logger.info(f"refresh_token -> access_token from cache") return access_token else: try: access_token = await chat_refresh(refresh_token) globals.refresh_map[refresh_token] = {"token": access_token, "timestamp": int(time.time())} with open(globals.REFRESH_MAP_FILE, "w") as f: json.dump(globals.refresh_map, f, indent=4) logger.info(f"refresh_token -> access_token with openai: {access_token}") return access_token except HTTPException as e: raise HTTPException(status_code=e.status_code, detail=e.detail) async def chat_refresh(refresh_token): data = { "client_id": "pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh", "grant_type": "refresh_token", "redirect_uri": "com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback", "refresh_token": refresh_token } client = Client(proxy=random.choice(proxy_url_list) if proxy_url_list else None) try: r = await client.post("https://auth0.openai.com/oauth/token", json=data, timeout=5) if r.status_code == 200: access_token = r.json()['access_token'] return access_token else: if "invalid_grant" in r.text or "access_denied" in r.text: if refresh_token not in globals.error_token_list: globals.error_token_list.append(refresh_token) with open(globals.ERROR_TOKENS_FILE, "a", encoding="utf-8") as f: f.write(refresh_token + "\n") raise Exception(r.text) else: raise Exception(r.text[:300]) except Exception as e: logger.error(f"Failed to refresh access_token `{refresh_token}`: {str(e)}") raise HTTPException(status_code=500, detail=f"Failed to refresh access_token.") finally: await client.close() del client