|
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"] |
|
|
|
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 |
|
|