gitdeem commited on
Commit
8bce39c
·
verified ·
1 Parent(s): 03c5115

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +8 -113
  2. 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
- proxy_url = f"wss://{DOMAIN}/proxy"
62
- url = f"{livekit_url}/custom?liveKitUrl={proxy_url}?target=wss://webrtc.chatgpt.com&token={res['token']}#{res['e2ee_key']}"
63
  return url
64
 
65
- async def proxy_handler(websocket, path):
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
- def handle_websocket(self):
115
- global websocket_server, ws_port
116
-
117
- self.send_response(101, "Switching Protocols")
118
- self.send_header('Upgrade', 'websocket')
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