如何让机器人将消息的全部附件复制到Embed中?
解决方法
Discord 的 Embed 结构限制了只能设置一张主图(setImage)和一张缩略图,无法直接在单个 Embed 中插入多张图片附件。要展示所有附件,你可以通过遍历所有附件,结合「主图+字段列表」或者「多Embed拆分」的方式实现:
方式一:单Embed集中展示所有附件
将第一个附件设为Embed主图,所有附件(包括第一个)通过字段添加文件名和可点击链接,适合混合类型附件的场景:
// 初始化基础Embed,包含原消息内容 const embed = new Discord.EmbedBuilder() .setTitle('复制的消息') .setDescription(message.content); // 遍历所有附件 if (message.attachments.size > 0) { message.attachments.forEach((attachment, index) => { // 第一个附件设为Embed主图 if (index === 0) { embed.setImage(attachment.url); } // 添加附件字段,显示文件名和访问链接 embed.addFields({ name: `附件 ${index + 1}`, value: `[${attachment.name}](${attachment.url})`, inline: false }); }); } // 发送处理好的Embed channel.send({ embeds: [embed] });
方式二:多Embed拆分展示图片附件
如果附件以图片为主,可以给每张图片单独创建一个Embed,非图片附件仍放在主Embed的字段中,视觉展示更直观:
const embeds = []; // 创建包含原消息内容的主Embed const mainEmbed = new Discord.EmbedBuilder().setDescription(message.content); embeds.push(mainEmbed); // 遍历所有附件处理 message.attachments.forEach(attachment => { // 图片附件单独创建Embed展示 if (attachment.contentType?.startsWith('image/')) { const imageEmbed = new Discord.EmbedBuilder().setImage(attachment.url); embeds.push(imageEmbed); } else { // 非图片附件添加到主Embed的字段 mainEmbed.addFields({ name: '附件', value: `[${attachment.name}](${attachment.url})`, inline: false }); } }); // 批量发送所有Embed channel.send({ embeds: embeds });
说明
- 原代码只取了
message.attachments.first(),所以仅处理第一个附件;通过forEach遍历所有附件即可覆盖全部内容。 - 若使用旧版 Discord.js(v13及以下),需将
EmbedBuilder改为MessageEmbed,其他逻辑一致。
内容的提问来源于stack exchange,提问作者Former
相关产品推荐
相关产品推荐

