C# Discord机器人无响应求助:无法读取聊天消息
问题诊断与修复方案
1. 事件注册顺序错误
你代码里先执行了登录和客户端启动操作,之后才绑定MessageReceived事件。这会导致客户端启动后触发的消息事件无法被监听——事件绑定必须在客户端启动前完成。
2. 缺失Gateway Intents配置
Discord API现在要求明确声明网关意图(Intents)才能读取消息内容。默认配置未启用消息相关意图,这是message.Content为空的核心原因。
3. 开发者门户与权限配置
- 登录Discord开发者门户,进入你的Bot页面,开启Privileged Gateway Intents下的
Message Content Intent。 - 邀请机器人到服务器时,确保链接包含
SendMessages和ReadMessageHistory权限(权限参数可设为3072),且机器人在目标频道有对应权限。
4. 可选优化:排除机器人自身消息
添加判断忽略机器人发送的消息,避免无意义的处理逻辑。
修改后的完整代码
using System; using System.Threading.Tasks; using Discord; using Discord.WebSocket; namespace HiBot { class Program { private DiscordSocketClient _client; static void Main(string[] args) => new Program().MainAsync().GetAwaiter().GetResult(); public async Task MainAsync() { // 配置所需的网关意图 var config = new DiscordSocketConfig { GatewayIntents = GatewayIntents.GuildMessages | GatewayIntents.DirectMessages | GatewayIntents.MessageContent }; _client = new DiscordSocketClient(config); // 先注册事件,再启动客户端 _client.Log += Log; _client.MessageReceived += MessageReceived; string token = "iwillnotshowmytokenhere"; await _client.LoginAsync(TokenType.Bot, token); await _client.StartAsync(); await Task.Delay(-1); } private Task Log(LogMessage message) { Console.WriteLine(message.ToString()); return Task.CompletedTask; } private async Task MessageReceived(SocketMessage message) { // 忽略机器人自身消息 if (message.Author.IsBot) return; Console.WriteLine($"Your message is: {message.Content}"); if (message.Content.ToLower().StartsWith("!hi")) { await message.Channel.SendMessageAsync("Hello!"); } } } }
内容的提问来源于stack exchange,提问作者fast_kars
相关产品推荐
相关产品推荐

