Discord.js公告机器人异常求助:发送内容含指令前缀
解决Discord.js公告机器人的内容发送问题&嵌入功能实现
我来帮你搞定这个问题!你的核心问题有两个:一是机器人发送了完整的指令内容而非你想要的公告文本,二是需要正确嵌入命令相关内容到消息里。咱们一步步来修正:
问题根源分析
- 错误引用了完整消息内容:你原代码里用
message.content填充嵌入字段,这会把用户发送的整条消息(包括前缀?和命令Ann)都放进去,自然会输出?Ann Hello Guys。你需要提取的是命令后面的参数部分。 - 未处理命令大小写匹配:你的switch判断的是小写
'ann',但用户输入的是?Ann(大写A),这会导致匹配失败(除非你测试时输入的是小写),统一转成小写能避免这个问题。 - 缺少删除用户消息的逻辑:你提到要删除指令消息,但原代码里没有这部分逻辑,得补上。
修正后的完整代码
const Discord = require('discord.js'); // 必须导入Discord模块,原代码遗漏了这一步! const client = new Discord.Client(); const PREFIX = '?'; client.login('你的机器人Token'); client.once('ready', () => { console.log('Questo bot e online!'); }); client.on('message', async message => { // 忽略机器人自身的消息,防止循环触发 if (message.author.bot) return; // 只处理以设定前缀开头的消息 if (!message.content.startsWith(PREFIX)) return; // 提取命令与参数:移除前缀后分割,同时统一命令大小写 const args = message.content.slice(PREFIX.length).trim().split(/ +/); const command = args.shift().toLowerCase(); // 移除命令部分,剩下的args就是公告内容的分段 switch(command) { case 'ann': // 先删除用户的指令消息,用async/await确保删除完成后再发送公告 await message.delete().catch(err => { console.error('无法删除消息:', err); }); // 拼接公告内容:如果有参数就合并成字符串,否则设置默认提示 const announcementContent = args.join(' ') || '请输入公告内容哦!'; // 创建嵌入消息,将提取到的公告内容嵌入进去 const embed = new Discord.MessageEmbed() .setTitle('服务器公告') // 自定义嵌入标题 .setDescription(announcementContent) // 把公告内容放在嵌入描述区 .setColor('#2f3136') // 自定义嵌入颜色(这里用Discord深色主题色) .setTimestamp(); // 自动添加时间戳,可选 // 发送嵌入公告到当前频道 message.channel.send(embed); break; } });
关键改动说明
- 补上Discord模块导入:原代码没有
require('discord.js'),会导致Discord.MessageEmbed无法识别,这是基础错误。 - 优化参数提取逻辑:用
trim()去除前后空格,split(/ +/)处理多个空格的情况,args.shift()把命令从参数数组里分离,剩下的参数拼接后就是你要的公告文本。 - 加入消息删除逻辑:用
async/await保证删除消息后再发送公告,同时添加错误捕获,避免机器人因权限不足报错。 - 正确实现嵌入功能:现在嵌入消息里展示的是提取后的公告内容,完全符合你预期的效果。
注意事项
- 确保机器人在服务器中拥有管理消息的权限,否则无法删除用户的指令消息。
- 如果你使用的是Discord.js v13及以上版本,需要在Discord开发者门户的机器人设置中开启消息内容意图(Message Content Intent),否则机器人无法读取消息内容。
内容的提问来源于stack exchange,提问作者user13775332




