C#开发Discord Bot无法读取普通消息,仅能响应@提及请求求助
Discord Bot无法读取普通消息内容的排查与修复
问题核心原因
- 缺失消息内容意图(Message Content Intent):Discord当前要求Bot必须明确开启该权限才能读取非提及类消息的内容,默认状态下仅允许读取@提及、DM等特定场景的消息内容。
- 未过滤无效消息:代码未排除Bot自身发送的消息或系统消息,这类消息的
Content字段为空,导致控制台输出空值。
具体修复步骤
1. 过滤无效消息类型与Bot自身消息
修改MessageReceivedAsync方法,先筛选出有效用户消息,再处理业务逻辑:
public async Task MessageReceivedAsync(SocketMessage message) { // 过滤Bot自身消息和非用户文本消息 if (!(message is SocketUserMessage userMessage) || message.Author.IsBot) { return; } Console.WriteLine("Received message: " + userMessage.Content); // 判断普通"hi"消息 if (userMessage.Content.StartsWith("hi")) { await message.Channel.SendMessageAsync("I am here, what do you need"); } // 保留原有的@提及判断逻辑 else if (userMessage.Content.StartsWith("<@1070991931615748157> hi")) { await message.Channel.SendMessageAsync("I am here, what do you need"); } }
2. 在Discord开发者平台开启消息内容权限
- 登录Discord开发者门户,进入你的Bot应用页面
- 切换到Bot标签页,找到Privileged Gateway Intents区域
- 开启Message Content Intent选项并保存设置
3. 初始化客户端时配置网关意图
修改Bot构造函数,添加必要的网关意图配置:
public Bot() { var config = new DiscordSocketConfig { // 配置必要的网关意图:服务器权限、服务器消息、消息内容 GatewayIntents = GatewayIntents.Guilds | GatewayIntents.GuildMessages | GatewayIntents.MessageContent }; _client = new DiscordSocketClient(config); _client.MessageReceived += MessageReceivedAsync; }
验证修复
重新启动Bot后,在测试服务器发送"hi",控制台应正常输出消息内容,Bot也会做出对应响应。
内容的提问来源于stack exchange,提问作者Simplylmk
相关产品推荐
相关产品推荐

