Upload 2 files
Browse files- app.py +8 -113
- requirements.txt +1 -2
app.py
CHANGED
@@ -5,18 +5,6 @@ import webbrowser
|
|
5 |
import socketserver
|
6 |
import os
|
7 |
import random
|
8 |
-
import asyncio
|
9 |
-
import websockets
|
10 |
-
from websockets.server import serve
|
11 |
-
from urllib.parse import urlparse, parse_qs
|
12 |
-
from concurrent.futures import ThreadPoolExecutor
|
13 |
-
|
14 |
-
DOMAIN = "gitdeem-live.hf.space"
|
15 |
-
PORT = 8000
|
16 |
-
|
17 |
-
# 全局变量
|
18 |
-
websocket_server = None
|
19 |
-
ws_port = None
|
20 |
|
21 |
def get_refresh_tokens():
|
22 |
tokens = os.environ.get('REFRESH_TOKENS', '')
|
@@ -58,44 +46,12 @@ def get_livekit_url(access_token):
|
|
58 |
}).json()
|
59 |
|
60 |
livekit_url = "https://meet.livekit.io"
|
61 |
-
|
62 |
-
url = f"{livekit_url}/custom?liveKitUrl=
|
63 |
return url
|
64 |
|
65 |
-
|
66 |
-
query = urlparse(path).query
|
67 |
-
params = parse_qs(query)
|
68 |
-
target_url = params.get('target', [''])[0]
|
69 |
-
|
70 |
-
if not target_url:
|
71 |
-
await websocket.close(1008, 'Missing target parameter')
|
72 |
-
return
|
73 |
-
|
74 |
-
try:
|
75 |
-
async with websockets.connect(target_url) as target_ws:
|
76 |
-
tasks = [
|
77 |
-
asyncio.create_task(forward(websocket, target_ws)),
|
78 |
-
asyncio.create_task(forward(target_ws, websocket))
|
79 |
-
]
|
80 |
-
await asyncio.gather(*tasks, return_exceptions=True)
|
81 |
-
except websockets.exceptions.WebSocketException as e:
|
82 |
-
print(f"WebSocket error: {e}")
|
83 |
-
|
84 |
-
async def forward(source, destination):
|
85 |
-
try:
|
86 |
-
async for message in source:
|
87 |
-
await destination.send(message)
|
88 |
-
except websockets.exceptions.WebSocketException:
|
89 |
-
pass
|
90 |
-
|
91 |
-
class CombinedHandler(http.server.SimpleHTTPRequestHandler):
|
92 |
def do_GET(self):
|
93 |
-
if self.path.startswith('/proxy'):
|
94 |
-
self.handle_websocket()
|
95 |
-
else:
|
96 |
-
self.handle_http()
|
97 |
-
|
98 |
-
def handle_http(self):
|
99 |
refresh_tokens = get_refresh_tokens()
|
100 |
if not refresh_tokens:
|
101 |
self.send_error(500, "未设置 REFRESH_TOKENS 环境变量")
|
@@ -111,72 +67,11 @@ class CombinedHandler(http.server.SimpleHTTPRequestHandler):
|
|
111 |
else:
|
112 |
self.send_error(500, "无法获取访问令牌")
|
113 |
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
self.send_header('Connection', 'Upgrade')
|
120 |
-
self.end_headers()
|
121 |
-
|
122 |
-
if websocket_server is None:
|
123 |
-
loop = asyncio.new_event_loop()
|
124 |
-
asyncio.set_event_loop(loop)
|
125 |
-
|
126 |
-
# 使用未使用的端口
|
127 |
-
ws_port = self.find_free_port()
|
128 |
-
websocket_server = serve(proxy_handler, "localhost", ws_port)
|
129 |
-
loop.run_until_complete(websocket_server)
|
130 |
-
|
131 |
-
# 创建新的事件循环
|
132 |
-
loop = asyncio.new_event_loop()
|
133 |
-
asyncio.set_event_loop(loop)
|
134 |
-
|
135 |
-
try:
|
136 |
-
# 创建到WebSocket服务器的连接
|
137 |
-
ws_client = loop.run_until_complete(websockets.connect(f"ws://localhost:{ws_port}"))
|
138 |
-
|
139 |
-
# 在这里处理WebSocket连接
|
140 |
-
# 例如:loop.run_until_complete(self.handle_websocket_communication(ws_client))
|
141 |
-
|
142 |
-
finally:
|
143 |
-
loop.close()
|
144 |
-
|
145 |
-
# 添加这个新方法来处理WebSocket通信
|
146 |
-
async def handle_websocket_communication(self, ws_client):
|
147 |
-
# 在这里实现WebSocket通信逻辑
|
148 |
-
pass
|
149 |
-
|
150 |
-
@staticmethod
|
151 |
-
def find_free_port():
|
152 |
-
with socketserver.TCPServer(("localhost", 0), None) as s:
|
153 |
-
return s.server_address[1]
|
154 |
-
|
155 |
-
# 修改 run_server 函数
|
156 |
-
def run_server(port=PORT):
|
157 |
-
global websocket_server, ws_port
|
158 |
-
|
159 |
-
with ThreadPoolExecutor(max_workers=1) as executor:
|
160 |
-
with socketserver.TCPServer(("", port), CombinedHandler) as httpd:
|
161 |
-
print(f"HTTP 服务器运行在 http://{DOMAIN}:{port}")
|
162 |
-
|
163 |
-
# 启动 WebSocket 服务器
|
164 |
-
loop = asyncio.new_event_loop()
|
165 |
-
asyncio.set_event_loop(loop)
|
166 |
-
ws_port = CombinedHandler.find_free_port()
|
167 |
-
websocket_server = serve(proxy_handler, "localhost", ws_port)
|
168 |
-
loop.run_until_complete(websocket_server)
|
169 |
-
print(f"WebSocket 服务器运行在 ws://localhost:{ws_port}")
|
170 |
-
|
171 |
-
executor.submit(httpd.serve_forever)
|
172 |
-
try:
|
173 |
-
loop.run_forever()
|
174 |
-
except KeyboardInterrupt:
|
175 |
-
print("服务器正在关闭...")
|
176 |
-
httpd.shutdown()
|
177 |
-
loop.run_until_complete(websocket_server.close())
|
178 |
-
finally:
|
179 |
-
loop.close()
|
180 |
|
181 |
if __name__ == "__main__":
|
182 |
refresh_tokens = get_refresh_tokens()
|
|
|
5 |
import socketserver
|
6 |
import os
|
7 |
import random
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
def get_refresh_tokens():
|
10 |
tokens = os.environ.get('REFRESH_TOKENS', '')
|
|
|
46 |
}).json()
|
47 |
|
48 |
livekit_url = "https://meet.livekit.io"
|
49 |
+
#url = f"{livekit_url}/custom?liveKitUrl={res['url']}&token={res['token']}#{res['e2ee_key']}"
|
50 |
+
url = f"{livekit_url}/custom?liveKitUrl=wss://webrtc.chatgpt.com&token={res['token']}#{res['e2ee_key']}"
|
51 |
return url
|
52 |
|
53 |
+
class RedirectHandler(http.server.SimpleHTTPRequestHandler):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
def do_GET(self):
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
refresh_tokens = get_refresh_tokens()
|
56 |
if not refresh_tokens:
|
57 |
self.send_error(500, "未设置 REFRESH_TOKENS 环境变量")
|
|
|
67 |
else:
|
68 |
self.send_error(500, "无法获取访问令牌")
|
69 |
|
70 |
+
def run_server(port=8000):
|
71 |
+
with socketserver.TCPServer(("", port), RedirectHandler) as httpd:
|
72 |
+
print(f"服务器运行在 http://localhost:{port}")
|
73 |
+
webbrowser.open(f"http://localhost:{port}")
|
74 |
+
httpd.serve_forever()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
|
76 |
if __name__ == "__main__":
|
77 |
refresh_tokens = get_refresh_tokens()
|
requirements.txt
CHANGED
@@ -1,2 +1 @@
|
|
1 |
-
requests
|
2 |
-
websockets
|
|
|
1 |
+
requests
|
|