Discord.js v14无法获取服务器成员游戏活动问题求助
问题解决:Discord.js v14无法获取成员在线状态及游戏活动
核心问题分析
你的代码存在两个关键问题:缺失必要的网关权限(Intents),以及对Discord.js v14的Presence API使用错误。
具体修复步骤
1. 添加缺失的网关权限
要获取成员的在线状态和活动数据,必须启用GuildPresences Intent,同时还要确保在Discord开发者门户的Bot页面开启Presence Intent和Server Members Intent权限。
修改后的Client初始化代码:
const { Client, GatewayIntentBits, ActivityType } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildPresences, // 新增这个Intent ], });
2. 修正Presence数据的访问逻辑
Discord.js v14中,成员的在线状态和活动数据的访问路径有变化:
- 在线状态直接通过
member.presence?.status获取(可选链操作符避免报错) - 游戏活动存储在
member.presence?.activities数组中,需要筛选出type为ActivityType.Playing的项
修改后的成员遍历逻辑:
members.each((member) => { console.log(` Mitglied: ${member.user.tag} (${member.id})`); // 判断在线状态:presence存在且状态不是offline const isOnline = member.presence?.status !== 'offline'; if (isOnline) { // 筛选出正在玩的游戏活动 const gameActivity = member.presence.activities.find(act => act.type === ActivityType.Playing); if (gameActivity) { console.log(` Aktuell gespieltes Spiel: ${gameActivity.name}`); } else { console.log(` Das Mitglied spielt derzeit kein Spiel.`); } } else { console.log(` Das Mitglied ist offline.`); } });
3. 注意事项
- 必须在Discord开发者门户开启对应的权限,否则即使代码中添加了Intent,也无法获取数据
- 使用可选链操作符
?.可以避免因member.presence不存在而抛出的错误 - 隐身状态的成员会被识别为offline,这是Discord的隐私机制
完整修复后的代码
const { Client, GatewayIntentBits, ActivityType } = require('discord.js'); // Erstelle einen neuen Discord-Client const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildPresences, ], }); const token = 'token'; client.once('ready', async () => { console.log('Bot ist bereit!'); client.guilds.cache.each(async (guild) => { console.log(`Gilde: ${guild.name} (${guild.id})`); const members = await guild.members.fetch(); members.each((member) => { console.log(` Mitglied: ${member.user.tag} (${member.id})`); const isOnline = member.presence?.status !== 'offline'; if (isOnline) { const gameActivity = member.presence.activities.find(act => act.type === ActivityType.Playing); if (gameActivity) { console.log(` Aktuell gespieltes Spiel: ${gameActivity.name}`); } else { console.log(` Das Mitglied spielt derzeit kein Spiel.`); } } else { console.log(` Das Mitglied ist offline.`); } }); }); }); client.login(token);
内容的提问来源于stack exchange,提问作者piguy
相关产品推荐
相关产品推荐

