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您要使用的命令的参数以及可选的args和evt。
您可能对AUTHORIZE、AUTHENTICATE、GET_CHANNEL和SUBSCRIBE命令感兴趣。所以我将在这里解释这四个命令。
但首先,您需要连接到IPC并进行握手。这是通过发送一条带有操作码 0、您的 client_id 和协议版本的消息来完成的。JSON 对象应如下所示:
uint32 opcode
uint32 length
byte[length] jsonData
Run Code Online (Sandbox Code Playgroud)
连接后,您应该会收到包含用户信息的DISPATCH 响应。从此时开始发送的每条消息都应使用操作码 1
现在,您需要发送AUTHORIZE 命令。此命令允许您向具有指定范围的客户端请求OAuth2 代码,这将允许您使用AUTHENTICATE 命令。在这里,您需要rpc和messages.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 事件以获取新消息。这些都记录在开发者门户上。