mirror of
https://github.com/Yanyutin753/RefreshToV1Api.git
synced 2025-10-19 09:53:55 +00:00
适配调用team对话,提供查询ChatGPT-Account-ID的/getAccountID接口
This commit is contained in:
99
main.py
99
main.py
@@ -221,7 +221,6 @@ def oaiFreeGetAccessToken(getAccessTokenUrl, refresh_token):
|
|||||||
'refresh_token': refresh_token,
|
'refresh_token': refresh_token,
|
||||||
}
|
}
|
||||||
response = requests.post(getAccessTokenUrl, data=data)
|
response = requests.post(getAccessTokenUrl, data=data)
|
||||||
logging.info(response.text)
|
|
||||||
if not response.ok:
|
if not response.ok:
|
||||||
logger.error("Request 失败: " + response.text.strip())
|
logger.error("Request 失败: " + response.text.strip())
|
||||||
return None
|
return None
|
||||||
@@ -336,9 +335,9 @@ scheduler.start()
|
|||||||
# PANDORA_UPLOAD_URL = 'files.pandoranext.com'
|
# PANDORA_UPLOAD_URL = 'files.pandoranext.com'
|
||||||
|
|
||||||
|
|
||||||
VERSION = '0.7.9.0'
|
VERSION = '0.7.9.1'
|
||||||
# VERSION = 'test'
|
# VERSION = 'test'
|
||||||
UPDATE_INFO = '接入oaifree'
|
UPDATE_INFO = '适配调用team对话,提供查询ChatGPT-Account-ID的/getAccountID接口'
|
||||||
# UPDATE_INFO = '【仅供临时测试使用】 '
|
# UPDATE_INFO = '【仅供临时测试使用】 '
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
@@ -702,7 +701,7 @@ my_files_types = [
|
|||||||
|
|
||||||
|
|
||||||
# 定义发送请求的函数
|
# 定义发送请求的函数
|
||||||
def send_text_prompt_and_get_response(messages, api_key, stream, model, proxy_api_prefix):
|
def send_text_prompt_and_get_response(messages, api_key, account_id, stream, model, proxy_api_prefix):
|
||||||
url = f"{BASE_URL}{proxy_api_prefix}/backend-api/conversation"
|
url = f"{BASE_URL}{proxy_api_prefix}/backend-api/conversation"
|
||||||
headers = {
|
headers = {
|
||||||
"Authorization": f"Bearer {api_key}"
|
"Authorization": f"Bearer {api_key}"
|
||||||
@@ -920,6 +919,11 @@ def send_text_prompt_and_get_response(messages, api_key, stream, model, proxy_ap
|
|||||||
payload["arkose_token"] = token
|
payload["arkose_token"] = token
|
||||||
# 在headers中添加新字段
|
# 在headers中添加新字段
|
||||||
headers["Openai-Sentinel-Arkose-Token"] = token
|
headers["Openai-Sentinel-Arkose-Token"] = token
|
||||||
|
|
||||||
|
# 用于调用ChatGPT Team次数
|
||||||
|
if account_id:
|
||||||
|
headers["ChatGPT-Account-ID"] = account_id
|
||||||
|
|
||||||
logger.debug(f"headers: {headers}")
|
logger.debug(f"headers: {headers}")
|
||||||
logger.debug(f"payload: {payload}")
|
logger.debug(f"payload: {payload}")
|
||||||
response = requests.post(url, headers=headers, json=payload, stream=True)
|
response = requests.post(url, headers=headers, json=payload, stream=True)
|
||||||
@@ -1139,7 +1143,8 @@ def replace_sandbox(text, conversation_id, message_id, api_key, proxy_api_prefix
|
|||||||
return replaced_text
|
return replaced_text
|
||||||
|
|
||||||
|
|
||||||
def data_fetcher(upstream_response, data_queue, stop_event, last_data_time, api_key, chat_message_id, model, proxy_api_prefix):
|
def data_fetcher(upstream_response, data_queue, stop_event, last_data_time, api_key, chat_message_id, model,
|
||||||
|
proxy_api_prefix):
|
||||||
all_new_text = ""
|
all_new_text = ""
|
||||||
|
|
||||||
first_output = True
|
first_output = True
|
||||||
@@ -1372,7 +1377,7 @@ def data_fetcher(upstream_response, data_queue, stop_event, last_data_time, api_
|
|||||||
if is_complete_sandbox_format(file_output_buffer):
|
if is_complete_sandbox_format(file_output_buffer):
|
||||||
# 替换完整的引用格式
|
# 替换完整的引用格式
|
||||||
replaced_text = replace_sandbox(file_output_buffer, conversation_id,
|
replaced_text = replace_sandbox(file_output_buffer, conversation_id,
|
||||||
message_id, api_key,proxy_api_prefix)
|
message_id, api_key, proxy_api_prefix)
|
||||||
# print(replaced_text) # 输出替换后的文本
|
# print(replaced_text) # 输出替换后的文本
|
||||||
new_text = replaced_text
|
new_text = replaced_text
|
||||||
file_output_accumulating = False
|
file_output_accumulating = False
|
||||||
@@ -1756,13 +1761,18 @@ def chat_completions():
|
|||||||
auth_header = request.headers.get('Authorization')
|
auth_header = request.headers.get('Authorization')
|
||||||
if not auth_header or not auth_header.startswith('Bearer '):
|
if not auth_header or not auth_header.startswith('Bearer '):
|
||||||
return jsonify({"error": "Authorization header is missing or invalid"}), 401
|
return jsonify({"error": "Authorization header is missing or invalid"}), 401
|
||||||
api_key = auth_header.split(' ')[1]
|
try:
|
||||||
|
api_key = auth_header.split(' ')[1].split(',')[0].strip()
|
||||||
|
account_id = auth_header.split(' ')[1].split(',')[1].strip()
|
||||||
|
logging.info(f"{api_key}:{account_id}")
|
||||||
|
except IndexError:
|
||||||
|
account_id = None
|
||||||
if not api_key.startswith("eyJhb"):
|
if not api_key.startswith("eyJhb"):
|
||||||
|
refresh_token = api_key
|
||||||
if api_key in refresh_dict:
|
if api_key in refresh_dict:
|
||||||
logger.info(f"从缓存读取到api_key.........。")
|
logger.info(f"从缓存读取到api_key.........。")
|
||||||
api_key = refresh_dict.get(api_key)
|
api_key = refresh_dict.get(api_key)
|
||||||
else:
|
else:
|
||||||
refresh_token = api_key
|
|
||||||
if REFRESH_TOACCESS_ENABLEOAI:
|
if REFRESH_TOACCESS_ENABLEOAI:
|
||||||
api_key = oaiGetAccessToken(api_key)
|
api_key = oaiGetAccessToken(api_key)
|
||||||
else:
|
else:
|
||||||
@@ -1772,7 +1782,8 @@ def chat_completions():
|
|||||||
add_to_dict(refresh_token, api_key)
|
add_to_dict(refresh_token, api_key)
|
||||||
logger.info(f"api_key: {api_key}")
|
logger.info(f"api_key: {api_key}")
|
||||||
|
|
||||||
upstream_response = send_text_prompt_and_get_response(messages, api_key, stream, model, proxy_api_prefix)
|
upstream_response = send_text_prompt_and_get_response(messages, api_key, account_id, stream, model,
|
||||||
|
proxy_api_prefix)
|
||||||
|
|
||||||
# 在非流式响应的情况下,我们需要一个变量来累积所有的 new_text
|
# 在非流式响应的情况下,我们需要一个变量来累积所有的 new_text
|
||||||
all_new_text = ""
|
all_new_text = ""
|
||||||
@@ -1791,7 +1802,8 @@ def chat_completions():
|
|||||||
|
|
||||||
# 启动数据处理线程
|
# 启动数据处理线程
|
||||||
fetcher_thread = threading.Thread(target=data_fetcher, args=(
|
fetcher_thread = threading.Thread(target=data_fetcher, args=(
|
||||||
upstream_response, data_queue, stop_event, last_data_time, api_key, chat_message_id, model,proxy_api_prefix))
|
upstream_response, data_queue, stop_event, last_data_time, api_key, chat_message_id, model,
|
||||||
|
proxy_api_prefix))
|
||||||
fetcher_thread.start()
|
fetcher_thread.start()
|
||||||
|
|
||||||
# 启动保活线程
|
# 启动保活线程
|
||||||
@@ -1848,9 +1860,9 @@ def chat_completions():
|
|||||||
fetcher_thread.join()
|
fetcher_thread.join()
|
||||||
keep_alive_thread.join()
|
keep_alive_thread.join()
|
||||||
|
|
||||||
if conversation_id:
|
# if conversation_id:
|
||||||
# print(f"准备删除的会话id: {conversation_id}")
|
# # print(f"准备删除的会话id: {conversation_id}")
|
||||||
delete_conversation(conversation_id, api_key,proxy_api_prefix)
|
# delete_conversation(conversation_id, api_key,proxy_api_prefix)
|
||||||
|
|
||||||
if not stream:
|
if not stream:
|
||||||
# 执行流式响应的生成函数来累积 all_new_text
|
# 执行流式响应的生成函数来累积 all_new_text
|
||||||
@@ -1924,14 +1936,19 @@ def images_generations():
|
|||||||
auth_header = request.headers.get('Authorization')
|
auth_header = request.headers.get('Authorization')
|
||||||
if not auth_header or not auth_header.startswith('Bearer '):
|
if not auth_header or not auth_header.startswith('Bearer '):
|
||||||
return jsonify({"error": "Authorization header is missing or invalid"}), 401
|
return jsonify({"error": "Authorization header is missing or invalid"}), 401
|
||||||
api_key = auth_header.split(' ')[1]
|
try:
|
||||||
|
api_key = auth_header.split(' ')[1].split(',')[0].strip()
|
||||||
|
account_id = auth_header.split(' ')[1].split(',')[1].strip()
|
||||||
|
logging.info(f"{api_key}:{account_id}")
|
||||||
|
except IndexError:
|
||||||
|
account_id = None
|
||||||
if not api_key.startswith("eyJhb"):
|
if not api_key.startswith("eyJhb"):
|
||||||
|
refresh_token = api_key
|
||||||
if api_key in refresh_dict:
|
if api_key in refresh_dict:
|
||||||
logger.info(f"从缓存读取到api_key.........")
|
logger.info(f"从缓存读取到api_key.........")
|
||||||
api_key = refresh_dict.get(api_key)
|
api_key = refresh_dict.get(api_key)
|
||||||
else:
|
else:
|
||||||
if REFRESH_TOACCESS_ENABLEOAI:
|
if REFRESH_TOACCESS_ENABLEOAI:
|
||||||
refresh_token = api_key
|
|
||||||
api_key = oaiGetAccessToken(api_key)
|
api_key = oaiGetAccessToken(api_key)
|
||||||
else:
|
else:
|
||||||
api_key = oaiFreeGetAccessToken(REFRESH_TOACCESS_OAIFREE_REFRESHTOACCESS_URL, api_key)
|
api_key = oaiFreeGetAccessToken(REFRESH_TOACCESS_OAIFREE_REFRESHTOACCESS_URL, api_key)
|
||||||
@@ -1951,7 +1968,7 @@ def images_generations():
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
upstream_response = send_text_prompt_and_get_response(messages, api_key, False, model,proxy_api_prefix)
|
upstream_response = send_text_prompt_and_get_response(messages, api_key, account_id, False, model, proxy_api_prefix)
|
||||||
|
|
||||||
# 在非流式响应的情况下,我们需要一个变量来累积所有的 new_text
|
# 在非流式响应的情况下,我们需要一个变量来累积所有的 new_text
|
||||||
all_new_text = ""
|
all_new_text = ""
|
||||||
@@ -2367,6 +2384,56 @@ def get_file(filename):
|
|||||||
return send_from_directory('files', filename)
|
return send_from_directory('files', filename)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route(f'/{API_PREFIX}/getAccountID' if API_PREFIX else '/getAccountID', methods=['POST'])
|
||||||
|
@cross_origin() # 使用装饰器来允许跨域请求
|
||||||
|
def getAccountID():
|
||||||
|
logger.info(f"New Img Request")
|
||||||
|
proxy_api_prefix = getPROXY_API_PREFIX(lock)
|
||||||
|
if proxy_api_prefix == None:
|
||||||
|
return jsonify({"error": "PROXY_API_PREFIX is not accessible"}), 401
|
||||||
|
auth_header = request.headers.get('Authorization')
|
||||||
|
if not auth_header or not auth_header.startswith('Bearer '):
|
||||||
|
return jsonify({"error": "Authorization header is missing or invalid"}), 401
|
||||||
|
try:
|
||||||
|
api_key = auth_header.split(' ')[1].split(',')[0].strip()
|
||||||
|
account_id = auth_header.split(' ')[1].split(',')[1].strip()
|
||||||
|
except IndexError:
|
||||||
|
account_id = None
|
||||||
|
if not api_key.startswith("eyJhb"):
|
||||||
|
refresh_token = api_key
|
||||||
|
if api_key in refresh_dict:
|
||||||
|
logger.info(f"从缓存读取到api_key.........")
|
||||||
|
api_key = refresh_dict.get(api_key)
|
||||||
|
else:
|
||||||
|
if REFRESH_TOACCESS_ENABLEOAI:
|
||||||
|
api_key = oaiGetAccessToken(api_key)
|
||||||
|
else:
|
||||||
|
api_key = oaiFreeGetAccessToken(REFRESH_TOACCESS_OAIFREE_REFRESHTOACCESS_URL, api_key)
|
||||||
|
if not api_key.startswith("eyJhb"):
|
||||||
|
return jsonify({"error": "refresh_token is wrong or refresh_token url is wrong!"}), 401
|
||||||
|
add_to_dict(refresh_token, api_key)
|
||||||
|
logger.info(f"api_key: {api_key}")
|
||||||
|
|
||||||
|
url = f"{BASE_URL}{proxy_api_prefix}/backend-api/accounts/check/v4-2023-04-27"
|
||||||
|
headers = {
|
||||||
|
"Authorization": "Bearer " + api_key
|
||||||
|
}
|
||||||
|
res = requests.get(url, headers=headers)
|
||||||
|
if res.status_code == 200:
|
||||||
|
data = res.json()
|
||||||
|
result = {"plus": set(), "team": set()}
|
||||||
|
for account_id, account_data in data["accounts"].items():
|
||||||
|
plan_type = account_data["account"]["plan_type"]
|
||||||
|
if plan_type == "team":
|
||||||
|
result[plan_type].add(account_id)
|
||||||
|
elif plan_type == "plus":
|
||||||
|
result[plan_type].add(account_id)
|
||||||
|
result = {plan_type: list(ids) for plan_type, ids in result.items()}
|
||||||
|
return jsonify(result)
|
||||||
|
else:
|
||||||
|
return jsonify({"error": "Request failed."}), 400
|
||||||
|
|
||||||
|
|
||||||
# 内置自动刷新access_token
|
# 内置自动刷新access_token
|
||||||
def updateRefresh_dict():
|
def updateRefresh_dict():
|
||||||
success_num = 0
|
success_num = 0
|
||||||
|
Reference in New Issue
Block a user