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

Discord.js机器人获取带Rich Presence游戏状态报presence未定义怎么修复

问题核心原因

你遇到的报错本质是访问了不存在对象的属性,核心有三个触发场景:

  • 调用指令时没有@有效用户,message.mentions.members.first()返回undefined
  • 你的机器人未开启Presence权限,导致拉取不到被@用户的状态数据,msgMention.presence为undefined
  • 带Rich Presence的游戏会生成多条活动记录,或者活动属性结构和普通游戏不一致,直接按下标取activities[0]或者访问不存在的属性会报错

具体修改方案

你需要在所有层级的属性访问前加非空判断,推荐用ES6的可选链操作符简化写法,同时提前校验必填属性是否存在,修改后的代码如下:

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

module.exports = {
    name: 'test',
    aliases: [],
    category: 'test',
    utilisation: '',

    execute(client, message, presence, guild) {
        // 先判断是否有@用户
        const msgMention = message.mentions.members.first()
        if (!msgMention) return message.channel.send('请@要查询的用户')

        // 加presence、activities非空判断
        const presenceData = msgMention.presence
        if (!presenceData || !presenceData.activities?.length) return message.channel.send('未查询到该用户的当前活动')

        // 优先取类型为PLAYING的活动,避免Rich Presence生成的其他类型活动排在前面
        const playingActivity = presenceData.activities.find(act => act.type === 'PLAYING' || act.name === 'Spotify')
        if (!playingActivity) return message.channel.send('该用户当前没有在玩游戏或收听Spotify')

        const mp = playingActivity
        if (mp.name === "Spotify"){
            // 加assets属性非空判断
            if (!mp.assets?.largeImage) return message.channel.send('未查询到该用户的Spotify播放信息')
            const imgvar = mp.assets.largeImage.replace('spotify:','')
            message.channel.send({
                embed: {
                    color: '1DB954',
                    title: `${msgMention.displayName} 正在收听 ${mp.assets.largeText}`,
                    image: {
                        url: `https://i.scdn.co/image/${imgvar}`
                    },
                },
            });
        } else {
            // 加timestamps.start非空判断
            if (!mp.timestamps?.start) return message.channel.send(`该用户正在玩 ${mp.name},但无法获取游玩时长`)
            const now = new Date();
            const playTimeMs = Math.abs(now - mp.timestamps.start);
            const hours = (playTimeMs / 36e5).toFixed(2)
            // 保留原有的英雄联盟特殊文案分支
            if (mp.name === "League of Legends") {
                return message.channel.send(`${msgMention.displayName} 已经在英雄联盟里浪费了 ${hours} 小时`);
            }
            message.channel.send(`${msgMention.displayName} 已经玩了 ${mp.name} ${hours} 小时`);
        }
    },
};

额外配置确认

你需要先去Discord开发者后台检查以下配置,否则依然可能拉取不到状态数据:

  • 进入你的机器人应用页,找到「Bot」选项卡,开启PRESENCE INTENT和SERVER MEMBERS INTENT开关
  • 初始化Client的Intents里要添加GUILD_PRESENCES、GUILD_MEMBERS权限项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:24:03