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

如何正确读取Discord消息中附件的URL?开发求助

解决Discord.js中记录图片附件与Imgur链接到指定频道的问题

嘿,我懂你要做的事儿——就是当服务器里有人发图片附件或者Imgur的图片链接时,自动把这些图片的URL存到指定频道对吧?你之前的尝试方向是对的,但代码里有几个关键小问题导致没生效,我来帮你捋清楚并搞定这个功能!

先说说你之前代码的问题

  • 你用的message.content.includes(message.attachments)完全不生效,因为message.attachments是一个MessageAttachment集合对象,不是字符串,includes方法根本没法判断一个集合是否在消息内容里,这逻辑本身就走不通。
  • 另外,你需要把「消息自带的图片附件」和「消息内容里的Imgur链接」分成两种独立的情况处理,不能混在一起判断。

完整解决方案步骤

1. 先获取目标记录频道

首先你得提前拿到要用来记录URL的频道,用频道ID来获取最稳妥:

// 替换成你实际的目标频道ID
const targetChannel = client.channels.cache.get('123456789012345678');

如果获取不到频道,记得先检查ID是否正确,以及机器人有没有访问该频道的权限。

2. 处理消息中的图片附件

对于消息里直接上传的图片附件,我们可以遍历附件集合,筛选出图片类型的文件,然后提取URL:

if (message.attachments.size > 0) {
  // 筛选出所有图片类型的附件
  const imageAttachments = message.attachments.filter(attachment => 
    attachment.contentType.startsWith('image/')
  );
  
  // 遍历每个图片附件,发送到目标频道
  imageAttachments.forEach(attachment => {
    targetChannel.send(`来自${message.author.tag}的图片附件:${attachment.url}`);
  });
}

这里用contentType.startsWith('image/')来判断是图片,比单纯判断后缀更准确,能覆盖所有标准图片格式。

3. 处理消息中的Imgur图片链接

用正则表达式匹配消息内容里的Imgur图片链接,Imgur的图片链接一般是https://i.imgur.com/xxxxxx.png这类格式,正则可以这么写:

// 匹配Imgur的图片链接,支持http/https,常见图片格式
const imgurRegex = /https?:\/\/i\.imgur\.com\/[a-zA-Z0-9]+\.(png|jpg|jpeg|gif|webp)/g;
const matches = message.content.match(imgurRegex);

if (matches) {
  // 遍历所有匹配到的链接,发送到目标频道
  matches.forEach(link => {
    targetChannel.send(`来自${message.author.tag}的Imgur图片链接:${link}`);
  });
}

4. 整合完整代码(带防机器人自触发)

把上面的部分整合起来,还要加上忽略机器人自身消息的判断,避免循环触发:

client.on('messageCreate', async (message) => {
  // 忽略机器人自己发的消息,防止无限循环
  if (message.author.bot) return;

  // 获取目标记录频道
  const targetChannel = client.channels.cache.get('123456789012345678');
  if (!targetChannel) {
    console.log('目标频道不存在,请检查频道ID是否正确');
    return;
  }

  // 处理图片附件
  if (message.attachments.size > 0) {
    const imageAttachments = message.attachments.filter(attachment => 
      attachment.contentType.startsWith('image/')
    );
    imageAttachments.forEach(attachment => {
      targetChannel.send(`来自${message.author.tag}的图片附件:${attachment.url}`);
    });
  }

  // 处理Imgur图片链接
  const imgurRegex = /https?:\/\/i\.imgur\.com\/[a-zA-Z0-9]+\.(png|jpg|jpeg|gif|webp)/g;
  const matches = message.content.match(imgurRegex);
  if (matches) {
    matches.forEach(link => {
      targetChannel.send(`来自${message.author.tag}的Imgur图片链接:${link}`);
    });
  }
});

额外注意事项

  • 确保你的机器人拥有发送消息到目标频道的权限,以及读取消息内容的权限,不然会报错。
  • 如果你用的是Discord.js v12及以下版本,事件名称是message而不是messageCreate,记得对应调整。
  • 如果需要支持更多图片托管平台的链接,只需要扩展正则表达式即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:52:48