Discord.js v13如何通过用户ID获取GuildMember对象实现userinfo命令
你原来的代码存在两个核心问题:
- 获取用户的逻辑写法错误,
message.guild.member.length(args[0])是完全无效的语法,discord.js没有这个调用方式 - 硬编码使用了
message.member(命令发起者的成员对象)来填充Embed字段,导致不管查询谁,最终展示的都是发起者的服务器角色数、加入时间等信息
以下是修改后的完整可运行代码,支持@提及、输入用户ID两种查询方式,未输入参数时默认查询发起者自己的信息:
const moment = require('moment'); const { MessageEmbed } = require('discord.js') module.exports = { description: 'whois', run: async (client, message, args) => { try { // 1. 获取目标用户:优先@提及,其次用ID查询,无参数默认查自己 let targetUser; if (message.mentions.users.size > 0) { targetUser = message.mentions.users.first(); } else if (args[0]) { // 用输入的ID拉取用户,fetch是异步操作需要加await targetUser = await client.users.fetch(args[0]); } else { // 无参数时返回发起者自己的信息 targetUser = message.author; } // 2. 拉取用户在本服务器的成员对象,用于获取服务器内的角色、加入时间等信息 const targetMember = await message.guild.members.fetch(targetUser.id); // 3. 构造Embed,所有字段改用查询到的目标用户/成员属性 const embed = new MessageEmbed() .setTitle(`**PASSION ISLAND MODERATIONS**`) .setColor('#ffc0cb') .setThumbnail(targetUser.displayAvatarURL({ dynamic: true })) .addField('Username', targetUser.username) .addField('User Id', targetUser.id) .addField('Account Type', `${targetUser.bot ? 'Bot' : 'Human'}`) .addField(`Roles`, `${targetMember.roles.cache.size}`) .addField(`Joined At`, `${moment.utc(targetMember.joinedAt).format('ddd, MMM Do, YYYY, h:mm a')}`) .addField(`Created At`, `${moment.utc(targetUser.createdAt).format('ddd, MMM Do, YYYY, h:mm a')}`) .setTimestamp() .setFooter(`Requested by ${message.author.username}`) message.channel.send({ embeds: [embed] }) } catch (err) { // 异常处理:ID无效、找不到用户时返回提示 message.channel.send("未找到对应用户,请检查输入的ID是否正确,或确认用户在本服务器内") } }, }
注意事项:
- 如果你使用的是discord.js v13及以上版本,需要在bot初始化代码中开启
GUILD_MEMBERS特权网关意图,否则无法正常拉取服务器成员信息 - 如果不需要无参数默认查自己的逻辑,可以删除对应的else分支,换成参数为空时的提示即可
内容的提问来源于stack exchange,提问作者Jacy Harrington
相关产品推荐
相关产品推荐

