TL/DR: --我每10秒查询一个邀请链接的approximate_presence_count,它会在很长一段时间内逐渐停止检测存在变化。我怎么才能解决这个问题?
目标
我正在编写一个不和谐的机器人,它监视我所在的几个大型(>100个)服务器的在线(和其他状态)成员的数量。机器人不是任何相关服务器的成员,应该每10秒左右记录一次成员数。
这不是一个XY问题,我不希望bot成为服务器的成员,而只是希望它使用来自invite链接的approximate_presence_count。
方法
为此,我制作了指向每个服务器的永久邀请链接,并通过一个approximate_presence_count以10秒的时间间隔查询它们的tasks.loop,并将这些值记录到文本文件中。
此外,我有一个小型测试服务器,在其中我有几个朋友登录和关闭,以测试成员计数是否工作。
所有意图都在开发人员门户中启用。这不是一个与意图有关的问题。
问题
在我的小型测试服务器上进行测试时,当我在大约24小时内运行机器人时,我注意到在我的一个朋友登录或关闭不和之后,检测approximate_presence_count中的变化变得越来越慢。我在不同的日子里复制了这个。虽然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秒。
跟踪的邀请数目
该机器人目前正在跟踪6个邀请链接,因此请求不和的频率平均为0.6/秒。这是否足以导致一个比率消除?,如EricJin在评论中所提到的,这是不可能的。
发布于 2022-11-15 23:40:15
这很可能是不和谐的结束问题,正如评论中所建议的。他们有改变了他们邀请的方式。这包括永久邀请链接的工作方式。虽然这篇文章没有说明内部的变化,但它确实说明了新的邀请如何在实际的应用程序/站点上工作。更改到邀请线的时间大约是什么时候发布的(2022年5月),但从那时起就有了更新。
似乎您在进行这些更改时遇到了一个问题,这个问题似乎至少在发布此答案时是固定的。
https://stackoverflow.com/questions/72596371
复制相似问题