如何让Discord机器人向指定频道发消息?代码报错求助
解决Discord机器人
-announce命令发送消息失败的问题 看起来你的代码里有几个和Discord.js版本不兼容、逻辑处理不到位的问题,结合报错信息,我帮你一步步梳理并修复:
核心问题分析
- API版本不匹配:你应该在用Discord.js v12或更高版本,但代码里用了旧版的API调用方式,这是导致找不到频道的主要原因
- 消息内容提取错误:直接用
message.content会把命令前缀和announce都包含进去,导致公告内容不对 - 未处理异步异常:
channel.send()是异步操作,没处理失败情况就会触发Promise拒绝警告 - 冗余代码:已经定义了
announcechannel却重复调用获取频道的方法
修正后的完整代码
// 确保你的bot实例、prefix已经正确初始化 const prefix = "-"; bot.on('message', async (message) => { // 过滤非命令消息和机器人自己发的消息 if (!message.content.startsWith(prefix) || message.author.bot) return; // 拆分命令和参数 const args = message.content.slice(prefix.length).trim().split(/ +/); const cmd = args.shift().toLowerCase(); if (cmd === 'announce') { // 提取命令后的公告内容 const announcementContent = args.join(' '); if (!announcementContent) { return message.reply('请输入要发送的公告内容哦!'); } // 获取目标频道(v12+需要用cache) const announceChannel = bot.channels.cache.get("336313710106902529"); if (!announceChannel) { return message.reply('找不到目标频道,请检查频道ID是否正确!'); } // 创建公告Embed(v12+用MessageEmbed替代RichEmbed) const announceEmbed = new Discord.MessageEmbed() .setTitle(":flag_jp: **Announcement** :flag_jp:") .setDescription(announcementContent) .setColor("#ff0000"); // 发送消息并处理异常 try { await announceChannel.send(announceEmbed); message.reply('公告已经成功发送到Announcements频道啦!'); } catch (error) { console.error('发送公告出错:', error); message.reply('发送公告失败了,请检查机器人是否有该频道的发消息权限,或者频道ID是否正确!'); } } });
关键修改说明
- 适配新版API:把
channels.get()改成channels.cache.get(),RichEmbed换成MessageEmbed,这是Discord.js v12+的强制要求 - 正确提取内容:用
args拆分命令和参数,再用join(' ')拼接回公告内容,避免把命令前缀包含进去 - 处理异步异常:用
async/await配合try/catch捕获发送消息时的错误,解决控制台的Promise拒绝警告 - 增强鲁棒性:添加了内容为空、频道不存在的判断,同时给用户发送反馈提示,方便排查问题
额外注意事项
- 确认机器人在Announcements频道有发送消息和嵌入链接的权限
- 频道ID要确保正确:开启Discord开发者模式后,右键频道就能复制ID
- 如果用的是Discord.js v13及以上版本,初始化客户端时需要开启
GUILDS和GUILD_MESSAGES这两个intents,否则无法获取频道和消息
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

