同时检查多个WebSocket连接

时间:2019-06-29 16:39:35

标签: javascript websocket

我正在使用以下主题中提供的解决方案来检查我不拥有的WebSockets流量(消息)(仅出于学习目的):

赞:

(function(){
var ws = window.WebSocket;

window.WebSocket = function (a, b, c) {
   var that = c ? new ws(a, b, c) : b ? new ws(a, b) : new ws(a);
   that.addEventListener('open', console.info.bind(console, 'socket open'));
   that.addEventListener('close', console.info.bind(console, 'socket close'));
        that.addEventListener('message', console.info.bind(console, 'socket msg'));
        return that;
    };

    window.WebSocket.prototype=ws.prototype; 
}());

提供的解决方案的问题在于,它们仅侦听3个WebSocket连接中的1个(“ wss:// ...”)。我可以在控制台中看到消息我接收或发送的信息,但仅用于一次连接。.我缺少某些东西吗?其他两项服​​务是否可能有所不同,并禁止使用原型扩展技术?

p.s。为了避免可能的禁令或法律问题,我不会提供正在测试的Web资源的URL。

1 个答案:

答案 0 :(得分:0)

好的,因为已经过去了几周了,没有答案,所以我将发布最终使用的解决方案。

我已经构建了自己的Chrome扩展程序,该扩展程序可以侦听WebSocket的连接,并将所有请求和响应转发到我自己的WebSocket server(我恰好在C#中运行) )。

此方法有一些限制。您看不到request header或谁在发送数据包。您只能看到payload,仅此而已。另外,您将无法以任何方式修改内容或发送自己的请求(请记住-您无权访问header metadata)。自然,另一个限制是您必须运行Chrome(使用devtools APIs)。

一些说明。

这是连接调试器以侦听网络数据包的方式:

    chrome.debugger.attach({ tabId: tabId }, "1.2", function () {
        chrome.debugger.sendCommand({ tabId: tabId }, "Network.enable");
        chrome.debugger.onEvent.addListener(onTabDebuggerEvent);
    });

这是捕获它们的方式:

function onTabDebuggerEvent(debuggeeId, message, params) {
    var debugeeTabId = debuggeeId.tabId;

    chrome.tabs.get(debugeeTabId, function (targetTab) {
        var tabUrl = targetTab.url;

        if (message == "Network.webSocketFrameSent") {

        }
        else if (message == "Network.webSocketFrameReceived") {
            var payloadData = params.response.payloadData;

            var request = {
                source: tabUrl,
                payload: params.response.payloadData
            };

            websocket.send(JSON.stringify(request));
        }
    });
}

以下是创建websocket client的方法:

    var websocket = new WebSocket("ws://127.0.0.1:13529");

    setTimeout(() => {
        if (websocket.readyState !== 1) {
            console.log("Unable to connect to a WebsocketServer.");
            websocket = null;
        }
        else {
            console.log("WebsocketConnection started", websocket);

            websocket.onclose = function (evt) {
                console.log("WebSocket connection got closed!");

                if (evt.code == 3001) {
                    console.log('ws closed');
                } else {
                    console.log('ws connection error');
                }

                websocket = null;
            };

            websocket.onerror = function (evt) {
                console.log('ws normal error: ' + evt.type);
                websocket = null;
            };

        }
    }, 3000);

创建server超出了此问题的范围。您可以使用Node.jsC#Java中的一个,对您而言更合适。

这当然不是最方便的方法,但是与java-script注入方法不同-它在所有情况下都有效。

编辑:完全忘了提及。似乎有另一种方法可以解决此问题,但是我没有深入探讨该主题,因此也许这在某种程度上是错误的信息。通过数据包嗅探实用程序,应该可以在网络接口级别捕获数据包。例如Wiresharkpcap。也许将来我会进一步调查:)