diff --git a/gateway/share.py b/gateway/share.py index 171a8f3..f4dd239 100644 --- a/gateway/share.py +++ b/gateway/share.py @@ -13,7 +13,7 @@ from chatgpt.proofofWork import get_config, get_requirements_token, get_answer_t from gateway.reverseProxy import get_real_req_token, content_generator from utils.Client import Client from utils.Logger import logger -from utils.config import proxy_url_list, chatgpt_base_url_list, turnstile_solver_url, x_sign +from utils.config import proxy_url_list, chatgpt_base_url_list, turnstile_solver_url, x_sign, no_sentinel base_headers = { 'accept': '*/*', @@ -68,8 +68,8 @@ async def chatgpt_account_check(access_token): else: is_deactivated = False - if this_plan_type == "chatgptteamplan": - plan_type = "chatgptteamplan" + if "team" in this_plan_type: + plan_type = this_plan_type team_ids.append(account) elif plan_type is None: plan_type = this_plan_type @@ -113,101 +113,100 @@ async def chatgpt_refresh(refresh_token): await client.close() -@app.post("/auth/refresh") -async def refresh(request: Request): - auth_info = {} - form_data = await request.form() +if no_sentinel: + @app.post("/auth/refresh") + async def refresh(request: Request): + auth_info = {} + form_data = await request.form() - auth_info.update(form_data) + auth_info.update(form_data) - access_token = auth_info.get("access_token", auth_info.get("accessToken", "")) - refresh_token = auth_info.get("refresh_token", "") + access_token = auth_info.get("access_token", auth_info.get("accessToken", "")) + refresh_token = auth_info.get("refresh_token", "") - if not refresh_token and not access_token: - raise HTTPException(status_code=401, detail="refresh_token or access_token is required") + if not refresh_token and not access_token: + raise HTTPException(status_code=401, detail="refresh_token or access_token is required") - if access_token: - account_check_info = await chatgpt_account_check(access_token) - if account_check_info: - auth_info.update(account_check_info) - auth_info.update({"accessToken": access_token}) - return Response(content=json.dumps(auth_info), media_type="application/json") - - if refresh_token: - chatgpt_refresh_info = await chatgpt_refresh(refresh_token) - if chatgpt_refresh_info: - auth_info.update(chatgpt_refresh_info) - access_token = auth_info.get("accessToken", "") + if access_token: account_check_info = await chatgpt_account_check(access_token) if account_check_info: auth_info.update(account_check_info) auth_info.update({"accessToken": access_token}) return Response(content=json.dumps(auth_info), media_type="application/json") - raise HTTPException(status_code=401, detail="Unauthorized") + + if refresh_token: + chatgpt_refresh_info = await chatgpt_refresh(refresh_token) + if chatgpt_refresh_info: + auth_info.update(chatgpt_refresh_info) + access_token = auth_info.get("accessToken", "") + account_check_info = await chatgpt_account_check(access_token) + if account_check_info: + auth_info.update(account_check_info) + auth_info.update({"accessToken": access_token}) + return Response(content=json.dumps(auth_info), media_type="application/json") + raise HTTPException(status_code=401, detail="Unauthorized") -@app.post("/backend-api/conversation") -async def chat_conversations(request: Request): - token = request.headers.get("Authorization", "").replace("Bearer ", "") - req_token = await get_real_req_token(token) - access_token = await verify_token(req_token) - ua = get_ua(req_token) - user_agent = ua.get("user-agent", "") - proxy_url = random.choice(proxy_url_list) if proxy_url_list else None - host_url = random.choice(chatgpt_base_url_list) if chatgpt_base_url_list else "https://chatgpt.com" - proof_token = None - turnstile_token = None + @app.post("/backend-api/conversation") + async def chat_conversations(request: Request): + token = request.headers.get("Authorization", "").replace("Bearer ", "") + req_token = await get_real_req_token(token) + access_token = await verify_token(req_token) + ua = get_ua(req_token) + user_agent = ua.get("user-agent", "") + proxy_url = random.choice(proxy_url_list) if proxy_url_list else None + host_url = random.choice(chatgpt_base_url_list) if chatgpt_base_url_list else "https://chatgpt.com" + proof_token = None + turnstile_token = None - headers = base_headers.copy() - headers.update(ua) - headers.update({"authorization": f"Bearer {access_token}"}) + headers = base_headers.copy() + headers.update(ua) + headers.update({"authorization": f"Bearer {access_token}"}) - client = Client(proxy=proxy_url, impersonate=ua.get("impersonate", "safari15_3")) + client = Client(proxy=proxy_url, impersonate=ua.get("impersonate", "safari15_3")) - config = get_config(user_agent) - p = get_requirements_token(config) - data = {'p': p} - r = await client.post(f'{host_url}/backend-api/sentinel/chat-requirements', headers=headers, json=data, timeout=10) - resp = r.json() - turnstile = resp.get('turnstile', {}) - turnstile_required = turnstile.get('required') - if turnstile_required: - turnstile_dx = turnstile.get("dx") - try: - if turnstile_solver_url: - res = await client.post( - turnstile_solver_url, json={"url": "https://chatgpt.com", "p": p, "dx": turnstile_dx} - ) - turnstile_token = res.json().get("t") - except Exception as e: - logger.info(f"Turnstile ignored: {e}") + config = get_config(user_agent) + p = get_requirements_token(config) + data = {'p': p} + r = await client.post(f'{host_url}/backend-api/sentinel/chat-requirements', headers=headers, json=data, timeout=10) + resp = r.json() + turnstile = resp.get('turnstile', {}) + turnstile_required = turnstile.get('required') + if turnstile_required: + turnstile_dx = turnstile.get("dx") + try: + if turnstile_solver_url: + res = await client.post(turnstile_solver_url, json={"url": "https://chatgpt.com", "p": p, "dx": turnstile_dx}) + turnstile_token = res.json().get("t") + except Exception as e: + logger.info(f"Turnstile ignored: {e}") - proofofwork = resp.get('proofofwork', {}) - proofofwork_required = proofofwork.get('required') - if proofofwork_required: - proofofwork_diff = proofofwork.get("difficulty") - proofofwork_seed = proofofwork.get("seed") - proof_token, solved = await run_in_threadpool( - get_answer_token, proofofwork_seed, proofofwork_diff, config - ) - if not solved: - raise HTTPException(status_code=403, detail="Failed to solve proof of work") - chat_token = resp.get('token') - headers.update({ - "openai-sentinel-chat-requirements-token": chat_token, - "openai-sentinel-proof-token": proof_token, - "openai-sentinel-turnstile-token": turnstile_token, - }) + proofofwork = resp.get('proofofwork', {}) + proofofwork_required = proofofwork.get('required') + if proofofwork_required: + proofofwork_diff = proofofwork.get("difficulty") + proofofwork_seed = proofofwork.get("seed") + proof_token, solved = await run_in_threadpool( + get_answer_token, proofofwork_seed, proofofwork_diff, config + ) + if not solved: + raise HTTPException(status_code=403, detail="Failed to solve proof of work") + chat_token = resp.get('token') + headers.update({ + "openai-sentinel-chat-requirements-token": chat_token, + "openai-sentinel-proof-token": proof_token, + "openai-sentinel-turnstile-token": turnstile_token, + }) - params = dict(request.query_params) - data = await request.body() - request_cookies = dict(request.cookies) - background = BackgroundTask(client.close) - r = await client.post_stream(f"{host_url}/backend-api/conversation", params=params, headers=headers, cookies=request_cookies, data=data, stream=True, allow_redirects=False) - rheaders = r.headers - if x_sign: - rheaders.update({"x-sign": x_sign}) - if 'stream' in rheaders.get("content-type", ""): - return StreamingResponse(content_generator(r, token), headers=rheaders, media_type=rheaders.get("content-type"), background=background) - else: - return Response(content=(await r.atext()), headers=rheaders, media_type=rheaders.get("content-type"), status_code=r.status_code, background=background) + params = dict(request.query_params) + data = await request.body() + request_cookies = dict(request.cookies) + background = BackgroundTask(client.close) + r = await client.post_stream(f"{host_url}/backend-api/conversation", params=params, headers=headers, cookies=request_cookies, data=data, stream=True, allow_redirects=False) + rheaders = r.headers + if x_sign: + rheaders.update({"x-sign": x_sign}) + if 'stream' in rheaders.get("content-type", ""): + return StreamingResponse(content_generator(r, token), headers=rheaders, media_type=rheaders.get("content-type"), background=background) + else: + return Response(content=(await r.atext()), headers=rheaders, media_type=rheaders.get("content-type"), status_code=r.status_code, background=background) diff --git a/utils/config.py b/utils/config.py index f64748d..d10ff90 100644 --- a/utils/config.py +++ b/utils/config.py @@ -38,7 +38,6 @@ turnstile_solver_url = os.getenv('TURNSTILE_SOLVER_URL', None) history_disabled = is_true(os.getenv('HISTORY_DISABLED', True)) pow_difficulty = os.getenv('POW_DIFFICULTY', '000032') retry_times = int(os.getenv('RETRY_TIMES', 3)) -enable_gateway = is_true(os.getenv('ENABLE_GATEWAY', False)) conversation_only = is_true(os.getenv('CONVERSATION_ONLY', False)) enable_limit = is_true(os.getenv('ENABLE_LIMIT', True)) upload_by_url = is_true(os.getenv('UPLOAD_BY_URL', False)) @@ -51,6 +50,9 @@ chatgpt_base_url_list = chatgpt_base_url.split(',') if chatgpt_base_url else [] ark0se_token_url_list = ark0se_token_url.split(',') if ark0se_token_url else [] proxy_url_list = proxy_url.split(',') if proxy_url else [] +enable_gateway = is_true(os.getenv('ENABLE_GATEWAY', False)) +no_sentinel = is_true(os.getenv('NO_SENTINEL', False)) + with open('version.txt') as f: version = f.read().strip() diff --git a/version.txt b/version.txt index c6f5344..e548c47 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.6.4-beta2 \ No newline at end of file +1.6.4-beta4 \ No newline at end of file