BG5 commited on
Commit
5af27ed
·
verified ·
1 Parent(s): e503e80

Update fun.py

Browse files
Files changed (1) hide show
  1. fun.py +24 -49
fun.py CHANGED
@@ -34,7 +34,6 @@ async def proxy(request: Request, path: str):
34
  headers=dict(resp.headers)
35
  )
36
 
37
- @app.websocket("/{path:path}")
38
  async def websocket_proxy(websocket: WebSocket, path: str):
39
  await websocket.accept()
40
  target_url = f"{TARGET_WS_BASE}/{path}"
@@ -42,64 +41,40 @@ async def websocket_proxy(websocket: WebSocket, path: str):
42
 
43
  try:
44
  async with websockets.connect(target_url) as target_ws:
45
- disconnect_event = asyncio.Event()
 
 
 
 
 
46
 
 
47
  async def forward_client_to_server():
48
  try:
49
- while not disconnect_event.is_set():
50
- # 正确处理 FastAPI WebSocket 接收
51
- message = await websocket.receive()
52
- logger.info(f"CLIENT->CHROME RAW DATA: {message}")
53
-
54
- if message["type"] == "websocket.disconnect":
55
- logger.info("Client disconnected")
56
- disconnect_event.set()
57
- break
58
-
59
- if message["type"] == "websocket.receive.text":
60
- await target_ws.send(message["text"])
61
- elif message["type"] == "websocket.receive.bytes":
62
- await target_ws.send(message["bytes"])
63
- except Exception as e:
64
- logger.error(f"Client->Server error: {e}")
65
- disconnect_event.set()
66
 
67
  async def forward_server_to_client():
68
  try:
69
- while not disconnect_event.is_set():
70
- # 正确处理 websockets 库接收
71
- message = await target_ws.recv()
72
- if isinstance(message, str):
73
- await websocket.send_text(message)
74
- elif isinstance(message, bytes):
75
- await websocket.send_bytes(message)
76
- except Exception as e:
77
- logger.error(f"Server->Client error: {e}")
78
- disconnect_event.set()
79
-
80
- # 并行运行两个转发任务
81
- client_task = asyncio.create_task(forward_client_to_server())
82
- server_task = asyncio.create_task(forward_server_to_client())
83
 
84
- # 等待任意任务完成
85
- done, pending = await asyncio.wait(
86
- [client_task, server_task],
87
- return_when=asyncio.FIRST_COMPLETED
88
  )
89
-
90
- # 清理未完成的任务
91
- disconnect_event.set()
92
- for task in pending:
93
- task.cancel()
94
- await asyncio.gather(*pending, return_exceptions=True)
95
-
96
  except Exception as e:
97
- logger.error(f"Connection error: {e}")
98
  finally:
99
- try:
100
- await websocket.close()
101
- except Exception:
102
- pass
103
 
104
 
105
  if __name__ == "__main__":
 
34
  headers=dict(resp.headers)
35
  )
36
 
 
37
  async def websocket_proxy(websocket: WebSocket, path: str):
38
  await websocket.accept()
39
  target_url = f"{TARGET_WS_BASE}/{path}"
 
41
 
42
  try:
43
  async with websockets.connect(target_url) as target_ws:
44
+ # 1. 先发送初始化命令(必需)
45
+ await target_ws.send(json.dumps({
46
+ "id": 1,
47
+ "method": "Runtime.enable"
48
+ }))
49
+ logger.info("Sent Runtime.enable")
50
 
51
+ # 2. 启动转发任务
52
  async def forward_client_to_server():
53
  try:
54
+ while True:
55
+ data = await websocket.receive_text()
56
+ logger.info(f"CLIENT->CHROME: {data[:200]}")
57
+ await target_ws.send(data)
58
+ except WebSocketDisconnect:
59
+ logger.info("Client disconnected")
 
 
 
 
 
 
 
 
 
 
 
60
 
61
  async def forward_server_to_client():
62
  try:
63
+ while True:
64
+ response = await target_ws.recv()
65
+ logger.info(f"CHROME->CLIENT: {response[:200]}")
66
+ await websocket.send_text(response)
67
+ except websockets.exceptions.ConnectionClosed:
68
+ logger.info("Browser disconnected")
 
 
 
 
 
 
 
 
69
 
70
+ await asyncio.gather(
71
+ forward_client_to_server(),
72
+ forward_server_to_client()
 
73
  )
 
 
 
 
 
 
 
74
  except Exception as e:
75
+ logger.error(f"Error: {e}")
76
  finally:
77
+ await websocket.close()
 
 
 
78
 
79
 
80
  if __name__ == "__main__":