feat:添加seedmap管理接口

This commit is contained in:
h88782481 2024-10-31 17:30:13 +08:00
parent 32bebf54bf
commit b40d85ee26
4 changed files with 168 additions and 23 deletions

View File

@ -140,6 +140,7 @@ curl --location 'http://127.0.0.1:5005/v1/chat/completions' \
| | SCHEDULED_REFRESH | `false` | `false` | 是否定时刷新 `AccessToken` 开启后每次启动程序将会全部非强制刷新一次每4天晚上3点全部强制刷新一次。 |
| | RANDOM_TOKEN | `true` | `true` | 是否随机选取后台 `Token` ,开启后随机后台账号,关闭后为顺序轮询 |
| 网关功能 | ENABLE_GATEWAY | `false` | `false` | 是否启用网关模式,开启后可以使用镜像站,但也将会不设防 |
| | AUTOSEED | `false` | `true` | 是否启用随机账号模式,默认启用,输入`seed`后随机匹配后台`Token`。关闭之后需要手动对接接口,来进行`Token`管控。 |
## 部署

View File

@ -8,34 +8,40 @@ from fastapi import HTTPException
import utils.globals as globals
from chatgpt.refreshToken import rt2ac
from utils.Logger import logger
from utils.config import authorization_list, random_token
from utils.config import authorization_list, random_token, autoseed
def get_req_token(req_token, seed=None):
available_token_list = list(set(globals.token_list) - set(globals.error_token_list))
length = len(available_token_list)
if seed and length > 0:
if seed not in globals.seed_map.keys():
globals.seed_map[seed] = {"token": random.choice(available_token_list), "conversations": []}
with open(globals.SEED_MAP_FILE, "w") as f:
json.dump(globals.seed_map, f, indent=4)
else:
req_token = globals.seed_map[seed]["token"]
return req_token
if req_token in authorization_list:
if len(available_token_list) > 0:
if random_token:
req_token = random.choice(available_token_list)
return req_token
if autoseed:
available_token_list = list(set(globals.token_list) - set(globals.error_token_list))
length = len(available_token_list)
if seed and length > 0:
if seed not in globals.seed_map.keys():
globals.seed_map[seed] = {"token": random.choice(available_token_list), "conversations": []}
with open(globals.SEED_MAP_FILE, "w") as f:
json.dump(globals.seed_map, f, indent=4)
else:
globals.count += 1
globals.count %= length
return available_token_list[globals.count]
req_token = globals.seed_map[seed]["token"]
return req_token
if req_token in authorization_list:
if len(available_token_list) > 0:
if random_token:
req_token = random.choice(available_token_list)
return req_token
else:
globals.count += 1
globals.count %= length
return available_token_list[globals.count]
else:
return None
else:
return None
return req_token
else:
return req_token
if seed not in globals.seed_map.keys():
raise HTTPException(status_code=401, detail={"error": "Invalid Seed"})
return globals.seed_map[seed]["token"]
def get_ua(req_token):

View File

@ -4,7 +4,7 @@ import time
from fastapi import Request, HTTPException
from fastapi.responses import HTMLResponse, RedirectResponse, Response
from utils.config import authorization_list
import utils.globals as globals
from app import app, templates
from gateway.reverseProxy import chatgpt_reverse_proxy
@ -23,6 +23,143 @@ if enable_gateway:
response.set_cookie("token", value=token, expires="Thu, 01 Jan 2099 00:00:00 GMT")
return response
def verify_authorization(request: Request):
# 获取请求头中的 Authorization
auth_header = request.headers.get("Authorization")
if not auth_header:
raise HTTPException(
status_code=401,
detail="Authorization header is missing"
)
# 与配置中的 authorization 进行比较
if auth_header not in authorization_list:
raise HTTPException(
status_code=403,
detail="Invalid authorization"
)
@app.get("/seedtoken")
async def get_seedtoken(request: Request):
# 验证 authorization
verify_authorization(request)
try:
# 获取查询参数
params = request.query_params
seed = params.get("seed")
# 如果提供了seed参数返回特定seed的token
if seed:
if seed not in globals.seed_map:
raise HTTPException(
status_code=404,
detail=f"Seed '{seed}' not found"
)
return {
"status": "success",
"data": {
"seed": seed,
"token": globals.seed_map[seed]["token"]
}
}
# 如果没有提供seed参数返回所有seed的token
token_map = {
seed: data["token"]
for seed, data in globals.seed_map.items()
}
return {
"status": "success",
"data": token_map
}
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Internal server error: {str(e)}"
)
@app.post("/seedtoken")
async def set_seedtoken(request: Request):
# 验证 authorization
verify_authorization(request)
# 获取请求体的JSON数据
data = await request.json()
# 假设请求中包含 seed 和 token 字段
seed = data.get("seed")
token = data.get("token")
# 如果seed不存在于seed_map中创建新条目
if seed not in globals.seed_map:
globals.seed_map[seed] = {
"token": token,
"conversations": []
}
else:
# 如果seed已存在更新token
globals.seed_map[seed]["token"] = token
with open(globals.SEED_MAP_FILE, "w", encoding="utf-8") as f:
json.dump(globals.seed_map, f, indent=4)
# 返回成功响应
return {
"status": "success",
"message": "Token updated successfully",
}
@app.delete("/seedtoken")
async def delete_seedtoken(request: Request):
# 验证 authorization
verify_authorization(request)
try:
# 获取请求中的数据
data = await request.json()
seed = data.get("seed")
# 检查是否提供了seed
if not seed:
raise HTTPException(
status_code=400,
detail="Missing required field: seed"
)
# 检查seed是否存在于seed_map中
if seed not in globals.seed_map:
raise HTTPException(
status_code=404,
detail=f"Seed '{seed}' not found"
)
# 删除指定的seed
del globals.seed_map[seed]
# 将更新后的seed_map保存到文件
with open(globals.SEED_MAP_FILE, "w", encoding="utf-8") as f:
json.dump(globals.seed_map, f, indent=4)
# 返回成功响应
return {
"status": "success",
"message": f"Seed '{seed}' deleted successfully"
}
except json.JSONDecodeError:
raise HTTPException(
status_code=400,
detail="Invalid JSON data"
)
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Internal server error: {str(e)}"
)
@app.get("/login", response_class=HTMLResponse)
async def login_html(request: Request):

View File

@ -21,6 +21,7 @@ def is_true(x):
api_prefix = os.getenv('API_PREFIX', None)
autoseed = os.getenv('AUTOSEED', True)
authorization = os.getenv('AUTHORIZATION', '').replace(' ', '')
chatgpt_base_url = os.getenv('CHATGPT_BASE_URL', 'https://chatgpt.com').replace(' ', '')
auth_key = os.getenv('AUTH_KEY', None)