You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
  }
});

关键修复点说明

  1. 机器人消息过滤:if (msg.author.bot) return; 这一行彻底阻断了循环触发的可能,机器人自身发送的消息不会再触发你的逻辑。
  2. 异步操作处理:用async/await包裹msg.delete()和channel2.send(),确保操作按顺序执行,避免异步导致的异常。
  3. 存在性检查:增加了频道和附件的存在性判断,避免因为频道不存在或没有附件导致代码崩溃。
  4. Embed正确使用:通过setImage()直接嵌入附件URL,完美解决附件无法在Embed中显示的问题。

额外提醒

如果你的Discord.js版本是v12或更高,channels.find()需要改成channels.cache.find(),因为新版本的频道集合需要通过cache属性访问。

内容的提问来源于stack exchange,提问作者lost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:12:38