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

如何在discord.js v12的!announce公告命令中添加图片附件支持?

修改思路

你需要做两处核心调整:

  1. 修正附件图片的取值逻辑:discord.js v12的setImage()方法只接收图片URL字符串,不能直接传入附件对象,需要取附件的url属性
  2. 新增内容中的图片链接提取逻辑:用正则匹配公告内容中符合图片格式的URL,优先取上传的附件,附件不存在的情况下自动取内容中匹配到的第一张图片链接
修改后完整代码
const {MessageEmbed} = require('discord.js');

module.exports = {
    name: 'announce',
    description: "Does announcements in an embed",
    // 用法更新,支持附加图片或在内容里加图片链接
    usage: "<channel id> <公告内容> [可选:图片链接] 或直接在命令后附加图片",
    execute(message, args){
    if(!message.member.permissions.has(["MANAGE_MESSAGES"])) return message.reply("You don't have the required permissions to run this command.")

    let userArray = message.content.split(" ");
       let userArgs = userArray.slice(1);
       let member = message.mentions.members.first() || message.guild.members.cache.get(userArgs[0]) || message.guild.members.cache.find(x => x.user.username.toLowerCase() === userArgs.slice(0).join(" ") || x.user.username === userArgs[0]) || message.member;

       let rChannel = message.guild.channels.cache.get(args[0])
       // 注意这里你的代码里命令前缀是;,如果你实际用的是!记得替换
       if(!rChannel)return message.channel.send('Please specify the channel ID. Usage is: !announce <channelID> <message>')
       let MSG = message.content.split(`;announce ${rChannel.id} `).join("")
       if(!MSG)return message.reply('Please specify a message. Usage is: !announce <channelID> <message>')
       
       // 新增图片获取逻辑
       let imageUrl = null;
       // 优先取上传的附件
       if (message.attachments.size > 0) {
           const attachment = message.attachments.first();
           // 判断附件是否为图片
           if (attachment.height && attachment.width) {
               imageUrl = attachment.url;
           }
       }
       // 没有附件的情况下从内容提取图片链接
       if (!imageUrl) {
           // 匹配常见图片格式的URL正则
           const imgRegex = /(https?:\/\/.*\.(?:png|jpg|jpeg|gif|webp))/i;
           const matchRes = MSG.match(imgRegex);
           if (matchRes) {
               imageUrl = matchRes[0];
               // 如果不需要在公告内容里保留图片链接,就取消注释下面这行
               // MSG = MSG.replace(imgRegex, '').trim();
           }
       }

       const embed = new MessageEmbed()
       .setTitle('Announcement')
       .setDescription(`${MSG}`)
       // 只有拿到图片链接的时候才设置image,避免报错
       .setImage(imageUrl || '')
       .setFooter(message.author.tag, message.author.displayAvatarURL())
       .setTimestamp(Date.now()) 
       .setColor(0xA20B31)
       rChannel.send(embed);
    }
}
功能验证

修改完成后支持两种使用方式:

  • 发送!announce <频道ID> 公告内容同时直接上传图片附件,图片会自动插入公告嵌入
  • 发送!announce <频道ID> 公告内容 图片链接,链接会自动识别为嵌入图片
    如果不需要在公告正文中保留图片链接,取消代码中对应注释即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:06:01