如何正确读取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
相关产品推荐
相关产品推荐

