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

如何在Discord.js中实现+mention命令以提及指定Discord成员?

解决Discord.js中+mention命令的实现问题

我来帮你搞定这个+mention命令的问题!在Discord.js里实现这个功能其实没那么复杂,关键是找对成员的查找方式,下面分主流版本给你具体的解决方案:

方案一:Discord.js v14及以上(当前主流版本)

如果你的机器人用的是v14或更新版本,可以用下面的代码实现。核心思路是从服务器成员中匹配输入的用户名,然后输出对应的成员标签或直接提及:

// 监听消息创建事件(前缀命令模式)
client.on('messageCreate', async (message) => {
  // 过滤非+mention开头的消息和机器人消息
  if (!message.content.startsWith('+mention') || message.author.bot) return;

  // 提取用户输入的用户名参数
  const targetUsername = message.content.slice('+mention '.length).trim();
  if (!targetUsername) {
    return message.reply('请告诉我要提及的用户名哦!');
  }

  try {
    // 在服务器成员缓存中查找匹配的用户(不区分大小写)
    const targetMember = message.guild.members.cache.find(member => 
      member.user.username.toLowerCase() === targetUsername.toLowerCase()
    );

    if (!targetMember) {
      return message.reply(`找不到用户名为「${targetUsername}」的成员呢!`);
    }

    // 输出两种格式:一种是可点击的提及,一种是纯文本的@用户名#判别器
    message.channel.send(`你要的提及:${targetMember}\n纯文本标签:${targetMember.user.tag}`);
    // 注:${targetMember}会自动被Discord解析为@Gamer222#6478这种可点击的提及
  } catch (err) {
    console.error('查找成员出错:', err);
    message.reply('查找成员时出现了错误,请稍后再试!');
  }
});

方案二:Discord.js v13版本

如果你的机器人还在使用v13,核心逻辑和v14一致,只是如果需要获取不在缓存里的成员,fetch方法的调用略有不同:

client.on('messageCreate', async (message) => {
  if (!message.content.startsWith('+mention') || message.author.bot) return;

  const targetUsername = message.content.slice('+mention '.length).trim();
  if (!targetUsername) {
    return message.reply('请提供要提及的用户名!');
  }

  try {
    let targetMember = message.guild.members.cache.find(member => 
      member.user.username.toLowerCase() === targetUsername.toLowerCase()
    );

    // 如果缓存里找不到,尝试从服务器拉取成员数据(需要机器人有GUILD_MEMBERS权限)
    if (!targetMember) {
      const fetchedMembers = await message.guild.members.fetch({ query: targetUsername, limit: 1 });
      targetMember = fetchedMembers.first();
    }

    if (!targetMember) {
      return message.reply(`找不到用户名为「${targetUsername}」的成员!`);
    }

    message.channel.send(`可点击提及:${targetMember}\n纯文本标签:${targetMember.user.tag}`);
  } catch (err) {
    console.error('错误信息:', err);
    message.reply('查找成员失败,可能是机器人权限不足或者用户不存在!');
  }
});

额外优化:支持带判别器的精准查找

如果服务器里有重名用户,你可以修改代码支持用户输入完整的「用户名#判别器」,比如+mention Gamer222#6478,这样查找更精准:

// 修改参数提取和查找逻辑
const targetTag = message.content.slice('+mention '.length).trim();
const targetMember = message.guild.members.cache.find(member => member.user.tag === targetTag);

注意事项

  • 确保机器人拥有GUILD_MEMBERS权限,不然无法获取服务器成员列表
  • 大型服务器中,成员可能不在缓存里,所以需要用fetch方法拉取数据
  • ${targetMember}输出的是Discord可识别的提及格式(点击能跳转用户资料),而targetMember.user.tag是纯文本的「@用户名#判别器」,可以根据需求选择

内容的提问来源于stack exchange,提问作者Sheshank S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:09:55