Discord 特权网关意图是三项需要主动开启的权限(Presence、Server Members 和 Message Content)。只有机器人的所有者在开发者门户中开启它们,Discord 才会通过网关发送相应的数据。之所以设置这些权限,是因为成员列表和消息文本在默认情况下都属于敏感数据。漏掉其中一项时,机器人不会明确报错,而只是悄悄地无法接收所需的事件。因此,“机器人显示在线但什么都不做”的问题,往往都可以追溯到某个意图开关。

Two privileged intents stay switched on and let data through while a third stays off and blocks it. Developer Portal Server Members Message Content Presence Bot Welcome msgs ✓ Auto-responders ✓ Live presence ✗

网关意图到底是什么

机器人连接到 Discord 时,并不会自动接收它所在的每个服务器中发生的每一个事件。它需要订阅一类类事件,称为意图:消息事件、语音状态事件、服务器更新事件等等。大多数意图都可以在代码中自由声明,Discord 无需询问即可授予。而三个特权意图则有所不同。Discord 之所以称之为特权意图,是因为它们背后的数据(服务器中具体有哪些成员,以及成员正在输入什么)威力足够大,因此 Discord 要求机器人所有者通过开发者门户明确开启,而不能只在代码中声明。

如果机器人的代码请求了某个特权意图,但所有者没有为该应用开启它,Discord 会直接拒绝登录。机器人不会以降级状态上线,而是根本无法连接,网关会以“disallowed intents”错误关闭连接。

三个特权意图

  • Presence Intent。每位成员的在线、闲置、离线状态以及自定义活动。用于显示实时状态数据的机器人才需要它;大多数工单、审核和商店类机器人(包括 Noxyr)都不需要。
  • Server Members Intent。完整的成员列表,以及加入和离开事件、身份组变更和昵称更新。欢迎消息、成员人数统计和防突袭检测都依赖于它。
  • Message Content Intent。消息的实际文本,而不只是“某条消息被发送了”这一事实。没有它,机器人可以看到有人在某个频道中发了消息,却看不到内容。

Noxyr 的代码请求了其中两项:Server Members Intent 和 Message Content Intent。Presence Intent 不属于任何 Noxyr 功能,因此从不请求,也无需开启。

没有 Server Members Intent 会出现什么问题

Server Members Intent 使机器人能够接收 GUILD_MEMBER_ADD 和 GUILD_MEMBER_REMOVE 事件,即几乎所有成员相关功能都依赖的加入和离开事件。

  • 欢迎消息。欢迎消息在成员加入时触发。没有该意图,机器人收不到加入事件,因此不会发送任何消息,也不会分配自动身份组。
  • 成员人数。实时的成员人数频道或小组件,是通过相同的加入和离开事件更新的。没有该意图,人数会停留在它最后一次看到的数字上。
  • 防突袭和反突袭保护。检测大规模加入式突袭,以及监视可疑的身份组和昵称变更,都依赖成员事件。关闭该意图,整个检测链路就会失效。
  • 验证流程。任何需要检查成员加入日期、身份组或账户年龄的门禁,都需要该意图提供的成员对象。

没有 Message Content Intent 会出现什么问题

Message Content Intent 决定了能否读取消息的实际文本。没有该意图,机器人仍然可以看到某个频道收到了消息以及发送者是谁,只是无法读取具体内容。

  • 自动回复。匹配“退款”或“怎么付款”之类的触发词,需要读取消息文本。没有内容,就无法匹配,也无法回复。
  • AI 聊天回复。在频道中或被提及时回答问题的 AI 助手,需要获取问题本身。没有该意图,它只知道有人说了话,却没有任何内容可以发送给模型。
  • 工单聊天记录。记录工作人员和成员在工单中实际说了什么的聊天记录,需要消息内容才能记录;没有它,你得到的只是一串时间戳和用户名,没有任何内容。
  • 基于前缀的审核。任何扫描消息以查找违禁词、邀请链接或垃圾信息模式的功能,都与自动回复一样需要读取内容。

斜杠命令不受影响,因为 Discord 会将命令输入与普通消息分开传递。真正依赖该意图的,是那些需要读取成员在普通消息中输入的内容的功能。

如何在开发者门户中开启意图

  1. 打开 Discord 开发者门户,并选择机器人的应用。
  2. 点击左侧边栏中的 Bot。
  3. 滚动到 Privileged Gateway Intents。
  4. 开启 Server Members Intent 和 Message Content Intent(仅当机器人确实需要实时状态数据时,才添加 Presence Intent)。
  5. 保存更改,然后重启或重新连接机器人,使其在下一次登录时应用新的意图。

开关会在下一次网关连接时生效,而不会立即对已登录的机器人生效。如果在机器人会话进行中关闭了某个意图,Discord 通常会断开其连接,待意图重新开启后需要再次连接。

100 个服务器的验证规则

对于服务器数量少于 100 个的机器人,只需在门户中切换开关即可。一旦机器人的安装数量超过 100 个服务器,Discord 就要求应用通过机器人验证,即所有者提交机器人接受审核,之后才能在该规模下使用特权意图。未经验证的机器人达到该阈值后,仍可继续在已加入的服务器中运行,但在通过验证或放弃并非严格需要的特权意图之前,无法加入新的服务器。

这是 Discord 平台的规则,并非任何个别机器人托管方可以控制的。它的存在是为了确保 Server Members 和 Message Content 这类数据敏感的意图,不会在未经 Discord 审核机器人如何使用这些数据的情况下大规模分发。

Noxyr 为何在接受令牌前检查两项意图

Noxyr 的自定义机器人功能会在你提供的机器人令牌下运行完整的功能集。由于欢迎消息、成员人数、AI 聊天、工单聊天记录和自动回复都依赖上述两项意图,因此仪表盘在接受你的令牌之前,会先检查 Server Members Intent 和 Message Content Intent 是否已开启。如果粘贴令牌时任一意图处于关闭状态,则会直接拒绝,而不是先接受、之后再因令人困惑的网关错误而悄然失败。

如果机器人已经在运行后,某个意图被关闭(例如,几个月后有人在门户中取消了勾选),Discord 网关会以 4013 或 4014 代码关闭连接。Noxyr 的托管节点会捕获这个特定的关闭代码,停止该机器人,并发布一条通俗易懂的状态消息,准确告诉你需要修复哪项设置,而不会让它陷入无声的重连循环。关于该错误以及其他常见离线原因的完整说明,请参阅我们的网关错误 4004/4014 故障排查指南。

常见问题

Noxyr 的自定义机器人需要 Presence Intent 吗?不需要。Noxyr 只请求 Server Members Intent 和 Message Content Intent。Presence Intent 可以保持关闭。

为什么我已经开启了开关,机器人仍然显示“disallowed intents”?网关只会在全新登录时读取当前状态。保存门户设置后请重启机器人,使其以新的意图重新连接。

开启 Message Content Intent 是否意味着 Discord 会向机器人共享消息历史?不是。它只影响机器人在线且有权访问该频道时发送的消息。它不会追溯授予机器人未在场时发送的历史消息的访问权限。

申请特权意图会导致机器人被封禁吗?不会。为需要它们的功能(欢迎消息、自动回复、AI 回复)申请并使用,正是这些意图的用途所在。验证机制针对的是大规模运行的机器人,并不是一种惩罚。

完整的设置步骤请参阅自定义机器人文档;或者免费添加 Noxyr,改为运行主机器人而非基于令牌的自定义机器人,即可完全跳过意图设置。