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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:15:44