discord.py invites接口approximate_presence_count长期运行变慢问题
核心摘要:每10秒查询一次邀请链接的approximate_presence_count字段,程序长时间运行后接口逐渐无法检测到在线状态变化,寻求修复方案。
实现目标
- 开发Discord机器人,监控所在的多个成员规模大于100的服务器的在线(及其他状态)成员数量
- 机器人不加入任何目标服务器,仅需每10秒左右完成一次成员数记录
- 明确说明:该需求不存在方向偏差,不考虑让机器人加入目标服务器的方案,仅通过邀请链接的
approximate_presence_count字段获取所需数据
现有实现逻辑
- 为每个目标服务器生成永久邀请链接,通过
tasks.loop每10秒查询对应邀请的approximate_presence_count值,将结果追加写入文本日志文件 - 搭建小型测试服务器,邀请多名测试人员反复上下线,用于验证成员计数功能的准确性
- 开发者后台已开启所有intents权限,问题与intents配置无关
故障现象
- 在小型测试服务器环境测试时,机器人连续运行约24小时后,测试人员上下线触发的
approximate_presence_count状态变化检测延迟持续升高,该问题已在多日重复测试中稳定复现 - 虽然Discord后端负载波动本身会导致
approximate_presence_count更新存在小幅延迟波动,但延迟随运行时间线性升高的趋势非常明确 - 连续运行20-24小时后,
approximate_presence_count字段基本失去作用,几乎无法检测到在线状态变化 - 预期表现:用户上下线到
approximate_presence_count数值更新的延迟保持在稳定区间 - 实际表现:用户上下线到
approximate_presence_count数值更新的延迟随程序运行时长逐渐升高
已尝试的排查操作
- 测试过不在每次
logger循环执行时重新拉取邀请信息的实现方式,问题未得到解决 - 更换多个网络环境、多台测试设备运行程序,均能复现该问题
最小可复现代码
import discord import datetime from discord.ext import tasks TOKEN = 'removed' INTENTS = discord.Intents.all() links = ['discord.gg/foobarbaz','discord.gg/fillertext'] # 已隐去真实邀请链接 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] # 获取邀请对象 counts = [getattr(i, 'approximate_presence_count') for i in invites] # 提取在线人数计数 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)
注:原提取代码缺失
datetime模块导入,上述代码补全了该必要导入,核心业务逻辑与原代码完全一致。
补充说明
approximate_presence_count的正常延迟范围
故障未出现的测试阶段,用户上下线到approximate_presence_count数值更新的延迟在5-40秒区间,仅约1%的请求延迟最高可达60秒。
请求频率说明
当前机器人共监控6个邀请链接,平均向Discord发起请求的频率为0.6次/秒。正如评论区EricJin提到的,该频率触发接口限流的可能性极低。
内容的提问来源于stack exchange,提问作者iteratedwalls
相关产品推荐
相关产品推荐

