使用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」指令实现逻辑
- 监听消息创建事件,过滤出触发指令的用户发送的
device内容 - 从服务器成员缓存中获取该用户的Member对象,提取其
presence属性 - 从
presence.clientStatus中判断存在的设备类型,映射为目标返回值(可按需调整映射规则) - 处理边界情况:用户离线、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
相关产品推荐
相关产品推荐

