获取网站的活动 Websockets 可能吗?

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)