javascript - 在纯粹的、基于浏览器的 JavaScript 中接收不和谐消息?

标签 javascript websocket discord reverse-engineering userscripts

(注意:第一部分只是提供了上下文,与消息接收的事情不太相关,但同样,它设置了一些可能有帮助的上下文)

所以,我知道我需要使用 WebSocket 以某种方式连接到它。经过一些逆向工程后,我注意到我需要使用 wss://gateway.discord.gg 启动 WebSocket 连接。

现在,我制作了一个蹩脚的机器人登录函数(尽管我不完全确定 WebSocket 是如何工作的),它看起来像这样:

function login_bot() {
    let gateway_url = "https://discordapp.com/api/v9/gateway/bot";
    let tok = prompt('bot token: ');
    let request = new XMLHttpRequest();
    request.withCredentials = true;
    request.open("GET", gateway_url);
    request.setRequestHeader("authorization", tok);
    request.setRequestHeader("accept", "/");
    request.setRequestHeader("authority", "discordapp.com");
    request.setRequestHeader("content-type", "application/json");

    let socket = new WebSocket("wss://gateway.discord.gg");
    socket.onopen = function(e) {
        alert("[open] Connection established");
        alert("Sending to server");
        socket.send("I stole this request code xd");
    };
}

有了这个,我一无所获;没有 403 不允许响应,没有 404 未找到响应等(这在这种情况下可能没有意义?再说一遍,我对 websocket 毫 headless 绪)。


此后,Discord-API 服务器中的某人告诉我,如果连接来自网络,则无法登录(API 拒绝 websocket 连接)。那么,如果我不想登录怎么办?

我不知道如何在已经登录到不和谐域的情况下简单地记录消息。

我尝试对discord.py 包装器进行逆向工程,尽管这只是更多的 WebSocket。

所以,我到目前为止知道我:

  1. 需要使用websocket
  2. 以某种方式获取消息内容然后 console.log 'em

那么,有谁知道我如何通过已经与不和谐服务器建立的 websocket 连接(discord.com/login 为您提供的连接)获取消息内容?

如果这里不允许提出这个问题,再次表示歉意。

谢谢,1305。

最佳答案

试试这个。将 YOUR_TOKEN 替换为您的 Discord token 。

var ws = new WebSocket("wss://gateway.discord.gg/?v=6&encoding=json");
var interval = 0;
var token = "YOUR_DISCORD_TOKEN"

payload = {
   op: 2,
   d: {
      token: token,
      intents: 512,
      properties: {
         $os: "linux",
         $browser: "chrome",
         $device: "chrome",
      },
   },
};

ws.addEventListener("open", function open(x) {
   ws.send(JSON.stringify(payload));
});

ws.addEventListener("message", function incoming(data) {
   var x = data.data;
   var payload = JSON.parse(x);

   const { t, event, op, d } = payload;

   switch (op) {
      // OPCODE 10 GIVES the HEARTBEAT INTERVAL, SO YOU CAN KEEP THE CONNECTION ALIVE
      case 10:
         const { heartbeat_interval } = d;
         setInterval(() => {
            ws.send(JSON.stringify({ op: 2, d: null }));
         }, heartbeat_interval);

         break;
   }

   switch (t) {
      // IF MESSAGE IS CREATED, IT WILL LOG IN THE CONSOLE
      case "MESSAGE_CREATE":
         console.log(d.author.username + ": " + d.content);
   }
});

关于javascript - 在纯粹的、基于浏览器的 JavaScript 中接收不和谐消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70282615/

相关文章:

javascript - 无法使用 javascript 将嵌套 json 转换为平面 json

Android Socket.io Websocket 传输不适用于 SSL

如果服务器崩溃,Websocket onclose/onerror 事件不会触发

python - 有没有办法让我的不和谐机器人在播放完歌曲后断开与语音 channel 的连接?

python - 用户输入给出 “ValueError: invalid literal for int() with base 10:”

javascript - 如何在 WebView 中添加 JavaScript 函数并稍后在提交 reCAPTCHA 时从 HTML 中调用它

javascript - 如何将 JSON 响应附加到 HTML 网格

javascript - 检查是否以开发者模式安装了 Opera 扩展

javascript - 无法从我的 Angular2 应用程序中连接到我的 WebSocket

Python Discord bot - 关于消息分割和更改