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

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:启用成员缓存

开启成员缓存后,机器人会自动同步成员的活动状态,无需手动拉取时额外指定参数:

  1. 确保你的Intents配置已开启members=True和presences=True(你已完成这一步)
  2. 初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:35:14