python - discord.py 邀请 - approximate_presence_count API 逐渐变慢

标签 python discord discord.py bots

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/

相关文章:

python - 使用 python 从网站中仅提取 'strong' 标题后的要点

python - 如何从 Discord API (URL) 获取用户状态

discord - 如何让我的机器人删除自己的消息?

python - Discord.py on_guild_join 事件

python - 在 python 中使用 BS 抓取页面仅捕获 splitColumn 的第一列

python - 限制列表元素类型 python 3.7

python - 如果 Python 程序被杀死,自动重启它

java - Discord JDA Bot 在调用扩展类时抛出 NullPointerException

python - Discord.py wait_for ('reaction_add' )与直接消息的功能不同

python - 值错误 : malformed sha256_crypt hash (checksum must be exactly 43 chars)