Discord 进程间通信 - 阅读消息

Posted

技术标签:

【中文标题】Discord 进程间通信 - 阅读消息【英文标题】:Discord Interprocess Communication - Read Messages 【发布时间】:2021-07-24 02:48:24 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

IPC 协议使用与 RPC 相同的协议,记录在 Discord Developer Portal 上。您还可以在discord-rpc official repo 上找到有关 IPC 协议的更多信息。

简单地说,你通过管道发送的数据包就是这样序列化的:

uint32 opcode
uint32 length
byte[length] jsonData

数据是一个 JSON 编码的对象,带有一个唯一的 nonce 参数,该参数会在答案中返回,cmd 参数用于您要使用的命令以及可选的 argsevt

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

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


    "v": 1,
    "client_id": 332269999912132097

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

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


    "nonce": "be9a6de3-31d0-4767-a8e9-4818c5690015",
    "cmd": "AUTHORIZE",
    "args": 
        "client_id": 332269999912132097,
        "scopes": "rpc messages.read"
    

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

客户应该得到一个提示。如果他接受,那么您的应用程序将收到一个 oauth2 代码,您可以使用该代码进行身份验证。 OAuth2 流程在Discord Developer Portal 上有说明。

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


    "nonce": "5dc0c062-98c6-47a0-8922-bbb52e9d6afa",
    "cmd": "AUTHENTICATE",
    "args": 
        "access_token": "CZhtkLDpNYXgPH9Ml6shqh2OwykChw"
    

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

此时,您已通过身份验证,您可以通过使用 GET_CHANNEL 命令 获取最后一条消息并订阅 MESSAGE_CREATE 事件 来读取消息新消息发送时。这些都记录在Developer Portal。

【讨论】:

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

以上是关于Discord 进程间通信 - 阅读消息的主要内容,如果未能解决你的问题,请参考以下文章

Linux 进程间通信 消息队列 实现两个进程间通信

八进程间通信-消息队列

多进程编程之进程间通信-管道和消息队列

Linux进程间通信——消息队列

进程间通信方式

Linux间进程通信--消息队列