mirror of
https://github.com/lanqian528/chat2api.git
synced 2026-06-05 21:03:53 +08:00
feat:添加seedmap管理接口
This commit is contained in:
parent
32bebf54bf
commit
b40d85ee26
@ -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`管控。 |
|
||||
|
||||
## 部署
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user