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

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是空数组,直接读取属性也会触发报错。
修正方法

按以下步骤调整代码即可:

  1. 初始化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」开关,否则就算代码里写了意图也拿不到数据。

  1. 将获取目标对象的方法从getUser()替换为getMember(),拿到对应服务器内的GuildMember实例:
// 替换原有的getUser逻辑
const targetMember = interaction.options.getMember('target');
  1. 增加空值兜底逻辑,按数组规则读取活动数据:
// 先判断状态和活动是否存在
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:21:27