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
参数用于您要使用的命令以及可选的 args
和 evt
。
您可能会对 AUTHORIZE、AUTHENTICATE、GET_CHANNEL 和 SUBSCRIBE 命令感兴趣。所以我将在这里解释这四个命令。
但首先,您需要连接到 IPC 并进行握手。这是通过发送带有操作码 0、您的 client_id 和协议版本的消息来完成的。 JSON 对象应如下所示:
"v": 1,
"client_id": 332269999912132097
连接后,您应该会收到包含用户信息的DISPATCH 响应。您从此时发送的每条消息都应使用 操作码 1
现在,您需要发送 AUTHORIZE 命令 该命令允许您向具有指定 范围 的客户端询问 OAuth2 代码,这将允许您使用 AUTHENTICATE 命令。在这里,您需要 rpc 和 messages.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 进程间通信 - 阅读消息的主要内容,如果未能解决你的问题,请参考以下文章