如何让Discord机器人用JSON格式输出Embed消息(仿Carl-bot效果)
看起来你已经朝着实现Carl-bot风格的Embed发送功能迈出了不错的第一步!我来帮你完善这段代码,解决潜在问题,让它更稳定易用。
优化后的Embed发送命令实现
你的核心思路完全正确——通过解析JSON来动态构建Embed,但有几个细节可以优化,避免报错、提升用户体验:
1. 关键优化点
- 错误捕获:直接用
JSON.parse()会在用户输入格式错误时崩溃,必须加异常处理 - 输入校验:确保用户确实提供了JSON内容,避免空输入导致的问题
- 版本适配:适配Discord.js v12+的Embed发送格式(旧版本可调整)
- 权限容错:处理删除消息时的权限不足问题
优化后的完整代码
const Discord = require('discord.js'); module.exports.run = async (bot, message, args) => { // 尝试删除用户命令消息,处理权限不足情况 if (message.deletable) { try { await message.delete(); } catch (err) { console.error('无法删除命令消息:', err); } } // 检查用户是否输入了JSON内容 if (!args.length) { return message.channel.send('请提供要发送的Embed JSON内容!') .then(msg => setTimeout(() => msg.delete(), 5000)); // 5秒后自动清理提示 } const jsonContent = args.join(' '); let embedData; // 解析JSON并处理格式错误 try { embedData = JSON.parse(jsonContent); // 确保解析结果是合法的Embed对象 if (typeof embedData !== 'object' || Array.isArray(embedData)) { throw new Error('输入的JSON必须是单个Embed对象!'); } } catch (err) { return message.channel.send(`JSON解析失败:\`${err.message}\``) .then(msg => setTimeout(() => msg.delete(), 8000)); } // 发送Embed,适配Discord.js v12+版本 try { await message.channel.send({ embeds: [embedData] }); } catch (err) { message.channel.send('发送Embed失败,请检查JSON是否符合Discord规范!') .then(msg => setTimeout(() => msg.delete(), 8000)); console.error('Embed发送出错:', err); } }; module.exports.config = { name: "say", description: "通过JSON格式发送自定义Embed消息", usage: "-say {\"title\":\"示例标题\",\"description\":\"示例描述\",\"color\":16711680}", accessableby: "Members", aliases: ["embed"] };
使用示例
比如要发送一个红色的测试Embed,输入以下命令即可:
-say {"title":"欢迎使用Embed命令","description":"这是一条测试消息","color":16711680,"footer":{"text":"由机器人发送"}}
注意事项
- 如果你的Discord.js版本是v11或更早,发送Embed时需要把
{ embeds: [embedData] }改成{ embed: embedData } - JSON格式必须严格:所有字符串和键名都要用双引号,不能有多余的尾逗号
- 可以参考Discord官方的Embed对象规范来编写合法的JSON结构
内容的提问来源于stack exchange,提问作者Haru-hue
相关产品推荐
相关产品推荐

