Discord.py中tasks.loop定时任务内Guild成员计数无法同步更新
discord.py 定时任务获取的服务器成员数不刷新问题
问题根源
当前代码中client_channel.guild取自本地缓存对象,其member_count属性仅在机器人收到对应网关事件时更新:
- 若未显式开启
members网关意图,机器人无法接收成员加入、退出的事件推送,本地缓存的member_count会一直停留在机器人启动时的初始值,只有重启机器人重新拉取初始数据才会刷新
解决方法
可根据你的场景二选一:
方法1:开启members意图,自动同步缓存
适合需要实时响应成员变更的场景,无需额外API请求:
- 代码初始化时配置意图:
intents = discord.Intents.default() intents.members = True # 显式开启成员意图 bot = commands.Bot(command_prefix="你的前缀", intents=intents) - 同步到Discord开发者门户的机器人管理页,开启Server Members Intent开关(平台强制要求,代码配置不生效的话先检查这里)
方法2:定时任务执行时主动拉取实时数据
适合仅需定期拉取数据、不想开启全量成员事件监听的场景:
修改你的定时任务代码:
@tasks.loop(hours=1) async def update_embed(self): await self.bot.wait_until_ready() client_channel = self.bot.get_channel(channel_id) # 跳过本地缓存,主动拉取实时guild数据 guild = await self.bot.fetch_guild(client_channel.guild.id) member_count = guild.member_count print(member_count)
注意事项
- 方法1缓存自动同步,API调用少,适合需要频繁读取成员数的场景
- 方法2每次定时任务仅多一次API请求,无常驻事件开销,适合低频率拉取的场景
内容的提问来源于stack exchange,提问作者Muhammad Haris
相关产品推荐
相关产品推荐

