yup*_*321 7 javascript sockets websocket socket.io
我想知道是否有可能获得网站的活动 WebSocket。一个例子是:var x = document.findWebSocket()。websockets 将列在 Chrome 的网络选项卡下(在开发工具部分)。从那里 websockets 列在“WS”下。我也希望能够做到x.emit(..);。
到目前为止,我只能想出var x = new WebSocket("wss://exampleUrl.com/socket.io/?EIO=3&transport=websocket", "protocol1");. 但这只会添加一个新的 Websocket,其 sid 与我想从中发出消息的 sid 不同。
添加“&sid = {SID of Active Websocket}”是行不通的。
Cer*_*nce 11
这有点 hacky,但是如果您可以注入在站点代码运行之前运行的代码(例如,使用 Tampermonkey 和@run-at document-start),您可以使用monkeypatchwindow.WebSocket以便无论何时调用它,您都可以将创建的 websocket 添加到您可以稍后检查的数组中。例如,在 Stack Overflow 上运行以下命令:
// ==UserScript==
// @name 0 New Userscript
// @include /^https://stackoverflow.com
// @run-at document-start
// @grant none
// ==/UserScript==
const sockets = [];
const nativeWebSocket = window.WebSocket;
window.WebSocket = function(...args){
const socket = new nativeWebSocket(...args);
sockets.push(socket);
return socket;
};
setTimeout(() => {
// or create a button which, when clicked, does something with the sockets
console.log(sockets);
}, 1000);
Run Code Online (Sandbox Code Playgroud)
结果[WebSocket]被记录(并且您可以继续对实例执行任何您想做的事情,例如 call emit)。
tro*_*tze 10
您可以在发送内容后立即将所有套接字收集到一个数组中:
const originalSend = WebSocket.prototype.send;
window.sockets = [];
WebSocket.prototype.send = function(...args) {
if (window.sockets.indexOf(this) === -1)
window.sockets.push(this);
return originalSend.call(this, ...args);
};
Run Code Online (Sandbox Code Playgroud)
然后后来:
if (sockets.length > 0)
sockets[0].send('hello');
Run Code Online (Sandbox Code Playgroud)