
Discord4J 3.2+ 版本中,Message.getContent() 默认返回空字符串,是因为 Discord 已将消息内容设为敏感权限项,必须在开发者门户显式启用“Message Content Intent”,并在 Bot 初始化时声明该意图,否则无法读取普通用户消息文本。
discord4j 3.2+ 版本中,getcontent() 默认返回空字符串,是因为 discord 已将消息内容设为敏感权限项,必须在开发者门户显式启用“message content intent”,并在 bot 初始化时声明该意图,否则无法读取普通用户消息文本。
在 Discord v10 API 更新后(2022 年起强制执行),普通用户发送的消息内容(即非 Bot 自身消息)默认不可访问——这是 Discord 的安全策略调整。即使你的代码逻辑完全正确(如示例中对 !todo 的过滤与响应),若未正确配置权限,eventMessage.getContent() 将始终返回空字符串(""),仅 Bot 自身发送的消息因上下文可追溯而能读取内容。
✅ 正确解决步骤
1. 启用 Developer Portal 中的 Message Content Intent
- 登录 Discord Developer Portal → 选择你的应用 → Bot 标签页
- 向下滚动至 Privileged Gateway Intents 区域
- ✅ 勾选 MESSAGE CONTENT INTENT
- 点击右上角 Save Changes
⚠️ 注意:若你的 Bot 所在服务器数量 ≥ 100 或面向公众,还需提交合规性审核,否则该 intent 在大型服务器中仍被禁用。
2. 在 Discord4J 初始化时显式声明 Intent
仅 Portal 开启不够,代码中也必须主动请求该 intent。使用 GatewayIntentSet 显式添加:
import discord4j.gateway.GatewayIntent;
import discord4j.gateway.intent.IntentSet;
// 构建 GatewayClientOptions(Spring Boot 配置示例)
@Bean
public DiscordClientBuilder discordClientBuilder() {
return DiscordClientBuilder.usingToken("YOUR_BOT_TOKEN")
.withGatewayIntents(IntentSet.all() // 或更安全的做法:
.or(IntentSet.builder()
.add(Intent.MESSAGE_CONTENT) // 关键:必须显式包含
.build()));
}
若使用 DiscordClient.create(...) 手动初始化(非 Spring),则:
DiscordClient client = DiscordClientBuilder.create("TOKEN")
.gatewayResources(GatewayResources.builder()
.intents(IntentSet.all().or(IntentSet.of(GatewayIntent.MESSAGE_CONTENT)))
.build())
.build();
3. 验证权限是否生效
修改 processCommand 方法,加入调试判断:
public Mono<void> processCommand(Message eventMessage) {
String content = eventMessage.getContent();
System.out.println("Raw content: '" + content + "' (length=" + content.length() + ")");
System.out.println("Author bot? " + eventMessage.getAuthor().map(User::isBot).orElse(true));
return Mono.just(eventMessage)
.filter(message -> message.getAuthor().map(user -> !user.isBot()).orElse(false))
.filter(message -> !message.getContent().isBlank() && message.getContent().equalsIgnoreCase("!todo")) // 防空检查
.flatMap(Message::getChannel)
.flatMap(channel -> channel.createMessage("Things to do today:\n" +
" - write a bot\n" +
" - eat lunch\n" +
" - play a game"))
.then();
}</void>
✅ 正确配置后,控制台将输出类似:
Raw content: '!todo' (length=5) Author bot? false
? 补充说明
-
Intent.MESSAGE_CONTENT是特权 intent,需 Portal 开启 + 代码声明双重生效; - Spring Boot + Discord4J 3.2.5 环境下,若使用
discord4j-spring-boot-starter,请确保其版本 ≥1.0.0-M3(支持 intent 配置); - 不要依赖
eventMessage.getContent()的非空性做业务逻辑,建议始终结合!content.isBlank()判断; - 若仍为空,请检查 Bot 是否已被重新邀请进服务器(启用新 intent 后需重新授权,URL 中需含
&permissions=...参数)。
完成以上配置后,getContent() 即可正常获取用户消息文本,你的 !todo 命令也将如期触发响应。










