根据您的需求,以下是与 CDP(Chrome DevTools Protocol)协议实现相关的开源工具和框架,支持捕获、修改和重发 WebSocket 请求的解决方案:


一、基于 CDP 的开源实现

1. Puppeteer
  • 语言: JavaScript/TypeScript
  • 功能: 提供完整的 CDP 接口,可通过 Network 域监听 WebSocket 请求、修改请求头和响应体,支持动态拦截和重发。
  • 关键 API:
    await page.setRequestInterception(true);
    page.on('request', interceptedRequest => {
      if (interceptedRequest.isInterceptResolutionHandled()) return;
      // 修改请求
      interceptedRequest.continue({ headers: { ... } });
    });
    // 监听 WebSocket 事件
    client.on('Network.webSocketFrameSent', ({ requestId, timestamp, response }) => {
      console.log('WebSocket 消息发送:', response.payloadData);
    });
    
  • 优势: 官方维护,与 Chrome 内核深度集成,支持完整的 CDP 功能链。
2. Playwright
  • 语言: JavaScript/TypeScript/Python/C#
  • 功能: 在 Puppeteer 基础上扩展,提供跨浏览器支持,可通过 CDP 直接操作 WebSocket 流量。
  • 示例:
    with page.expect_websocket() as ws_info:
        page.click("#trigger-websocket")
    websocket = ws_info.value
    # 监听消息
    websocket.on("framesent", lambda payload: print(payload))
    # 发送自定义消息
    websocket.send("modified_data")
    
  • 适用场景: 多浏览器兼容性测试、自动化流量拦截。
3. chrome-remote-interface
  • 语言: Node.js
  • 功能: 轻量级 CDP 客户端,直接通过 WebSocket 与浏览器通信,支持精细化的请求拦截和修改。
  • 核心代码:
    const CDP = require('chrome-remote-interface');
    CDP(async (client) => {
      const { Network } = client;
      await Network.enable();
      Network.requestWillBeSent((params) => {
        if (params.request.url.includes('websocket')) {
          // 拦截 WebSocket 握手请求
          Network.continueInterceptedRequest({
            interceptionId: params.interceptionId,
            headers: { 'X-Modified': 'true' }
          });
        }
      });
    });
    
  • 优势: 无额外依赖,适合深度定制化场景。

二、WebSocket 流量操作专用库

1. Fleck (C#)
  • 功能: 轻量级 WebSocket 服务端库,可通过自定义中间件拦截和修改消息。
  • 示例:
    var server = new WebSocketServer("ws://0.0.0.0:8181");
    server.Start(socket => {
      socket.OnMessage = message => {
        // 修改接收到的消息
        var modifiedMsg = message.Replace("old", "new");
        socket.Send(modifiedMsg);
      };
    });
    
  • 适用场景: 服务端 WebSocket 流量修改,需配合客户端 CDP 工具实现端到端拦截。
2. WebSocketKing (Python)
  • 功能: 基于 Mitmproxy 的 WebSocket 流量代理工具,支持实时抓包和修改。
  • 特性:
    • 可视化界面展示 WebSocket 消息流。
    • 支持正则匹配和脚本化修改消息体。
  • 项目地址: GitHub - WebSocketKing(需自行搜索最新分支)。

三、实现步骤与技巧

  1. 初始化 CDP 连接

    • 启动 Chrome 时启用远程调试端口:chrome --remote-debugging-port=9222
    • 通过 ws://localhost:9222 连接 CDP 服务端。
  2. 捕获 WebSocket 请求

    • 监听 Network.webSocketCreated 事件获取 WebSocket 连接信息。
    • 通过 Network.webSocketFrameSentNetwork.webSocketFrameReceived 捕获消息内容。
  3. 修改与重发

    • 请求阶段:使用 Network.setRequestInterception 拦截 HTTP 升级请求,修改头部或终止握手。
    • 消息阶段:在客户端覆盖 WebSocket.send() 方法,或在服务端(如 Fleck)注入中间件逻辑。
  4. 重放机制

    • 存储捕获的消息,通过 WebSocket.send() 或 CDP 的 Network.emitWebSocketFrame 重新发送。

四、注意事项

  • 安全性: 修改 HTTPS 请求需处理证书信任问题,可通过 --ignore-certificate-errors 启动参数绕过。
  • 性能: 高频消息拦截可能导致主线程阻塞,建议使用异步处理或消息队列。
  • 兼容性: CDP 接口可能随 Chrome 版本变化,需定期检查 API 更新。

开源项目推荐

项目名称 语言 核心能力 适用场景
Puppeteer JavaScript 全链路 CDP 控制、请求拦截 自动化测试、流量分析
Fleck C# WebSocket 服务端消息修改 实时通信服务端开发
chrome-remote-interface Node.js 底层 CDP 协议操作 深度定制化调试工具开发

如需进一步实现细节,可参考 Puppeteer 官方文档Fleck 示例代码

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