TL/DR:我每 10 秒查询一次邀请链接的 approximate_presence_count
,它在很长一段时间内逐渐停止检测状态变化。我该如何解决这个问题?
目标
我正在编写一个 discord 机器人,它监控我所属的几个大型(>100 个成员)服务器中的在线(和其他状态)成员的数量。该机器人不是任何相关服务器的成员,应该每 10 秒左右记录一次成员数量。
这不是 XY problem ,我不希望机器人成为服务器的成员,只是希望它使用邀请链接中的 approximate_presence_count
。
方法
为此,我已经为每个服务器创建了永久邀请链接,并且我通过 tasks.loop
每隔 10 秒查询一次它们的 approximate_presence_count
,将这些值记录到文本文件中。
此外,我有一个小型测试服务器,我有几个 friend 在其中登录和退出,以测试成员计数是否有效。
所有意图都在开发人员门户中启用。这不是与意图相关的问题。
问题
在我的小型测试服务器上进行测试时,在大约 24 小时的时间内运行机器人时,我注意到在我的一位 friend 登录后检测 approximate_presence_count
的变化变得越来越慢或不和谐。我在几个不同的日子里重现了这个。虽然 approximate_presence_count
在任何给定时间更新的时间都有一些微小的变化,可能是由于 discord 后端具有可变的负载量,但这种趋势是不变的。
大约 20-24 小时后,approximate_presence_count
变得几乎无用,很少检测到任何变化。
预期结果:登录/注销之间的延迟和 approximate_presence_count
的变化保持不变
实际结果:登录/注销之间的延迟和 approximate_presence_count
的变化逐渐增加
我尝试过的
除了下面的代码之外,我还尝试过不在每次 logger
循环时都获取邀请,但这也没有用。
我可以在多个网络和一台以上的机器上复制信息。
最小可重现示例
以下代码是从机器人中提取的,应该只是相关组件。提取过程中可能有错误,但要点是一样的。
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 个邀请链接,因此对 Discord 的请求频率平均为 0.6/秒。这是否足以引起速率限制? 正如 EricJin 在评论中提到的,这不太可能。
最佳答案
这很可能是评论中建议的 Discord 端的问题。他们有 changed how their invites work .这包括永久邀请链接的工作方式。虽然这篇文章没有说明内部变化,但它确实说明了新邀请如何在实际应用程序/网站上工作。邀请的更改时间与发布此帖子的时间(2022 年 5 月)有关,但此后有更新。
看来您可能遇到了进行这些更改时出现的问题,该问题似乎至少在发布此答案时已解决。
关于python - discord.py 邀请 - approximate_presence_count API 逐渐变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72596371/