Discord Bot能否通过member.activity判断活动?匹配VS Code活动失败求助
解决方法
你的两种写法都存在逻辑错误,导致无法正确判断成员活动:
错误原因分析
- 第一种写法:直接将
member.activity和新创建的discord.Activity(name='Visual Studio Code')对象做对比。即使两者的name属性相同,它们是不同的对象实例,所以永远不会相等。 - 第二种写法:
member.activity是Activity类型的对象,而discord.ActivityType.playing是枚举值,类型不匹配,对比结果永远为False。
正确实现步骤
- 启用必要的网关意图
要获取成员的活动状态,需要在Discord开发者门户的Bot设置中开启Server Members Intent和Presence Intent,并在代码中启用:
intents = discord.Intents.default() intents.members = True intents.presences = True bot = commands.Bot(command_prefix='!', intents=intents)
- 修正判断逻辑
遍历成员时,先判断member.activity是否不为空,再检查活动名称是否匹配,还可以根据需要筛选活动类型(比如Playing类型):
@tasks.loop(seconds=5) async def task_loop(): channel = bot.get_channel(1120312276579266590) # 确保频道存在 if not channel: return for member in bot.guilds[0].members: # 先判断活动是否存在 if member.activity: # 检查活动名称是否匹配,可根据需要添加类型判断 if member.activity.name == 'Visual Studio Code': # 可选:仅匹配Playing类型的活动 # if member.activity.type == discord.ActivityType.playing and member.activity.name == 'Visual Studio Code': await channel.send(member.mention) await channel.send(str(member.activity))
额外注意事项
- 确保Bot有查看成员活动的权限,并且目标服务器中Bot的角色位置高于要查看的成员角色(避免无法获取部分成员的信息)。
- 部分自定义活动的名称可能带有额外后缀或格式,可根据实际获取到的
member.activity.name调整匹配规则。
内容的提问来源于stack exchange,提问作者Mohammad Zarghami
相关产品推荐
相关产品推荐

