Discord.py:429速率限制。什么是;在耗尽的存储桶重置后才对其发出请求”;到底是什么意思?

Discord.py:429速率限制。什么是;在耗尽的存储桶重置后才对其发出请求”;到底是什么意思?,discord,discord.py,Discord,Discord.py,最近,我的机器人因为429利率限制代码而被暂时禁止。据我所知,这意味着它提出了太多的要求。但在网站上,它说为了避免429个响应,我应该“通过检查上面记录的速率限制标题来避免,并且在重置之前不要对耗尽的桶发出请求。” 我不明白黑体字的意思。我可以很明显地看出,这意味着我必须等到耗尽的存储桶重置后才能再次使用它,但什么是存储桶,存储桶如何耗尽,我/它如何耗尽,以及何时/如何重置?如您链接的页面所述 “每路由”速率限制可以在多个类似的使用路由(甚至是使用不同HTTP方法的同一路由)之间共享。我们公开了

最近,我的机器人因为429利率限制代码而被暂时禁止。据我所知,这意味着它提出了太多的要求。但在网站上,它说为了避免429个响应,我应该“通过检查上面记录的速率限制标题来避免,并且在重置之前不要对耗尽的桶发出请求。”


我不明白黑体字的意思。我可以很明显地看出,这意味着我必须等到耗尽的存储桶重置后才能再次使用它,但什么是存储桶,存储桶如何耗尽,我/它如何耗尽,以及何时/如何重置?

如您链接的页面所述

“每路由”速率限制可以在多个类似的使用路由(甚至是使用不同HTTP方法的同一路由)之间共享。我们公开了一个名为X-RateLimit-Bucket的报头来表示遇到的速率限制。我们建议使用此标头值作为速率限制的唯一标识符,这将允许您在跨不同路由发现这些共享限制时将其分组

。。。或者换句话说,HTTP响应将包含一个名为
X-RateLimit-Bucket
的头,该头将包含您正在使用的API路由的标识字符串。这意味着,如果要向一个特定的API端点发送数千个请求,Discord可能会在每个响应中返回相同的
X-RateLimit-Bucket
ID

随着
X-RateLimit-Bucket
标题,还会发送几个标题:

X-RateLimit-Limit: 5
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1470173023
X-RateLimit-Bucket: abcd1234
X-RateLimit-Reset-After: 64.5
所有这些标题的文档都列在同一页中,不过您应该在此处查找的是
X-RateLimit-Reset-After
X-RateLimit-Remaining
。“剩余”标头说明在被阻止之前可以向该端点发出多少请求(429 HTTP错误)。“Reset After”(重置之后)标题说明在当前bucket ID重置之前必须等待多长时间(以秒为单位),并且您将能够再次向该bucket发送请求

换句话说,通过向bucket发送请求,bucket将耗尽,并且当
X-RateLimit-Remaining
HTTP响应头等于0时,bucket将完全耗尽。它会自动重置,并在
X-RateLimit-Reset-after
HTTP响应头等于0(您必须等待的秒数为0,直到您可以向该bucket ID发送请求为止)后重置


更新:

由于这些信息位作为标题返回,您只需将
response.headers
值打印到屏幕上即可。这将为您提供所有返回的标题。例如,如果您想要剩余的请求,那么您需要执行
print(response.headers[“X-RateLimit-remaining”])
(这些头作为字典返回)


但是,如果您正在间接地与API交互(使用
discord.py
模块),我不确定在没有对模块进行一些编辑的情况下这是否可行。在浏览了互联网之后,我还没有找到任何接近于公开模块的底层会话对象的东西。但是,在阅读“我发现”时,它提示模块自身检测到速率限制,并阻止您发送任何请求(如果存储桶已用完)。

必须重新键入此注释,因为我忘记了@you,lol。例如,有没有办法将这些值打印到控制台
print(bucket\u limit\u remaining)
@goose.mp4我更新了答案,以包含有关检测这些值的更多信息,但是如果您想问更多问题,我认为您需要为其创建一个新线程,因为它们超出了问题的范围(或对问题进行编辑,但确保它仍然与原始问题相关)。如果我帮助了您/我的答案是正确的,请您勾选它(我答案左侧的按钮):)谢谢!非常有帮助的回答并彻底地回答了我的问题。我还不想把这个问题标记为答案,因为我只有一条评论。但是,是的,我会把它标记为一个答案,如果我需要更多的帮助,我会制作另一个线程。