Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, request, Response
|
2 |
+
import requests
|
3 |
+
|
4 |
+
app = Flask(__name__)
|
5 |
+
|
6 |
+
@app.route('/', defaults={'path': ''})
|
7 |
+
@app.route('/<path:path>')
|
8 |
+
def proxy(path):
|
9 |
+
# 解析请求 URL
|
10 |
+
url = request.url
|
11 |
+
url_obj = requests.compat.urlparse(url)
|
12 |
+
|
13 |
+
# 默认目标主机为 chatgpt.com,若路径以 /assets 开头则切换为 cdn.oaistatic.com
|
14 |
+
target_host = 'chatgpt.com'
|
15 |
+
if url_obj.path.startswith('/assets'):
|
16 |
+
target_host = 'cdn.oaistatic.com'
|
17 |
+
|
18 |
+
new_url = url_obj._replace(netloc=target_host).geturl()
|
19 |
+
|
20 |
+
# 创建新的 Headers 对象,复制原始请求头
|
21 |
+
new_headers = dict(request.headers)
|
22 |
+
|
23 |
+
# 设置 User-Agent 为模拟无头浏览器的标识,这里结合了 Edge 和 HeadlessChrome 的特征
|
24 |
+
new_headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'
|
25 |
+
|
26 |
+
# 添加额外的 HTTP 头信息以模拟无头浏览器的请求行为
|
27 |
+
new_headers['sec-ch-ua'] = '"Chromium";v="92", " Not A;Brand";v="99", "HeadlessChrome";v="92"'
|
28 |
+
new_headers['sec-ch-ua-mobile'] = '?0'
|
29 |
+
new_headers['sec-ch-ua-platform'] = '"Windows"'
|
30 |
+
new_headers['sec-fetch-site'] = 'none'
|
31 |
+
new_headers['sec-fetch-mode'] = 'navigate'
|
32 |
+
new_headers['sec-fetch-user'] = '?1'
|
33 |
+
new_headers['sec-fetch-dest'] = 'document'
|
34 |
+
|
35 |
+
# 构造新的请求,保留原有的 method、body(非 GET/HEAD 请求)
|
36 |
+
if request.method in ['GET', 'HEAD']:
|
37 |
+
resp = requests.request(request.method, new_url, headers=new_headers, allow_redirects=True)
|
38 |
+
else:
|
39 |
+
resp = requests.request(request.method, new_url, headers=new_headers, data=request.get_data(), allow_redirects=True)
|
40 |
+
|
41 |
+
# 创建响应对象
|
42 |
+
response = Response(resp.content, resp.status_code)
|
43 |
+
for key, value in resp.headers.items():
|
44 |
+
if key.lower() not in ['content-encoding', 'content-length', 'transfer-encoding', 'connection']:
|
45 |
+
response.headers[key] = value
|
46 |
+
|
47 |
+
return response
|
48 |
+
|
49 |
+
if __name__ == '__main__':
|
50 |
+
app.run(debug=True)
|