Discord机器人重复发图问题排查及嵌入附件实现求助
解决Discord机器人重复发图与Embed附件显示问题
看起来你遇到了两个典型的Discord.js开发痛点:机器人无限重复发送图片,以及无法在Embed中正常展示附件。我来帮你一步步梳理解决思路:
一、为什么机器人会重复发送图片?
核心问题是机器人自身发送的消息也会触发message事件。你的代码监听所有频道消息,当机器人向channel2发送带附件的消息时,这条消息带有attachments属性,会再次触发你的逻辑,形成无限循环,最终导致连续发送几十次的情况。
解决这个问题的关键就是:在处理消息前先判断发送者是否为机器人本身,如果是就直接跳过后续逻辑。
二、如何在Embed中正确显示图片附件?
Discord的Embed不能直接通过files参数结合外部URL来展示图片,但我们可以直接把附件的URL赋值给Embed的setImage()方法,就能让图片在Embed中正常显示了。如果是上传本地文件才需要用attachment://filename的格式,但这里你是引用已有消息的附件,直接用URL是最便捷的方式。
修改后的完整代码
下面是修复后的代码,我加入了详细注释方便你理解:
client.on("message", async msg => { // 关键:跳过机器人发送的消息,彻底阻断循环触发 if (msg.author.bot) return; if (msg.attachments.size > 0) { try { // 单条消息删除用msg.delete()比bulkDelete更合适,避免批量删除的权限/时间限制问题 await msg.delete(); // 注意:如果你的Discord.js版本是v12及以上,需要改成channels.cache.find const channel1 = msg.guild.channels.find(r => r.name === "önemli-duyuru"); const channel2 = msg.guild.channels.find(r => r.name === "⚠│kural"); // 先检查目标频道和附件是否存在,避免代码崩溃 if (!channel1 || !channel2) { console.log("目标频道不存在,请检查频道名称是否正确"); return; } const targetAttachment = channel1.lastMessage?.attachments.first(); if (!targetAttachment) { console.log("önemli-duyuru频道的最后一条消息没有附件"); return; } // 创建Embed对象,自定义样式和内容 const photoEmbed = new Discord.MessageEmbed() .setTitle("⚠ 新图片通知") .setDescription(`这张图片由 ${msg.author} 发送`) .setImage(targetAttachment.proxyURL) // 直接用附件URL设置Embed图片 .setColor("#ff9900") // 可选:设置Embed主题颜色 .setTimestamp(); // 可选:添加消息发送时间戳 // 发送Embed到目标频道 await channel2.send(photoEmbed); console.log(`成功发送Embed到${channel2.name},图片链接:${targetAttachment.proxyURL}`); } catch (err) { // 错误处理,方便排查问题 console.error("处理过程中出现错误:", err); } } });
关键修复点说明
- 机器人消息过滤:
if (msg.author.bot) return;这一行彻底阻断了循环触发的可能,机器人自身发送的消息不会再触发你的逻辑。 - 异步操作处理:用
async/await包裹msg.delete()和channel2.send(),确保操作按顺序执行,避免异步导致的异常。 - 存在性检查:增加了频道和附件的存在性判断,避免因为频道不存在或没有附件导致代码崩溃。
- Embed正确使用:通过
setImage()直接嵌入附件URL,完美解决附件无法在Embed中显示的问题。
额外提醒
如果你的Discord.js版本是v12或更高,channels.find()需要改成channels.cache.find(),因为新版本的频道集合需要通过cache属性访问。
内容的提问来源于stack exchange,提问作者lost
相关产品推荐
相关产品推荐

