Discord 进程间通信 - 读取消息

Jar*_*rks 2 rpc ipc discord discord.js discord-jda

我想遵守 TOS,但我遇到了困难。我在付费服务器中,无法放置机器人帐户。我只是想在我的应用程序中使用消息内容(当前在 python 中)。我能做些什么?我可以编写一个钩子来使用来自 GUI 或 Web 客户端的消息吗?看来我想做的事情不被支持。有什么想法吗?

其他人表示,您显然可以使用 ipc 和 messages.read 范围或 RPC 来接收消息,但我不知道有哪些资源可用于挂钩并获取来自服务器的消息内容。

小智 5

有多种方法可以从客户端读取消息。您可以将Discord API与您的帐户令牌一起使用,但Discord ToS 不允许这样做,因此是可禁止的(自机器人)。另一种方法是使用Discord IPC

Discord IPC 允许您使用命名管道与 Discord 客户端进行通信。默认名称是discord-ipc-0. 您需要一个 Discord 应用程序才能使用它。

IPC 协议使用与 RPC 相同的协议,该协议记录在Discord Developer Portal上。您还可以在discord-rpc官​​方存储库上找到有关IPC协议的更多信息。

简而言之,通过管道发送的数据包是这样序列化的:

uint32 opcode
uint32 length
byte[length] jsonData
Run Code Online (Sandbox Code Playgroud)

数据是 JSON 编码的对象,具有nonce在答案中发回的唯一参数、cmd您要使用的命令的参数以及可选的argsevt

您可能对AUTHORIZEAUTHENTICATEGET_CHANNELSUBSCRIBE命令感兴趣。所以我将在这里解释这四个命令。

但首先,您需要连接到IPC并进行握手。这是通过发送一条带有操作码 0、您的 client_id 和协议版本的消息来完成的。JSON 对象应如下所示:

uint32 opcode
uint32 length
byte[length] jsonData
Run Code Online (Sandbox Code Playgroud)

连接后,您应该会收到包含用户信息的DISPATCH 响应。从此时开始发送的每条消息都应使用操作码 1

现在,您需要发送AUTHORIZE 命令。此命令允许您向具有指定范围的客户端请求OAuth2 代码,这将允许您使用AUTHENTICATE 命令。在这里,您需要rpcmessages.read范围。它应该看起来像这样:

{
    "v": 1,
    "client_id": 332269999912132097
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的应用程序需要一个重定向 uri 才能正常工作。

客户端应该会收到提示。如果他接受,那么您的应用程序将收到一个oauth2 代码,您可以使用该代码进行身份验证。Discord 开发者门户上解释了 OAuth2 流程。

/oauth2/token使用代码、客户端 ID、客户端密钥和重定向 uri发出请求后,您应该会获得一个访问令牌,您可以使用AUTHENTICATE命令进行身份验证。它应该是这样的:

{
    "nonce": "be9a6de3-31d0-4767-a8e9-4818c5690015",
    "cmd": "AUTHORIZE",
    "args": {
        "client_id": 332269999912132097,
        "scopes": "rpc messages.read"
    }
}
Run Code Online (Sandbox Code Playgroud)

evt如果身份验证成功,您应该收到设置为null、应用程序信息和用户信息的响应。

从此时起,您已通过身份验证,并且可以通过使用GET_CHANNEL 命令获取最后的消息来读取消息,并在发送新消息时订阅MESSAGE_CREATE 事件以获取新消息。这些都记录在开发者门户上。

  • 这是我能找到的有关 Discord IPC 协议的唯一信息源。非常感谢。感谢您的回答,我能够为 Qt 制作这个 Discord IPC 库:https://github.com/CZDanol/QtDiscordIPC (2认同)