You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拦截WebSocket数据?Firefox 57能否用filterResponseData拦截WebSocket消息体?

如何在Firefox中拦截WebSocket数据?

好问题!首先得明确:Firefox的filterResponseData API确实只能用于拦截HTTP/HTTPS请求的响应体,WebSocket属于完全不同的协议(基于TCP的双向长连接,而非HTTP的请求-响应模式),所以没法直接用这个方法来拦截它的消息体。不过我们有两种可行的方案来实现WebSocket消息的拦截:

方案1:用WebExtensions API监控WebSocket连接的建立

虽然这个方法没法直接捕获消息内容,但可以监控WebSocket的握手请求,获取连接的关键信息(比如URL、请求头)。你可以用webRequest API配合types: ["websocket"]来拦截WebSocket的初始化请求:

// 在扩展的background脚本中
browser.webRequest.onBeforeRequest.addListener(
  (details) => {
    console.log(`WebSocket连接即将建立: ${details.url}`);
    // 这里可以获取请求的URL、请求头等信息
  },
  { urls: ["<all_urls>"], types: ["websocket"] },
  ["blocking"] // 若需要修改请求,可添加此参数
);

方案2:通过Content Script Hook WebSocket实例(拦截消息体)

这是目前最常用的拦截WebSocket消息内容的方法——通过注入Content Script到页面上下文,重写原生的WebSocket构造函数,从而拦截发送和接收的消息。

步骤1:编写Content Script(比如命名为websocket-interceptor.js)

// 保存原始的WebSocket构造函数,避免被覆盖后丢失
const OriginalWebSocket = window.WebSocket;

// 重写WebSocket构造函数,拦截所有新创建的WebSocket实例
window.WebSocket = function(url, protocols) {
  // 创建原始的WebSocket实例
  const wsInstance = new OriginalWebSocket(url, protocols);

  // 拦截send方法,捕获发送的消息
  const originalSend = wsInstance.send;
  wsInstance.send = function(data) {
    console.log(`[WebSocket发送] 目标URL: ${url},消息内容:`, data);
    // 你可以在这里修改消息内容、记录日志,或者阻止发送
    originalSend.call(this, data);
  };

  // 拦截onmessage事件,捕获接收的消息
  const originalOnMessage = wsInstance.onmessage;
  wsInstance.onmessage = function(event) {
    console.log(`[WebSocket接收] 目标URL: ${url},消息内容:`, event.data);
    // 若需要修改接收的消息,可以创建新的MessageEvent对象
    // 比如:const modifiedEvent = new MessageEvent('message', { data: '修改后的内容' });
    // 然后调用originalOnMessage.call(this, modifiedEvent);
    if (originalOnMessage) {
      originalOnMessage.call(this, event);
    }
  };

  // 同时处理通过addEventListener绑定的message事件
  const originalAddEventListener = wsInstance.addEventListener;
  wsInstance.addEventListener = function(type, listener) {
    if (type === 'message') {
      const wrappedListener = function(event) {
        console.log(`[WebSocket监听捕获] 目标URL: ${url},消息内容:`, event.data);
        listener.call(this, event);
      };
      originalAddEventListener.call(this, type, wrappedListener);
    } else {
      originalAddEventListener.call(this, type, listener);
    }
  };

  return wsInstance;
};

步骤2:在扩展manifest中配置Content Script

确保脚本在页面加载的最早期注入,避免页面提前创建WebSocket实例而未被拦截:

{
  "manifest_version": 2,
  "name": "WebSocket拦截器",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": ["<all_urls>"], // 替换为你需要拦截的网站范围
      "js": ["websocket-interceptor.js"],
      "run_at": "document_start" // 关键:在页面DOM加载前注入
    }
  ]
}

对于你提到的Firefox 57版本,以上方案完全适用——Firefox 57已经全面支持WebExtensions API,这种拦截方式在该版本中可以正常工作。

内容的提问来源于stack exchange,提问作者ChrisD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:30