python-discord.py 邀请 -approximate_presence_count API 逐渐变慢
TL/DR:
我approximate_presence_count每 10 秒查询一次邀请链接,它会在很长一段时间内逐渐停止检测存在变化。我怎样才能解决这个问题?
目标
我正在编写一个不和谐的机器人,它监视我所属的几个大型(> 100 个成员)服务器中的在线(和其他状态)成员的数量。该机器人不是任何相关服务器的成员,并且应该每 10 秒左右记录一次成员的数量。
这不是XY 问题,我不希望机器人成为服务器的成员,而只是希望它approximate_presence_count从邀请链接中使用。
方法
为此,我创建了到每个服务器的永久邀请链接,并查询它们的approximate_presence_count
每隔10秒通过tasks.loop
此外,我有一个小型测试服务器,其中有几个朋友登录和注销,以测试成员计数是否正常。
开发人员门户中启用了所有意图。这不是一个意图相关的问题。
问题
在我的小型测试服务器上进行测试期间,在大约24小时内运行bot的同时,我注意到它在检测approximate_presence_count
在我的一个朋友登录或注销discord之后。我在不同的日子里重复了这一点。虽然approximate_presence_count
要在任何给定的时间进行更新,可能是由于不协调的后端具有可变的负载量,这种趋势是恒定的。
大约20-24小时后approximate_presence_count
变得几乎无用,很少检测到任何更改。
预期结果:登录/注销和更改之间的延迟approximate_presence_count
保持不变
实际结果:登录/注销和更改之间的延迟approximate_presence_count
逐渐增加
我试过的
除了下面的代码外,我还尝试了不每次都获取邀请logger
我可以在多个网络和多台机器上复制信息。
最小可复制示例
下面的代码是从bot中提取的,应该只是相关组件。提取过程中可能会有错误,但要点不变。
import discord
from discord.ext import tasks
TOKEN='removed'
INTENTS=discord.Intents.all()
links=['discord.gg/foobarbaz','discord.gg/fillertext']#real invites removed
client = discord.Client(intents=INTENTS)
@tasks.loop(seconds=10)
async def logger():
invites=[await client.fetch_invite(i,with_counts=True)for i in links]#invite objects
counts=[getattr(i,'approximate_presence_count')for i in invites]#presence counts
with open('logs.txt','a') as file:
file.write(datetime.datetime.today().strftime("%d/%m/%Y, %H:%M:%S ")+','.join(map(str,counts))+'\n')
@client.event
async def on_ready():
logger.start()
client.run(TOKEN)
最终注释
中的预期延迟approximate_presence_count
在我的测试中,当没有出现此问题时,登录/注销和approximate_presence_count
在5到40秒之间,每100个中可能有1个达到60秒。