最近,我的机器人程序因429速率限制代码而被暂时禁止。据我所知,这意味着它提出了太多的要求。但在discord开发者门户网站限速网站上,它表示要避免429条回复,我应该"通过检查上面记录的速率限制报头来避免,并且通过直到它们已经重置之后才对耗尽的桶进行请求来避免;
我不明白粗体字是什么意思。很明显,我可以看出这意味着我必须等到一个耗尽的bucket重置后才能再次使用,但什么是bucket,bucket是如何耗尽的,我是如何耗尽它的,它何时重置?
如您链接的页面中所写,
"每条路线";速率限制可以在多个类似的使用路由(或者甚至具有不同HTTP方法的相同路由(之间共享。我们公开一个名为X-RateLimit-Bucket的标头,以表示遇到的速率限制。我们建议使用此标头值作为费率限制的唯一标识符,这将允许您在不同路线上发现这些共享限制时对其进行分组。
。。。换句话说,HTTP响应将包含一个名为X-RateLimit-Bucket
的头,该头将包含您正在使用的API路由的标识字符串。这意味着,如果要向1个特定的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
。"Remaining"标头说明在被阻止(429 HTTP错误(之前,您还可以对此端点进行多少次请求。"Reset After"标头说明您必须等待多长时间(以秒为单位(,直到当前存储桶ID重置,并且您将能够再次向该存储桶发送请求。
换句话说,通过向bucket发送请求,bucket就会耗尽,一旦X-RateLimit-Remaining
HTTP响应标头等于0,它就会完全耗尽。它会自动重置,并在X-RateLimit-Reset-After
HTTP响应标头等于0之后重置(您必须等待的秒数为0,直到您可以向该bucket ID发送请求为止(。
更新:
由于这些信息位作为标题返回,您只需要将response.headers
值打印到屏幕上。这将为您提供所有返回的标头。例如,如果您想要剩余的请求,那么您可以执行print(response.headers["X-RateLimit-Remaining"])
(头作为字典返回(。
但是,如果您间接地与API交互(使用discord.py
模块(,我不确定在没有对模块进行某些编辑的情况下这是否可能。在搜索了互联网之后,我还没有找到任何接近于公开模块的底层Session对象的东西。然而,在阅读请求方法时,我发现了这一行,它暗示模块自己检测到速率限制,并阻止您发送任何请求(如果存储桶已用完(。