Discord.js v13中如何从交互对象获取用户activities属性?
报错原因
这个报错由4个常见问题共同/单独导致:
interaction.options.getUser()返回的是全局User对象,该对象仅存储用户的全局基础信息(ID、用户名、头像等),不存在presence属性。只有和具体服务器绑定的GuildMember对象,才会携带当前服务器下的用户状态数据,直接对User对象取presence会得到undefined,后续读取activities就会触发类型错误。- Discord.js v13 出于性能和隐私考虑,默认不主动拉取用户的presence(在线状态、活动)数据,初始化客户端时如果没有手动开启对应权限意图,就算拿到GuildMember对象,
presence字段也会是null。 presence.activities是数组结构,存储用户当前开启的所有活动(正在玩的游戏、听歌状态、自定义状态等),不存在直接的type属性,直接调用.type本身就是语法错误。- 部分用户可能关闭了活动展示、或者当前没有开启任何活动,此时
activities是空数组,直接读取属性也会触发报错。
修正方法
按以下步骤调整代码即可:
- 初始化Client时添加拉取presence必需的意图配置:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ // 保留你原有业务需要的其他意图,比如GUILDS、GUILD_INTERACTIONS等 Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_PRESENCES, // 必须添加:开启成员状态拉取权限 ] });
注意:你还需要去Discord开发者后台,对应应用的「Bot」页面,下滑找到「Privileged Gateway Intents」板块,打开「Presence Intent」开关,否则就算代码里写了意图也拿不到数据。
- 将获取目标对象的方法从
getUser()替换为getMember(),拿到对应服务器内的GuildMember实例:
// 替换原有的getUser逻辑 const targetMember = interaction.options.getMember('target');
- 增加空值兜底逻辑,按数组规则读取活动数据:
// 先判断状态和活动是否存在 if (!targetMember.presence || targetMember.presence.activities.length === 0) { return interaction.reply('该用户当前没有公开的活动状态'); } // activities是数组,可按需筛选对应类型的活动,比如取第一个活动 const currentActivity = targetMember.presence.activities[0]; // 正确读取活动属性 console.log('活动类型:', currentActivity.type, '活动内容:', currentActivity.name);
补充:presence数据仅在服务器频道的交互场景下有效,私聊交互场景下无法获取任何用户的活动状态。
内容的提问来源于stack exchange,提问作者Belven
相关产品推荐
相关产品推荐

