Discord.py中Member.activities始终返回空元组问题求助
问题分析与解决方案
核心原因
fetch_member() 方法默认不会拉取用户的**活动状态(Presence)**数据,它仅获取成员的基础信息。而 on_presence_update 是Discord主动推送的事件,会包含完整的活动数据,因此能正常获取。
解决方法
方法1:拉取成员时指定获取活动状态
在discord.py v2.0及以上版本中,fetch_member 支持 with_presence 参数,设置为 True 即可同时请求活动数据:
async def on_ready(self): user = await self.fetch_user(user_id) mutual_guild = await self.fetch_guild(user.mutual_guilds[0].id) # 添加 with_presence=True 参数拉取活动状态 member = await mutual_guild.fetch_member(user_id, with_presence=True) print(member.activities) print("Bot Ready")
方法2:启用成员缓存
开启成员缓存后,机器人会自动同步成员的活动状态,无需手动拉取时额外指定参数:
- 确保你的Intents配置已开启
members=True和presences=True(你已完成这一步) - 初始化Bot时启用完整的成员缓存:
bot = commands.Bot(command_prefix="!", intents=intents, member_cache_flags=discord.MemberCacheFlags.all())
注意:on_ready 触发时,机器人可能还未完成所有成员的缓存加载,若要在该事件内获取数据,可延迟几秒或监听on_member_update事件确认缓存就绪。
方法3:通过on_presence_update缓存活动数据
既然你已能通过on_presence_update获取活动,可在该事件内将数据缓存到变量中,后续直接调用:
class MyBot(commands.Bot): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.user_activities = {} # 用于缓存目标用户的活动 async def on_presence_update(self, before, after): if after.id == user_id: self.user_activities[after.id] = after.activities async def on_ready(self): # 短暂等待确保活动数据已被缓存 await asyncio.sleep(2) print(self.user_activities.get(user_id, [])) print("Bot Ready")
内容的提问来源于stack exchange,提问作者Timothy
相关产品推荐
相关产品推荐

