From 2388d437cc7be5abeaf040121f6feeff069d6ae7 Mon Sep 17 00:00:00 2001 From: lanqian528 <5499636+lanqian528@users.noreply.github.com> Date: Sat, 26 Oct 2024 02:06:22 +0800 Subject: [PATCH] v1.5.5 use rt and at --- .github/workflows/build_docker.yml | 2 +- README.md | 2 +- chat2api.py | 42 ++++++++++++++++++++---------- chatgpt/authorization.py | 8 ++++-- chatgpt/reverseProxy.py | 13 ++++++--- templates/chatgpt.html | 2 +- utils/config.py | 2 +- 7 files changed, 48 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml index ad61ac6..9644031 100644 --- a/.github/workflows/build_docker.yml +++ b/.github/workflows/build_docker.yml @@ -37,7 +37,7 @@ jobs: images: lanqian528/chat2api tags: | type=raw,value=latest,enable={{is_default_branch}} - type=raw,value=v1.5.4 + type=raw,value=v1.5.5 - name: Build and push uses: docker/build-push-action@v5 diff --git a/README.md b/README.md index ff3ab85..2d540e3 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ ## 功能 -### 最新版 v1.5.4 +### 最新版 v1.5.5 > 已完成 > - [x] 流式、非流式传输 diff --git a/chat2api.py b/chat2api.py index 6d7413d..089b8ca 100644 --- a/chat2api.py +++ b/chat2api.py @@ -11,7 +11,7 @@ from fastapi.responses import StreamingResponse, JSONResponse from fastapi.security import OAuth2PasswordBearer from fastapi.templating import Jinja2Templates from starlette.background import BackgroundTask -from starlette.responses import RedirectResponse +from starlette.responses import RedirectResponse, Response from chatgpt.ChatService import ChatService from chatgpt.authorization import refresh_all_tokens, verify_token, get_req_token @@ -135,25 +135,32 @@ async def chatgpt(request: Request): if not enable_gateway: raise HTTPException(status_code=404, detail="Gateway is disabled") - seed_token = request.query_params.get("seed", None) + seed_token = request.query_params.get("seed") + if not seed_token: + seed_token = request.cookies.get("seed_token") if not seed_token: seed_token = str(int(time.time())) + req_token = get_req_token(seed_token) + seed_token = await verify_token(req_token) - response = templates.TemplateResponse("chatgpt.html", {"request": request, "seed_token": seed_token}) - # response.set_cookie("req_token", value=req_token) - # response.set_cookie("access_token", value=access_token) + response = templates.TemplateResponse("chatgpt.html", {"request": request, "access_token": seed_token}) response.set_cookie("seed_token", value=seed_token) return response +@app.get("/backend-api/gizmos/bootstrap") +async def get_gizmos_bootstrap(): + return {"gizmos": []} + + # @app.get("/backend-api/conversations") # async def get_conversations(): # return {"items": [], "total": 0, "limit": 28, "offset": 0, "has_missing_conversations": False} -@app.get("/backend-api/gizmos/bootstrap") -async def get_gizmos_bootstrap(): - return {"gizmos": []} +@app.patch("/backend-api/conversations") +async def get_conversations(): + return {"success": True, "message": None} @app.get("/backend-api/me") @@ -200,12 +207,19 @@ async def get_me(): } +banned_paths = ["backend-api/accounts/logout_all", "backend-api/accounts/deactivate", "backend-api/user_system_messages"] +redirect_paths = ["auth/logout", "c/"] + + @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "PATCH", "TRACE"]) async def reverse_proxy(request: Request, path: str): - if path.startswith("c/"): - seed_token = request.cookies.get("seed_token") - if not seed_token: - seed_token = str(int(time.time())) - redirect_url = str(request.base_url) + "?seed=" + seed_token - return RedirectResponse(url=redirect_url, status_code=302) + for banned_path in banned_paths: + if banned_path in path: + return Response(status_code=404) + + for redirect_path in redirect_paths: + if redirect_path in path: + redirect_url = str(request.base_url) + return RedirectResponse(url=redirect_url, status_code=302) + return await chatgpt_reverse_proxy(request, path) diff --git a/chatgpt/authorization.py b/chatgpt/authorization.py index 82f7975..d0c6bd8 100644 --- a/chatgpt/authorization.py +++ b/chatgpt/authorization.py @@ -1,13 +1,17 @@ import asyncio +import os import random -from fastapi import HTTPException import ua_generator +from fastapi import HTTPException +import chatgpt.globals as globals from chatgpt.refreshToken import rt2ac from utils.Logger import logger from utils.config import authorization_list, random_token -import chatgpt.globals as globals + +os.environ['PYTHONHASHSEED'] = '0' +random.seed(0) def get_req_token(req_token, seed=None): diff --git a/chatgpt/reverseProxy.py b/chatgpt/reverseProxy.py index 156277b..469a2d0 100644 --- a/chatgpt/reverseProxy.py +++ b/chatgpt/reverseProxy.py @@ -104,11 +104,18 @@ async def chatgpt_reverse_proxy(request: Request, path: str): "sec-fetch-site": "same-origin", }) - seed_token = headers.get("authorization", None) + seed_token = headers.get("authorization", "").replace("Bearer ", "") if seed_token: - req_token = get_req_token(None, seed_token) + req_token = get_req_token(seed_token) access_token = await verify_token(req_token) - headers.update({"authorization": access_token}) + if access_token.startswith("eyJhbGciOi"): + headers.update({"authorization": access_token}) + else: + req_token = get_req_token(None, seed_token) + access_token = await verify_token(req_token) + headers.update({"authorization": access_token}) + else: + headers.pop("authorization", None) data = await request.body() diff --git a/templates/chatgpt.html b/templates/chatgpt.html index aeecd7a..64b35a7 100644 --- a/templates/chatgpt.html +++ b/templates/chatgpt.html @@ -4309,7 +4309,7 @@ "queryKey": ["session"], "state": { "data": { - "accessToken": "{{ seed_token }}", + "accessToken": "{{ access_token }}", "authProvider": "login-web", "user": {} }, diff --git a/utils/config.py b/utils/config.py index bd00f34..9b70ac2 100644 --- a/utils/config.py +++ b/utils/config.py @@ -52,7 +52,7 @@ proxy_url_list = proxy_url.split(',') if proxy_url else [] user_agents_list = ast.literal_eval(user_agents) logger.info("-" * 60) -logger.info("Chat2Api 1.5.4 | https://github.com/lanqian528/chat2api") +logger.info("Chat2Api 1.5.5 | https://github.com/lanqian528/chat2api") logger.info("-" * 60) logger.info("Environment variables:") logger.info("API_PREFIX: " + str(api_prefix))