acips commited on
Commit
d6f4ad9
·
verified ·
1 Parent(s): a26c45a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +362 -361
app.py CHANGED
@@ -1,362 +1,363 @@
1
- import os
2
- import time
3
- import json
4
- import secrets
5
- from functools import wraps
6
- from flask import Flask, request, Response, jsonify, render_template, redirect, session
7
- from werkzeug.middleware.proxy_fix import ProxyFix
8
-
9
- from config import config_manager
10
- from logger import logger
11
- from token_manager import AuthTokenManager
12
- from request_handler import RequestHandler
13
-
14
- app = Flask(__name__)
15
- app.wsgi_app = ProxyFix(app.wsgi_app)
16
- app.secret_key = os.environ.get('FLASK_SECRET_KEY') or secrets.token_hex(16)
17
- app.json.sort_keys = False
18
-
19
- token_manager = AuthTokenManager()
20
- request_handler = RequestHandler(token_manager)
21
-
22
-
23
- def admin_required(f):
24
- """管理员鉴权装饰器"""
25
- @wraps(f)
26
- def decorated_function(*args, **kwargs):
27
- # 检查session中是否有有效的管理员身份验证
28
- if session.get('admin_authenticated'):
29
- return f(*args, **kwargs)
30
-
31
- # 检查请求头中的管理员密钥
32
- admin_key = request.headers.get('X-Admin-Key')
33
- if admin_key and admin_key == config_manager.get("ADMIN.ADMIN_KEY"):
34
- session['admin_authenticated'] = True
35
- return f(*args, **kwargs)
36
-
37
- # 如果是AJAX请求,返回JSON错误
38
- if request.headers.get('Content-Type') == 'application/json' or request.is_json:
39
- return jsonify({"error": "Unauthorized access", "redirect": "/manager/login"}), 401
40
-
41
- # 否则重定向到登录页面
42
- return redirect('/manager/login')
43
- return decorated_function
44
-
45
-
46
- def initialization():
47
- token_manager.load_from_env()
48
-
49
- if config_manager.get("API.PROXY"):
50
- logger.info(f"代理已设置: {config_manager.get('API.PROXY')}", "Server")
51
-
52
- logger.info("初始化完成", "Server")
53
-
54
-
55
- @app.route('/manager/login', methods=['GET', 'POST'])
56
- def manager_login():
57
- if request.method == 'POST':
58
- admin_key = request.json.get('admin_key') if request.is_json else request.form.get('admin_key')
59
-
60
- if admin_key and admin_key == config_manager.get("ADMIN.ADMIN_KEY"):
61
- session['admin_authenticated'] = True
62
- if request.is_json:
63
- return jsonify({"success": True, "redirect": "/manager"})
64
- else:
65
- return redirect('/manager')
66
- else:
67
- if request.is_json:
68
- return jsonify({"error": "Invalid admin key"}), 401
69
- else:
70
- return render_template('login.html', error="Invalid admin key")
71
-
72
- # GET请求,如果已经认证则直接跳转到管理页面
73
- if session.get('admin_authenticated'):
74
- return redirect('/manager')
75
-
76
- return render_template('login.html')
77
-
78
-
79
- @app.route('/manager/logout', methods=['POST'])
80
- @admin_required
81
- def manager_logout():
82
- session.pop('admin_authenticated', None)
83
- return jsonify({"success": True, "redirect": "/manager/login"})
84
-
85
-
86
- @app.route('/manager')
87
- @admin_required
88
- def manager():
89
- return render_template('manager.html')
90
-
91
-
92
- @app.route('/manager/api/get')
93
- @admin_required
94
- def get_manager_tokens():
95
- return jsonify(token_manager.get_token_status_map())
96
-
97
-
98
- @app.route('/manager/api/add', methods=['POST'])
99
- @admin_required
100
- def add_manager_token():
101
- try:
102
- data = request.json
103
-
104
- # 支持批量添加
105
- if 'tokens' in data:
106
- # 批量添加模式
107
- tokens = data.get('tokens', [])
108
- if not tokens:
109
- return jsonify({"error": "Tokens list is required"}), 400
110
-
111
- result = token_manager.add_tokens_batch(tokens)
112
- return jsonify({
113
- "success": True,
114
- "added": result["success"],
115
- "duplicates": result["duplicates"],
116
- "failed": result["failed"]
117
- })
118
- else:
119
- # 单个添加模式(兼容旧版本)
120
- sso = data.get('sso')
121
- if not sso:
122
- return jsonify({"error": "SSO token is required"}), 400
123
-
124
- # 如果输入的是完整的cookie字符串,直接使用
125
- if 'sso=' in sso and 'sso-rw=' in sso:
126
- token_str = sso
127
- else:
128
- # 如果只是cookie值,构造完整的cookie字符串
129
- token_str = f"sso-rw={sso};sso={sso}"
130
-
131
- token_manager.add_token(token_str)
132
- return jsonify({"success": True})
133
- except Exception as e:
134
- return jsonify({"error": str(e)}), 500
135
-
136
-
137
- @app.route('/manager/api/delete', methods=['POST'])
138
- @admin_required
139
- def delete_manager_token():
140
- try:
141
- sso = request.json.get('sso')
142
- if not sso:
143
- return jsonify({"error": "SSO token is required"}), 400
144
-
145
- # 直接删除传入的完整cookie字符串
146
- token_manager.delete_token(sso)
147
- return jsonify({"success": True})
148
- except Exception as e:
149
- return jsonify({"error": str(e)}), 500
150
-
151
-
152
- @app.route('/manager/api/log-level', methods=['GET'])
153
- @admin_required
154
- def get_log_level():
155
- """获取当前日志级别"""
156
- try:
157
- current_level = config_manager.get_log_level()
158
- supported_levels = config_manager.get_supported_log_levels()
159
- return jsonify({
160
- "current_level": current_level,
161
- "supported_levels": supported_levels
162
- })
163
- except Exception as e:
164
- return jsonify({"error": str(e)}), 500
165
-
166
-
167
- @app.route('/manager/api/log-level', methods=['POST'])
168
- @admin_required
169
- def set_log_level():
170
- """设置日志级别"""
171
- try:
172
- data = request.json
173
- level = data.get('level')
174
-
175
- if not level:
176
- return jsonify({"error": "Log level is required"}), 400
177
-
178
- # 设置配置管理器中的日志级别
179
- if config_manager.set_log_level(level):
180
- # 动态设置logger的级别
181
- if logger.set_level(level):
182
- return jsonify({
183
- "success": True,
184
- "message": f"日志级别已设置为 {level}",
185
- "level": level
186
- })
187
- else:
188
- return jsonify({"error": "Failed to update logger level"}), 500
189
- else:
190
- supported_levels = config_manager.get_supported_log_levels()
191
- return jsonify({
192
- "error": f"Invalid log level. Supported levels: {supported_levels}"
193
- }), 400
194
- except Exception as e:
195
- return jsonify({"error": str(e)}), 500
196
-
197
-
198
- @app.route('/manager/api/test', methods=['POST'])
199
- @admin_required
200
- def test_manager_token():
201
- try:
202
- cookie = request.json.get('cookie')
203
- if not cookie:
204
- return jsonify({"error": "Cookie is required"}), 400
205
-
206
- # 构造测试请求数据
207
- test_data = {
208
- "model": "grok-3",
209
- "messages": [{"role": "user", "content": "hi"}],
210
- "stream": False
211
- }
212
-
213
- # 临时设置token进行测试
214
- original_tokens = token_manager.get_all_tokens()
215
- token_manager.tokens = [cookie] # 临时替换为测试cookie
216
- token_manager.current_index = 0
217
- token_manager.last_round_index = -1
218
-
219
- try:
220
- # 发送测试请求
221
- response = request_handler.make_grok_request(test_data, "grok-3", False)
222
-
223
- # 恢复原始tokens
224
- token_manager.tokens = original_tokens
225
- token_manager.current_index = 0
226
- token_manager.last_round_index = -1
227
-
228
- if response and isinstance(response, dict) and 'choices' in response:
229
- return jsonify({"success": True, "message": "Cookie测试成功"})
230
- else:
231
- return jsonify({"success": False, "error": "响应格式异常"})
232
-
233
- except Exception as test_error:
234
- # 恢复原始tokens
235
- token_manager.tokens = original_tokens
236
- token_manager.current_index = 0
237
- token_manager.last_round_index = -1
238
- return jsonify({"success": False, "error": str(test_error)})
239
-
240
- except Exception as e:
241
- return jsonify({"success": False, "error": str(e)}), 500
242
-
243
-
244
- @app.route('/get/tokens', methods=['GET'])
245
- def get_tokens():
246
- auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
247
- if auth_token != config_manager.get("API.API_KEY"):
248
- return jsonify({"error": 'Unauthorized'}), 401
249
- return jsonify(token_manager.get_token_status_map())
250
-
251
-
252
- @app.route('/add/token', methods=['POST'])
253
- def add_token():
254
- auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
255
- if auth_token != config_manager.get("API.API_KEY"):
256
- return jsonify({"error": 'Unauthorized'}), 401
257
-
258
- try:
259
- sso = request.json.get('sso')
260
- token_str = f"sso-rw={sso};sso={sso}"
261
- token_manager.add_token(token_str)
262
- return jsonify(token_manager.get_token_status_map().get(sso, {})), 200
263
- except Exception as error:
264
- logger.error(str(error), "Server")
265
- return jsonify({"error": '添加sso令牌失败'}), 500
266
-
267
-
268
- @app.route('/delete/token', methods=['POST'])
269
- def delete_token():
270
- auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
271
- if auth_token != config_manager.get("API.API_KEY"):
272
- return jsonify({"error": 'Unauthorized'}), 401
273
-
274
- try:
275
- sso = request.json.get('sso')
276
- token_str = f"sso-rw={sso};sso={sso}"
277
- token_manager.delete_token(token_str)
278
- return jsonify({"message": '删除sso令牌成功'}), 200
279
- except Exception as error:
280
- logger.error(str(error), "Server")
281
- return jsonify({"error": '删除sso令牌失败'}), 500
282
-
283
-
284
- @app.route('/v1/models', methods=['GET'])
285
- def get_models():
286
- return jsonify({
287
- "object": "list",
288
- "data": [
289
- {
290
- "id": model,
291
- "object": "model",
292
- "created": int(time.time()),
293
- "owned_by": "grok"
294
- }
295
- for model in config_manager.get_models().keys()
296
- ]
297
- })
298
-
299
-
300
- @app.route('/v1/chat/completions', methods=['POST'])
301
- def chat_completions():
302
- response_status_code = 500
303
-
304
- try:
305
- auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
306
- if auth_token:
307
- if auth_token != config_manager.get("API.API_KEY"):
308
- return jsonify({"error": 'Unauthorized'}), 401
309
- else:
310
- return jsonify({"error": 'API_KEY缺失'}), 401
311
-
312
- data = request.json
313
- model = data.get("model")
314
- stream = data.get("stream", False)
315
-
316
- try:
317
- request_handler.validate_request(data)
318
- except ValueError as e:
319
- return jsonify({"error": str(e)}), 400
320
-
321
- try:
322
- response = request_handler.make_grok_request(data, model, stream)
323
-
324
- if stream:
325
- return response
326
- else:
327
- return jsonify(response)
328
-
329
- except ValueError as e:
330
- response_status_code = 400
331
- logger.error(str(e), "ChatAPI")
332
- return jsonify({
333
- "error": {
334
- "message": str(e),
335
- "type": "invalid_request_error"
336
- }
337
- }), response_status_code
338
-
339
- except Exception as error:
340
- logger.error(str(error), "ChatAPI")
341
- return jsonify({
342
- "error": {
343
- "message": str(error),
344
- "type": "server_error"
345
- }
346
- }), response_status_code
347
-
348
-
349
- @app.route('/', defaults={'path': ''})
350
- @app.route('/<path:path>')
351
- def catch_all(path):
352
- return 'api运行正常', 200
353
-
354
-
355
- if __name__ == '__main__':
356
- initialization()
357
-
358
- app.run(
359
- host='0.0.0.0',
360
- port=config_manager.get("SERVER.PORT"),
361
- debug=False
 
362
  )
 
