You need to enable JavaScript to run this app. 使用Discord.JS Bot检测Discord用户设备及clientStatus API用法咨询
优惠活动
大模型
产品
解决方案
定价
更多

使用Discord.JS Bot检测Discord用户设备及clientStatus API用法咨询

Discord Bot 检测用户登录设备(clientStatus)实现步骤

前置必做配置

  • 首先需要开启Discord Bot的特权网关意图:在Discord开发者后台的Bot设置页,找到Privileged Gateway Intents分类,打开Presence Intent开关,否则无法获取用户在线状态数据
  • 代码初始化Client时必须声明对应意图,以discord.js v14为例,intents列表必须包含:
    • GatewayIntentBits.Guilds:基础服务器交互必需
    • GatewayIntentBits.GuildMessages:监听消息指令必需
    • GatewayIntentBits.GuildPresences:获取用户Presence(含clientStatus数据)必需

clientStatus属性说明

Presence.clientStatus是一个对象,存储了用户当前所有在线设备的状态,包含3个可选键值对:

  • desktop:用户是否在桌面端Discord在线,值为online/idle/dnd等Discord状态值
  • mobile:用户是否在移动端App在线
  • web:用户是否在网页端Discord在线

注意:如果用户某设备处于离线状态,对应的键会不存在或无有效值
注意:Discord API仅能返回用户当前已登录且处于在线/空闲/勿扰状态的设备列表,无法精准识别用户当前正在主动操作的设备,如需优先展示某类设备可自行调整判断优先级

「device」指令实现逻辑

  1. 监听消息创建事件,过滤出触发指令的用户发送的device内容
  2. 从服务器成员缓存中获取该用户的Member对象,提取其presence属性
  3. 从presence.clientStatus中判断存在的设备类型,映射为目标返回值(可按需调整映射规则)
  4. 处理边界情况:用户离线、presence为null时的返回提示

示例代码(discord.js v14)

const { Client, GatewayIntentBits } = require('discord.js');

// 初始化客户端,声明必需的意图
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.GuildPresences
  ]
});

// 设备类型映射表,可按需调整返回值
const deviceMap = {
  mobile: 'phone',
  desktop: 'desktop',
  web: 'web'
};

client.on('messageCreate', async (message) => {
  // 忽略Bot自己发的消息,过滤非device指令
  if (message.author.bot || message.content.trim() !== 'device') return;

  // 仅处理服务器内的消息,私信无法获取presence数据
  if (!message.guild) return message.reply('请在服务器内触发该指令');

  // 获取发指令用户的服务器成员对象
  const member = message.guild.members.cache.get(message.author.id);
  if (!member) {
    return message.reply('无法获取你的成员信息');
  }

  // 处理用户离线/无presence的情况
  if (!member.presence || !member.presence.clientStatus) {
    return message.reply('当前无法获取你的在线设备状态(可能你处于离线状态)');
  }

  // 提取所有当前在线的设备类型
  const activeDevices = Object.keys(member.presence.clientStatus).map(device => deviceMap[device]);

  // 按需求返回:单设备直接返回对应值,多设备则列出所有
  const replyContent = activeDevices.length === 1 
    ? `你的当前登录设备为:${activeDevices[0]}`
    : `你当前同时在以下设备登录:${activeDevices.join('、')}`;

  message.reply(replyContent);
});

// 替换为你自己的Bot令牌
client.login('你的Bot令牌');

常见踩坑说明

  • 若一直获取不到presence数据,优先检查是否已开启开发者后台的Presence Intent特权开关,以及代码中是否正确声明了GuildPresences意图
  • 若通过私信触发指令,无法获取用户的Presence数据,需引导用户在服务器内触发指令
  • 若用户刚发送指令但状态未更新,可优先确认用户的Discord客户端是否已正常连接网络,数据存在极短的同步延迟
  • 该方法无法获取用户未登录/离线状态下的设备信息,仅能获取当前在线的设备类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 13:54:04