Javascript 扩展如何侦听WebSocket?(如果WebSocket在iframe中会怎样?)

Javascript 扩展如何侦听WebSocket?(如果WebSocket在iframe中会怎样?),javascript,google-chrome-extension,websocket,firefox-addon-webextensions,intercept,Javascript,Google Chrome Extension,Websocket,Firefox Addon Webextensions,Intercept,我正在编写一个Firefox扩展,它需要监听浏览器和服务器之间的通信。对于HTTP通信,我在后台脚本中使用webRequest库。但是根据,我不能使用webRequest截获WebSocket消息。我的分机如何监听WebSocket通信 更新: 我有我的电话,但从来没有打过!我试图收听的WebSocket位于iframe中。这有关系吗?倾听WebSocket通信的唯一方法是输入站点的代码,并让它将消息转发给您。您的代码应该如下所示: manifest.json { ... "c

我正在编写一个Firefox扩展,它需要监听浏览器和服务器之间的通信。对于HTTP通信,我在后台脚本中使用webRequest库。但是根据,我不能使用webRequest截获WebSocket消息。我的分机如何监听WebSocket通信

更新:


我有我的电话,但从来没有打过!我试图收听的WebSocket位于iframe中。这有关系吗?

倾听WebSocket通信的唯一方法是输入站点的代码,并让它将消息转发给您。您的代码应该如下所示:

manifest.json

{
  ...
  "content_scripts": [
    {
      "matches": [
        "<website-url>",    
      ],
      "js": ["content/syringe.js"]
    }
  ],
  "web_accessible_resources": ["lib/socket-sniffer.js"]
}
{
  ...
  "content_scripts": [
    {
      "matches": [
        "<website-url>",    
      ],
      "all_frames": true,      
      "js": ["content/syringe.js"]
    }
  ],
  "web_accessible_resources": ["lib/socket-sniffer.js"]
}
lib/socket-sniffer.js

(function() {
  var OrigWebSocket = window.WebSocket;
  var callWebSocket = OrigWebSocket.apply.bind(OrigWebSocket);
  var wsAddListener = OrigWebSocket.prototype.addEventListener;
  wsAddListener = wsAddListener.call.bind(wsAddListener);
  window.WebSocket = function WebSocket(url, protocols) {
    var ws;
    if (!(this instanceof WebSocket)) {
      // Called without 'new' (browsers will throw an error).
      ws = callWebSocket(this, arguments);
    } else if (arguments.length === 1) {
      ws = new OrigWebSocket(url);
    } else if (arguments.length >= 2) {
      ws = new OrigWebSocket(url, protocols);
    } else { // No arguments (browsers will throw an error)
      ws = new OrigWebSocket();
    }

    wsAddListener(ws, 'message', function(event) {
      console.log("Received:", event);
    });
    return ws;
  }.bind();
  window.WebSocket.prototype = OrigWebSocket.prototype;
  window.WebSocket.prototype.constructor = window.WebSocket;

  var wsSend = OrigWebSocket.prototype.send;
  wsSend = wsSend.apply.bind(wsSend);
  OrigWebSocket.prototype.send = function(data) {
    console.log("Sent:", data);
    return wsSend(this, arguments);
  };
})();

(document.head || document.documentElement).appendChild(s);
上述代码的所有功劳显然都归于上面链接的海报。为了方便起见,我把tt复制到这里

更新:

是的,WebSocket是否在iframe中确实很重要!默认情况下,扩展仅加载在最上面的帧中。要将其加载到iframe中,您必须将
“所有_帧”:true
添加到
清单.json

manifest.json

{
  ...
  "content_scripts": [
    {
      "matches": [
        "<website-url>",    
      ],
      "js": ["content/syringe.js"]
    }
  ],
  "web_accessible_resources": ["lib/socket-sniffer.js"]
}
{
  ...
  "content_scripts": [
    {
      "matches": [
        "<website-url>",    
      ],
      "all_frames": true,      
      "js": ["content/syringe.js"]
    }
  ],
  "web_accessible_resources": ["lib/socket-sniffer.js"]
}
{
...
“内容脚本”:[
{
“匹配项”:[
"",    
],
“所有框架”:正确,
“js”:[“content/injector.js”]
}
],
“web可访问资源”:[“lib/socket sniffer.js”]
}
如果您想阅读更多内容,请参阅
所有\u帧