1
+ import os
2
+ import time
3
+ import json
4
+ import secrets
5
+ from functools import wraps
6
+ from flask import Flask, request, Response, jsonify, render_template, redirect, session
7
+ from werkzeug.middleware.proxy_fix import ProxyFix
8
+
9
+ from config import config_manager
10
+ from logger import logger
11
+ from token_manager import AuthTokenManager
12
+ from request_handler import RequestHandler
13
+
14
+ app = Flask(__name__)
15
+ app.wsgi_app = ProxyFix(app.wsgi_app)
16
+ app.secret_key = os.environ.get('FLASK_SECRET_KEY') or secrets.token_hex(16)
17
+ app.json.sort_keys = False
18
+
19
+ token_manager = AuthTokenManager()
20
+ request_handler = RequestHandler(token_manager)
21
+
22
+
23
+ def admin_required(f):
24
+ """管理员鉴权装饰器"""
25
+ @wraps(f)
26
+ def decorated_function(*args, **kwargs):
27
+ # 检查session中是否有有效的管理员身份验证
28
+ if session.get('admin_authenticated'):
29
+ return f(*args, **kwargs)
30
+
31
+ # 检查请求头中的管理员密钥
32
+ admin_key = request.headers.get('X-Admin-Key')
33
+ if admin_key and admin_key == config_manager.get("ADMIN.ADMIN_KEY"):
34
+ session['admin_authenticated'] = True
35
+ return f(*args, **kwargs)
36
+
37
+ # 如果是AJAX请求,返回JSON错误
38
+ if request.headers.get('Content-Type') == 'application/json' or request.is_json:
39
+ return jsonify({"error": "Unauthorized access", "redirect": "/manager/login"}), 401
40
+
41
+ # 否则重定向到登录页面
42
+ return redirect('/manager/login')
43
+ return decorated_function
44
+
45
+
46
+ def initialization():
47
+ token_manager.load_from_env()
48
+
49
+ if config_manager.get("API.PROXY"):
50
+ logger.info(f"代理已设置: {config_manager.get('API.PROXY')}", "Server")
51
+
52
+ logger.info("初始化完成", "Server")
53
+
54
+
55
+ @app.route('/manager/login', methods=['GET', 'POST'])
56
+ def manager_login():
57
+ if request.method == 'POST':
58
+ admin_key = request.json.get('admin_key') if request.is_json else request.form.get('admin_key')
59
+
60
+ if admin_key and admin_key == config_manager.get("ADMIN.ADMIN_KEY"):
61
+ session['admin_authenticated'] = True
62
+ if request.is_json:
63
+ return jsonify({"success": True, "redirect": "/manager"})
64
+ else:
65
+ return redirect('/manager')
66
+ else:
67
+ if request.is_json:
68
+ return jsonify({"error": "Invalid admin key"}), 401
69
+ else:
70
+ return render_template('login.html', error="Invalid admin key")
71
+
72
+ # GET请求,如果已经认证则直接跳转到管理页面
73
+ if session.get('admin_authenticated'):
74
+ return redirect('/manager')
75
+
76
+ return render_template('login.html')
77
+
78
+
79
+ @app.route('/manager/logout', methods=['POST'])
80
+ @admin_required
81
+ def manager_logout():
82
+ session.pop('admin_authenticated', None)
83
+ return jsonify({"success": True, "redirect": "/manager/login"})
84
+
85
+
86
+ @app.route('/manager')
87
+ @admin_required
88
+ def manager():
89
+ return render_template('manager.html')
90
+
91
+
92
+ @app.route('/manager/api/get')
93
+ @admin_required
94
+ def get_manager_tokens():
95
+ return jsonify(token_manager.get_token_status_map())
96
+
97
+
98
+ @app.route('/manager/api/add', methods=['POST'])
99
+ @admin_required
100
+ def add_manager_token():
101
+ try:
102
+ data = request.json
103
+
104
+ # 支持批量添加
105
+ if 'tokens' in data:
106
+ # 批量添加模式
107
+ tokens = data.get('tokens', [])
108
+ if not tokens:
109
+ return jsonify({"error": "Tokens list is required"}), 400
110
+
111
+ result = token_manager.add_tokens_batch(tokens)
112
+ return jsonify({
113
+ "success": True,
114
+ "added": result["success"],
115
+ "duplicates": result["duplicates"],
116
+ "failed": result["failed"]
117
+ })
118
+ else:
119
+ # 单个添加模式(兼容旧版本)
120
+ sso = data.get('sso')
121
+ if not sso:
122
+ return jsonify({"error": "SSO token is required"}), 400
123
+
124
+ # 如果输入的是完整的cookie字符串,直接使用
125
+ if 'sso=' in sso and 'sso-rw=' in sso:
126
+ token_str = sso
127
+ else:
128
+ # 如果只是cookie值,构造完整的cookie字符串
129
+ token_str = f"sso-rw={sso};sso={sso}"
130
+
131
+ token_manager.add_token(token_str)
132
+ return jsonify({"success": True})
133
+ except Exception as e:
134
+ return jsonify({"error": str(e)}), 500
135
+
136
+
137
+ @app.route('/manager/api/delete', methods=['POST'])
138
+ @admin_required
139
+ def delete_manager_token():
140
+ try:
141
+ sso = request.json.get('sso')
142
+ if not sso:
143
+ return jsonify({"error": "SSO token is required"}), 400
144
+
145
+ # 直接删除传入的完整cookie字符串
146
+ token_manager.delete_token(sso)
147
+ return jsonify({"success": True})
148
+ except Exception as e:
149
+ return jsonify({"error": str(e)}), 500
150
+
151
+
152
+ @app.route('/manager/api/log-level', methods=['GET'])
153
+ @admin_required
154
+ def get_log_level():
155
+ """获取当前日志级别"""
156
+ try:
157
+ current_level = config_manager.get_log_level()
158
+ supported_levels = config_manager.get_supported_log_levels()
159
+ return jsonify({
160
+ "current_level": current_level,
161
+ "supported_levels": supported_levels
162
+ })
163
+ except Exception as e:
164
+ return jsonify({"error": str(e)}), 500
165
+
166
+
167
+ @app.route('/manager/api/log-level', methods=['POST'])
168
+ @admin_required
169
+ def set_log_level():
170
+ """设置日志级别"""
171
+ try:
172
+ data = request.json
173
+ level = data.get('level')
174
+
175
+ if not level:
176
+ return jsonify({"error": "Log level is required"}), 400
177
+
178
+ # 设置配置管理器中的日志级别
179
+ if config_manager.set_log_level(level):
180
+ # 动态设置logger的级别
181
+ if logger.set_level(level):
182
+ return jsonify({
183
+ "success": True,
184
+ "message": f"日志级别已设置为 {level}",
185
+ "level": level
186
+ })
187
+ else:
188
+ return jsonify({"error": "Failed to update logger level"}), 500
189
+ else:
190
+ supported_levels = config_manager.get_supported_log_levels()
191
+ return jsonify({
192
+ "error": f"Invalid log level. Supported levels: {supported_levels}"
193
+ }), 400
194
+ except Exception as e:
195
+ return jsonify({"error": str(e)}), 500
196
+
197
+
198
+ @app.route('/manager/api/test', methods=['POST'])
199
+ @admin_required
200
+ def test_manager_token():
201
+ try:
202
+ cookie = request.json.get('cookie')
203
+ if not cookie:
204
+ return jsonify({"error": "Cookie is required"}), 400
205
+
206
+ # 构造测试请求数据
207
+ test_data = {
208
+ "model": "grok-3",
209
+ "messages": [{"role": "user", "content": "hi"}],
210
+ "stream": False
211
+ }
212
+
213
+ # 临时设置token进行测试
214
+ original_tokens = token_manager.get_all_tokens()
215
+ token_manager.tokens = [cookie] # 临时替换为测试cookie
216
+ token_manager.current_index = 0
217
+ token_manager.last_round_index = -1
218
+
219
+ try:
220
+ # 发送测试请求
221
+ response = request_handler.make_grok_request(test_data, "grok-3", False)
222
+
223
+ # 恢复原始tokens
224
+ token_manager.tokens = original_tokens
225
+ token_manager.current_index = 0
226
+ token_manager.last_round_index = -1
227
+
228
+ if response and isinstance(response, dict) and 'choices' in response:
229
+ return jsonify({"success": True, "message": "Cookie测试成功"})
230
+ else:
231
+ return jsonify({"success": False, "error": "响应格式异常"})
232
+
233
+ except Exception as test_error:
234
+ # 恢复原始tokens
235
+ token_manager.tokens = original_tokens
236
+ token_manager.current_index = 0
237
+ token_manager.last_round_index = -1
238
+ return jsonify({"success": False, "error": str(test_error)})
239
+
240
+ except Exception as e:
241
+ return jsonify({"success": False, "error": str(e)}), 500
242
+
243
+
244
+ @app.route('/get/tokens', methods=['GET'])
245
+ def get_tokens():
246
+ auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
247
+ if auth_token != config_manager.get("API.API_KEY"):
248
+ return jsonify({"error": 'Unauthorized'}), 401
249
+ return jsonify(token_manager.get_token_status_map())
250
+
251
+
252
+ @app.route('/add/token', methods=['POST'])
253
+ def add_token():
254
+ auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
255
+ if auth_token != config_manager.get("API.API_KEY"):
256
+ return jsonify({"error": 'Unauthorized'}), 401
257
+
258
+ try:
259
+ sso = request.json.get('sso')
260
+ token_str = f"sso-rw={sso};sso={sso}"
261
+ token_manager.add_token(token_str)
262
+ return jsonify(token_manager.get_token_status_map().get(sso, {})), 200
263
+ except Exception as error:
264
+ logger.error(str(error), "Server")
265
+ return jsonify({"error": '添加sso令牌失败'}), 500
266
+
267
+
268
+ @app.route('/delete/token', methods=['POST'])
269
+ def delete_token():
270
+ auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
271
+ if auth_token != config_manager.get("API.API_KEY"):
272
+ return jsonify({"error": 'Unauthorized'}), 401
273
+
274
+ try:
275
+ sso = request.json.get('sso')
276
+ token_str = f"sso-rw={sso};sso={sso}"
277
+ token_manager.delete_token(token_str)
278
+ return jsonify({"message": '删除sso令牌成功'}), 200
279
+ except Exception as error:
280
+ logger.error(str(error), "Server")
281
+ return jsonify({"error": '删除sso令牌失败'}), 500
282
+
283
+
284
+ @app.route('/v1/models', methods=['GET'])
285
+ def get_models():
286
+ return jsonify({
287
+ "object": "list",
288
+ "data": [
289
+ {
290
+ "id": model,
291
+ "object": "model",
292
+ "created": int(time.time()),
293
+ "owned_by": "grok"
294
+ }
295
+ for model in config_manager.get_models().keys()
296
+ ]
297
+ })
298
+
299
+
300
+ @app.route('/v1/chat/completions', methods=['POST'])
301
+ def chat_completions():
302
+ response_status_code = 500
303
+
304
+ try:
305
+ auth_token = request.headers.get('Authorization', '').replace('Bearer ', '')
306
+ if auth_token:
307
+ if auth_token != config_manager.get("API.API_KEY"):
308
+ return jsonify({"error": 'Unauthorized'}), 401
309
+ else:
310
+ return jsonify({"error": 'API_KEY缺失'}), 401
311
+
312
+ data = request.json
313
+ model = data.get("model")
314
+ stream = data.get("stream", False)
315
+
316
+ try:
317
+ request_handler.validate_request(data)
318
+ except ValueError as e:
319
+ return jsonify({"error": str(e)}), 400
320
+
321
+ try:
322
+ response = request_handler.make_grok_request(data, model, stream)
323
+
324
+ if stream:
325
+ return response
326
+ else:
327
+ return jsonify(response)
328
+
329
+ except ValueError as e:
330
+ response_status_code = 400
331
+ logger.error(str(e), "ChatAPI")
332
+ return jsonify({
333
+ "error": {
334
+ "message": str(e),
335
+ "type": "invalid_request_error"
336
+ }
337
+ }), response_status_code
338
+
339
+ except Exception as error:
340
+ logger.error(str(error), "ChatAPI")
341
+ return jsonify({
342
+ "error": {
343
+ "message": str(error),
344
+ "type": "server_error"
345
+ }
346
+ }), response_status_code
347
+
348
+
349
+ @app.route('/', defaults={'path': ''})
350
+ @app.route('/<path:path>')
351
+ def catch_all(path):
352
+ return redirect('https://www.bilibili.com/video/BV16m411R78H/?vd_source=b0f55759b82cf5d49ab07d42fb30e2ca&p=2', code=302)
353
+
354
+
355
+
356
+ if __name__ == '__main__':
357
+ initialization()
358
+
359
+ app.run(
360
+ host='0.0.0.0',
361
+ port=config_manager.get("SERVER.PORT"),
362
+ debug=False
363
  )