【问题标题】:Get active Websockets of a Website possible?获取网站的活动 Websocket 可能吗?
【发布时间】:2020-01-26 06:08:48
【问题描述】:

我想知道是否有可能获得网站的活动 WebSocket。 例如:var x = document.findWebSocket()。 websocket 将列在 Chrome 中的网络选项卡下(在开发工具部分中)。从那里,websockets 列在“WS”下。我也希望能够做到x.emit(..);

到目前为止,我只能想出var x = new WebSocket("wss://exampleUrl.com/socket.io/?EIO=3&transport=websocket", "protocol1");。但这只会添加一个新的 Websocket,它的 sid 与我要从中发出消息的那个不同。

添加“&sid = {SID of Active Websocket}”将不起作用。

【问题讨论】:

    标签: javascript sockets websocket socket.io


    【解决方案1】:

    这有点 hacky,但是如果您可以注入在站点代码之前运行的代码(例如,使用 Tampermonkey 和 @run-at document-start),您可以使用 Monkeypatch window.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);
    

    导致[WebSocket] 被记录(您可以继续对实例执行任何您想做的事情,例如调用emit)。

    【讨论】:

    • 这行得通,尽管我认为我可以提供更多上下文。这是关于网站 skribbl.io。它使用 websockets 共享它的画布,在 python 中人们不必得到这个“hacky”。那么也许它以更简单的方式在 js 中工作?
    • 我很怀疑是否还有其他简单的选择,不幸的是 - 如果您尝试进行客户端调整,在网站的官方脚本运行之前进行猴子补丁全局设置有时是最好的方法,即使它看起来很老套。您还可以启用 Chrome 本地覆盖,然后将您自己的代码写入网站的源代码 stackapps.com/questions/8531,但对于相同的结果,这很多更复杂 - 除了保存对创建对象的引用之外,还有看起来不是获取当前实例列表的方法
    • 我可以在 chrome 中创建自己的 websocket 吗?我确实收到了会话 ID 作为第一条消息,但是当我发送“2probe”时它返回 3 而不是 3probe
    • 如果你创建一个socket实例,然后给它添加一个open监听器,然后.send一些东西,你应该可以和服务器通信了。例如:stackoverflow.com/a/59098029除此之外,不看代码很难说逻辑在哪里失败
    • 是的,问题是我正在连接一个新的会话 ID。当我单击“播放”时,它会创建带有新 session_id 的 websocket,这意味着我同时加入了不同的大厅。
    【解决方案2】:

    您可以在它们发送内容后立即将所有套接字收集到一个数组中:

    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);
    };
    

    然后:

    if (sockets.length > 0)
      sockets[0].send('hello');
    

    【讨论】:

    • 如果 client 代码调用someSocket.send(..),这将起作用,但这种情况很可能不会发生。服务器可能会发送客户端处理的消息,但客户端不会发送消息作为回复——这种情况非常常见(可能是套接字最常见的用法——用于按需服务器到客户端的通信)。
    • 我明白了。我不认为不定期发送内容的客户端套接字如此普遍。但是,是的,现在想想,可能是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多