如何修复Discord机器人运行时出现的DiscordAPIError: Unknown Message错误?
Discord图片频道自动清理纯文本机器人报错修复方案
现有代码存在的问题
- 事件监听使用了discord.js v13版本后已废弃的
message事件,新版本该事件已替换为messageCreate,会导致事件无法触发直接报错 message.member.send()是异步操作,未添加错误捕获逻辑,当用户关闭了「允许服务器成员私信我」的权限时,会直接抛出未捕获异常导致机器人崩溃- 未做
message.member非空校验,如果用户发完消息立刻退出服务器,message.member会返回null,调用send方法会直接报错 - 未校验机器人自身是否拥有对应频道的「管理消息」权限,权限不足时调用
message.delete()会抛出错误 - 未在Discord开发者后台开启必要的消息内容权限,也未在客户端初始化时配置对应的意图,会导致无法接收消息事件
修复后的完整代码
// 客户端初始化部分示例(必须配置对应意图) const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 服务器意图 GatewayIntentBits.GuildMessages, // 服务器消息意图 GatewayIntentBits.MessageContent // 消息内容意图 ] }); client.on("messageCreate", async message => { // 过滤机器人自身发的消息 if (message.author.bot) return; // 白名单用户ID,配置后这些用户发的纯文本不会被删除 const allowedUsers = ['853248522563485717']; // 图片频道的ID const imageChannelId = '841260660960395287'; // 不是目标图片频道直接返回 if (message.channel.id !== imageChannelId) return; // 白名单用户直接放行 if (allowedUsers.includes(message.author.id)) return; // 带附件的消息直接放行 if (message.attachments.size > 0) return; // 校验机器人是否有管理消息的权限,没有就直接返回避免报错 if (!message.guild.members.me.permissionsIn(message.channel).has('ManageMessages')) return; try { // 成员存在时才发送私信提醒,私信失败静默处理不报错 if (message.member) { await message.member.send("你不能在图片频道发送纯文本消息").catch(() => {}); } // 删除违规消息 await message.delete(); } catch (err) { // 打印错误日志,不会导致机器人退出 console.error('清理违规消息失败:', err); } });
额外注意事项
配置代码前需要先进入Discord开发者平台的对应机器人设置页面,在「Privileged Gateway Intents」分类下开启
Message Content Intent开关,否则机器人无法读取消息内容,不会触发消息事件。
内容的提问来源于stack exchange,提问作者Uriyah Liberman
相关产品推荐
相关产品推荐

