Discord JS如何获取Guild(服务器)内任意用户的在线状态?
获取Discord服务器内指定用户的在线状态
核心实现思路
要获取任意用户的在线状态,需先通过用户ID或用户名获取服务器成员对象,再从成员的presence.status字段提取状态,最终映射为你需要的null(离线)、online、dnd、idle。
前置条件
- 确保机器人在Discord开发者门户中开启了Server Members Intent(针对Discord.js v13+版本),否则无法获取未缓存的成员或离线用户状态。
- 机器人需拥有
GUILD_MEMBERS权限,否则无法访问服务器成员列表。
通过用户ID获取状态(推荐)
用户ID是唯一标识,用ID获取是最可靠的方式:
// 传入目标服务器对象和用户ID async function getUserStatusById(guild, userId) { try { // 优先从缓存获取,缓存无则调用API拉取 const member = await guild.members.fetch(userId); // 将Discord原生的'offline'转为null,其余状态直接返回 return member.presence?.status === 'offline' ? null : member.presence?.status; } catch (err) { console.error('获取成员失败:', err); return null; // 用户不存在或无权限时返回null } } // 使用示例(假设从消息事件中获取服务器对象) getUserStatusById(message.guild, '123456789012345678').then(status => { console.log('用户在线状态:', status); });
通过用户名获取状态
用户名可能重复,建议结合 discriminator(即用户名后的#xxxx后缀)精准定位:
// 传入服务器对象、用户名,可选传入discriminator async function getUserStatusByUsername(guild, username, discriminator = null) { try { // 获取服务器所有成员(缓存+API拉取) const members = await guild.members.fetch(); let targetMember; if (discriminator) { // 精准匹配用户名+discriminator targetMember = members.find(m => m.user.username === username && m.user.discriminator === discriminator); } else { // 模糊匹配第一个同名用户(可能不准确) targetMember = members.find(m => m.user.username === username); } if (!targetMember) return null; return targetMember.presence?.status === 'offline' ? null : targetMember.presence?.status; } catch (err) { console.error('获取成员失败:', err); return null; } } // 使用示例 // 精准匹配 getUserStatusByUsername(message.guild, 'Tobsterr', '1234').then(status => { console.log('用户在线状态:', status); }); // 模糊匹配(仅当服务器无同名用户时使用) getUserStatusByUsername(message.guild, 'Tobsterr').then(status => { console.log('用户在线状态:', status); });
注意事项
- 使用可选链操作符
?.避免member.presence为null时抛出错误(用户离线或机器人无权限获取状态时会出现此情况)。 - 若使用Discord.js v12及以下版本,API调用逻辑略有差异,无需开启Intents,但
guild.members.fetch()的参数格式不同。
内容的提问来源于stack exchange,提问作者Tobsterr
相关产品推荐
相关产品推荐

