1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| import asyncio import websockets import json from datetime import datetime
CDP_URL = "ws://127.0.0.1:9222/devtools/browser/..." CMD_ID = [0]
async def cdp(ws, session_id, method, params=None): CMD_ID[0] += 1; cmd_id = CMD_ID[0] await ws.send(json.dumps({"sessionId": session_id, "id": cmd_id, "method": method, "params": params or {}})) async for msg in ws: resp = json.loads(msg) if resp.get("id") == cmd_id: return resp.get("result", {})
async def connect_page(ws): targets = await cdp(ws, None, "Target.getTargets") target_id = targets["targetInfos"][0]["targetId"] session = await cdp(ws, None, "Target.attachToTarget", { "targetId": target_id, "flatten": True }) return session["sessionId"]
async def enable_websocket_monitoring(ws, session_id): """启用 WebSocket 监控""" return await cdp(ws, session_id, "Network.enable")
async def capture_websocket_frames(ws, session_id, duration=30): """捕获 WebSocket 帧""" await enable_websocket_monitoring(ws, session_id) frames = [] start = asyncio.get_event_loop().time() while (asyncio.get_event_loop().time() - start) < duration: try: msg = await asyncio.wait_for(ws.__anext__(), timeout=1) data = json.loads(msg) method = data.get("method", "") if method == "Network.webSocketCreated": p = data["params"] print(f"[WS 创建] {p.get('url', '')}") frames.append({ "event": "created", "url": p.get("url"), "ws_id": p.get("requestId"), "time": datetime.now().isoformat() }) elif method == "Network.webSocketFrameSent": p = data["params"] response = p.get("response", {}) frames.append({ "event": "sent", "ws_id": p.get("requestId"), "payload": response.get("payloadData", ""), "opcode": response.get("opcode", 1), "mask": response.get("mask", False), "time": datetime.now().isoformat() }) elif method == "Network.webSocketFrameReceived": p = data["params"] response = p.get("response", {}) frames.append({ "event": "received", "ws_id": p.get("requestId"), "payload": response.get("payloadData", ""), "opcode": response.get("opcode", 1), "mask": response.get("mask", False), "time": datetime.now().isoformat() }) elif method == "Network.webSocketClosed": p = data["params"] print(f"[WS 关闭] 代码: {p.get('code')}, 原因: {p.get('reason', '')}") frames.append({ "event": "closed", "ws_id": p.get("requestId"), "code": p.get("code"), "reason": p.get("reason"), "time": datetime.now().isoformat() }) except asyncio.TimeoutError: continue return frames
|