55import base64
66import sys
77import inspect
8+ import secrets
89from loguru import logger
910
1011import requests
11- from flask import Flask , request , Response , jsonify , stream_with_context
12+ from flask import Flask , request , Response , jsonify , stream_with_context , render_template , redirect , session
1213from curl_cffi import requests as curl_requests
1314from werkzeug .middleware .proxy_fix import ProxyFix
1415
15-
1616class Logger :
1717 def __init__ (self , level = "INFO" , colorize = True , format = None ):
1818 logger .remove ()
@@ -103,6 +103,10 @@ async def request_logger(self, request):
103103 "RETRY_TIME" : 1000 ,
104104 "PROXY" : os .environ .get ("PROXY" ) or None
105105 },
106+ "ADMIN" : {
107+ "MANAGER_SWITCH" : os .environ .get ("MANAGER_SWITCH" ) or None ,
108+ "PASSWORD" : os .environ .get ("ADMINPASSWORD" ) or None
109+ },
106110 "SERVER" : {
107111 "COOKIE" : None ,
108112 "CF_CLEARANCE" :os .environ .get ("CF_CLEARANCE" ) or None ,
@@ -587,7 +591,6 @@ def prepare_chat_request(self, request):
587591 if last_message ["role" ] != 'user' :
588592 raise ValueError ('此模型最后一条消息必须是用户消息!' )
589593 todo_messages = [last_message ]
590-
591594 file_attachments = []
592595 messages = ''
593596 last_role = None
@@ -658,12 +661,12 @@ def process_content(content):
658661 message_length += len (messages )
659662 if message_length >= 40000 :
660663 convert_to_file = True
664+
661665 if convert_to_file :
662666 file_id = self .upload_base64_file (messages , request ["model" ])
663667 if file_id :
664668 file_attachments .insert (0 , file_id )
665669 messages = last_message_content .strip ()
666-
667670 return {
668671 "temporary" : CONFIG ["API" ].get ("IS_TEMP_CONVERSATION" , False ),
669672 "modelName" : self .model_id ,
@@ -785,7 +788,7 @@ def handle_image_response(image_url):
785788 ** DEFAULT_HEADERS ,
786789 "Cookie" :CONFIG ["SERVER" ]['COOKIE' ]
787790 },
788- impersonate = "chrome120 " ,
791+ impersonate = "chrome133a " ,
789792 ** proxy_options
790793 )
791794
@@ -968,11 +971,76 @@ def initialization():
968971
969972app = Flask (__name__ )
970973app .wsgi_app = ProxyFix (app .wsgi_app )
974+ app .secret_key = os .environ .get ('FLASK_SECRET_KEY' ) or secrets .token_hex (16 )
975+ app .json .sort_keys = False
976+
977+ @app .route ('/manager/login' , methods = ['GET' , 'POST' ])
978+ def manager_login ():
979+ if CONFIG ["ADMIN" ]["MANAGER_SWITCH" ]:
980+ if request .method == 'POST' :
981+ password = request .form .get ('password' )
982+ if password == CONFIG ["ADMIN" ]["PASSWORD" ]:
983+ session ['is_logged_in' ] = True
984+ return redirect ('/manager' )
985+ return render_template ('login.html' , error = True )
986+ return render_template ('login.html' , error = False )
987+ else :
988+ return redirect ('/' )
989+
990+ def check_auth ():
991+ return session .get ('is_logged_in' , False )
992+
993+ @app .route ('/manager' )
994+ def manager ():
995+ if not check_auth ():
996+ return redirect ('/manager/login' )
997+ return render_template ('manager.html' )
998+
999+ @app .route ('/manager/api/get' )
1000+ def get_manager_tokens ():
1001+ if not check_auth ():
1002+ return jsonify ({"error" : "Unauthorized" }), 401
1003+ return jsonify (token_manager .get_token_status_map ())
9711004
1005+ @app .route ('/manager/api/add' , methods = ['POST' ])
1006+ def add_manager_token ():
1007+ if not check_auth ():
1008+ return jsonify ({"error" : "Unauthorized" }), 401
1009+ try :
1010+ sso = request .json .get ('sso' )
1011+ if not sso :
1012+ return jsonify ({"error" : "SSO token is required" }), 400
1013+ token_manager .add_token (f"sso-rw={ sso } ;sso={ sso } " )
1014+ return jsonify ({"success" : True })
1015+ except Exception as e :
1016+ return jsonify ({"error" : str (e )}), 500
1017+
1018+ @app .route ('/manager/api/delete' , methods = ['POST' ])
1019+ def delete_manager_token ():
1020+ if not check_auth ():
1021+ return jsonify ({"error" : "Unauthorized" }), 401
1022+ try :
1023+ sso = request .json .get ('sso' )
1024+ if not sso :
1025+ return jsonify ({"error" : "SSO token is required" }), 400
1026+ token_manager .delete_token (f"sso-rw={ sso } ;sso={ sso } " )
1027+ return jsonify ({"success" : True })
1028+ except Exception as e :
1029+ return jsonify ({"error" : str (e )}), 500
1030+
1031+ @app .route ('/manager/api/cf_clearance' , methods = ['POST' ])
1032+ def setCf_Manager_clearance ():
1033+ if not check_auth ():
1034+ return jsonify ({"error" : "Unauthorized" }), 401
1035+ try :
1036+ cf_clearance = request .json .get ('cf_clearance' )
1037+ if not cf_clearance :
1038+ return jsonify ({"error" : "cf_clearance is required" }), 400
1039+ CONFIG ["SERVER" ]['CF_CLEARANCE' ] = cf_clearance
1040+ return jsonify ({"success" : True })
1041+ except Exception as e :
1042+ return jsonify ({"error" : str (e )}), 500
9721043
973- @app .before_request
974- def log_request_info ():
975- logger .info (f"{ request .method } { request .path } " , "Request" )
9761044
9771045@app .route ('/get/tokens' , methods = ['GET' ])
9781046def get_tokens ():
@@ -981,7 +1049,6 @@ def get_tokens():
9811049 return jsonify ({"error" : '自定义的SSO令牌模式无法获取轮询sso令牌状态' }), 403
9821050 elif auth_token != CONFIG ["API" ]["API_KEY" ]:
9831051 return jsonify ({"error" : 'Unauthorized' }), 401
984-
9851052 return jsonify (token_manager .get_token_status_map ())
9861053
9871054@app .route ('/add/token' , methods = ['POST' ])
0 commit comments