javascript - 是否可以捕获并记录我自己的 Websocket (wss) 流量

标签 javascript websocket phantomjs

我如何使用 PhantomJs 捕获并记录来自 websocket 并发往我的浏览器的我自己的数据流量?

最佳答案

您可以尝试使用以下 PhantomJS 2.1.1 工作示例的方法。 它打开示例页面 http://www.websocket.org/echo.html并打印数据流量(输入和输出)以及一些额外的调试信息。交通本身并不是很有趣,但适合演示目的。 希望这会有所帮助。

var webPage = require('webpage');
var page = webPage.create();

page.onConsoleMessage = function(msg) {
    console.log('\n' + msg);
};

page.onError = function() {};

page.onInitialized = function() {
    page.evaluate(function proxyWebSocket() {

        var WS = window.WebSocket;

        var WebSocket = function(url, protocols) {
            var self = this;
            console.log('Creating websocket: ' + url);

            var ws = new WS(url, protocols);

            self.addEventListener = function(type, listener, useCapture, wantsUntrusted) {
                console.log('addEventListener: ' + type + '; ' + listener + '; ' + useCapture + '; ' + wantsUntrusted);

                var newListener = function(event) {
                    console.log('dispatching event: ', JSON.stringify(event));
                    return listener(event);
                };
                return ws.addEventListener.call(ws, type, newListener, useCapture, wantsUntrusted);
            };

            self.dispatchEvent = ws.dispatchEvent.bind(ws);
            self.removeEventListener = ws.removeEventListener.bind(ws);

            self.send = function(data) {
                console.log('websocket send: ' + data);
                return ws.send(data);
            };

            self.close = function(code, reason) {
                self.trace && console.log('websocket close: ' + code + ' ' + reason);
                return ws.close(code, reason);
            };

            // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#Attributes
            var properties = [
                { name: "binaryType" },
                { name: "bufferedAmount", readOnly: true },
                { name: "extensions" },
                { name: "onclose", traceData: true },
                { name: "onmessage", traceData: true },
                { name: "onopen", traceData: true },
                { name: "onerror", traceData: true },
                { name: "protocol" },
                { name: "readyState", readOnly: true },
                { name: "url", readOnly: true }
            ];
            properties.forEach(defineProperty, self);

            function defineProperty(prop) {
                var descriptor = {
                    get: function() {
                        var result = ws[prop.name];
                        console.log('websocket get ' + prop.name + ': ' + result);
                        return result;
                    }
                };

                if (!prop.readOnly) {
                    descriptor.set = function(value) {
                        console.log('websocket set ' + prop.name + ': ' + value);
                        if (prop.traceData) {
                            var traceFn = function(event) {
                                console.log('websocket ' + prop.name + (event.data ? ': ' + JSON.stringify(event.data) : ''));
                                return value(event);
                            };
                            ws[prop.name] = traceFn;
                        } else {
                            ws[prop.name] = value;
                        }
                        return value;
                    };
                }

                Object.defineProperty(self, prop.name, descriptor);
            }
        };

        WebSocket.CONNECTING = WS.CONNECTING;
        WebSocket.OPEN = WS.OPEN;
        WebSocket.CLOSING = WS.CLOSING;
        WebSocket.CLOSED = WS.CLOSED;

        window.WebSocket = WebSocket;
    });
};

page.open("http://www.websocket.org/echo.html", function testWebSocket(status) {
    if (status === "success") {
        console.log('open status: ' + status);

        window.setTimeout(function() {
            phantom.exit();
        }, 5000);
    }
});

关于javascript - 是否可以捕获并记录我自己的 Websocket (wss) 流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453429/

相关文章:

javascript - React Native 导航子级父级

javascript - 防止 SPACE 和 ARROW 滚动 [游戏 Iframe]

html - NodeJS + HTML5 + Telnet = 可能吗?

javascript - 为什么这些 resharper Jasmine 测试在浏览器中运行而不是在 phantomjs 中运行

javascript - Phantom.js - 在警告框内获取文本

javascript - 使用 crypto 模块进行 Node.js MD5 解密

javascript - flutter inappwebview 未在控制台上打印

javascript - 未捕获的无效状态错误 : Failed to execute 'send' on 'WebSocket' :

websocket - websocket 连接可以持续多久?

session - Phantomjs 和 session