使用discord.js开发Discord机器人:如何通过用户ID获取服务器昵称
通过用户ID获取Discord服务器昵称的实现方法
在discord.js中,服务器昵称是绑定在**服务器成员(GuildMember)**对象上的,而非用户(User)对象本身。要实现通过用户ID获取对应服务器昵称,核心是从目标服务器中获取该用户的成员对象,再提取昵称信息。
核心步骤
- 获取命令触发时所在的服务器对象(
message.guild或interaction.guild,取决于你用的是前缀命令还是Slash命令) - 调用服务器对象的
members.fetch(userId)方法,异步获取用户的成员对象 - 从成员对象中读取
nickname属性;若用户未设置服务器昵称, fallback 到user.username(全局用户名)
代码示例
前缀命令场景(适用于discord.js v13/v14)
async function showCoinLeaderboard(message) { // 按金币数从高到低排序用户ID const sortedUsers = Object.entries(Coin).sort((a, b) => b[1] - a[1]); let leaderboardContent = "🏆 金币排行榜 🏆\n"; for (const [userId, coinCount] of sortedUsers) { try { // 从当前服务器获取用户成员对象 const member = await message.guild.members.fetch(userId); // 优先用服务器昵称,无则用全局用户名 const displayName = member.nickname || member.user.username; leaderboardContent += `${displayName}: ${coinCount} 金币\n`; } catch (err) { // 处理用户已离开服务器的情况 leaderboardContent += `用户ID ${userId}: ${coinCount} 金币(已离开服务器)\n`; } } // 发送排行榜 message.channel.send(leaderboardContent); }
Slash命令场景(discord.js v14+)
async function showCoinLeaderboard(interaction) { await interaction.deferReply(); // 处理异步操作可能的延迟 const sortedUsers = Object.entries(Coin).sort((a, b) => b[1] - a[1]); let leaderboardContent = "🏆 金币排行榜 🏆\n"; for (const [userId, coinCount] of sortedUsers) { try { const member = await interaction.guild.members.fetch(userId); const displayName = member.nickname || member.user.username; leaderboardContent += `${displayName}: ${coinCount} 金币\n`; } catch (err) { leaderboardContent += `用户ID ${userId}: ${coinCount} 金币(已离开服务器)\n`; } } await interaction.editReply(leaderboardContent); }
注意事项
- 确保机器人拥有
GUILD_MEMBERS权限,否则无法获取服务器成员信息 - 服务器昵称是服务器专属的,跨服务器场景下需从对应服务器获取成员对象
members.fetch()是异步方法,必须放在async函数中并搭配await使用
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

