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

Discord.js如何调用服务器昵称而非用户名?

获取Discord机器人中用户的服务器专属昵称

你需要通过服务器成员(Guild Member)对象来获取用户的服务器专属昵称,而不是直接使用全局用户对象。以下是适配你现有代码的修改方案:

修正后的完整代码

bot.on('message', function (user, userID, channelID, message, evt) {
  if (message.substring(0, 1) == '!') {
    var args = message.substring(1).split(' ');
    var cmd = args[0];
    args = args.splice(1);
    switch(cmd) {
      case 'ping':
        // 获取触发命令的频道对象
        const channel = bot.channels.get(channelID);
        // 默认使用用户全局用户名
        let userNickname = user.username;
        
        // 仅在服务器频道内尝试获取专属昵称
        if (channel.guild) {
          // 获取频道所属的服务器实例
          const guild = channel.guild;
          // 获取用户在该服务器的成员对象
          const member = guild.members.get(userID);
          // 如果存在服务器昵称则替换默认值
          if (member && member.nickname) {
            userNickname = member.nickname;
          }
        }
        
        bot.sendMessage({
          to: channelID,
          message: `Pong! was returned to user with nickname ${userNickname}`
        });
        break;
    }
  }
});

核心逻辑解释

  • 获取服务器上下文:通过bot.channels.get(channelID)拿到命令触发的频道,再通过channel.guild获取该频道所属的服务器,这是获取服务器专属信息的前提。
  • 获取成员对象:guild.members.get(userID)会返回用户在当前服务器的成员实例,这个对象里包含了服务器专属的昵称、角色等信息。
  • 昵称回退处理:如果用户没有设置过服务器专属昵称,member.nickname会返回null,这时我们就回退使用用户的全局用户名user.username。
  • 兼容DM场景:如果命令是在私信频道触发的,channel.guild会是undefined,代码会直接使用全局用户名,避免报错。

额外注意点

  • 确保你的机器人拥有GUILD_MEMBERS权限,否则可能无法正常获取成员对象的信息。
  • 如果你后续升级到Discord.js v12+版本,API会有一些变化(比如get()方法改为fetch()),但当前方案完全适配你现有的代码结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:17:43