我正在开发一个私人浏览器扩展程序,它从网页中提取一些信息,并通过Webhook将其发布到Discord频道中。
浏览器扩展程序会评估“x-ratelimit-…”响应头以观察速率限制限制。
在进行“垃圾邮件测试”时,似乎速率限制限制得到了正确的尊重,到目前为止一切都正常。但是,即使“ratelimit-remaining”大于“0”,在发送一堆消息(15+)后仍然偶尔会出现速率限制。
为了解决这个问题,我已经在“ratelimit-remaining”为“1”时停止,并在“ratelimit-reset”时间戳中添加了额外的一秒钟。但这似乎没有帮助。
浏览器扩展程序会评估“x-ratelimit-…”响应头以观察速率限制限制。
在进行“垃圾邮件测试”时,似乎速率限制限制得到了正确的尊重,到目前为止一切都正常。但是,即使“ratelimit-remaining”大于“0”,在发送一堆消息(15+)后仍然偶尔会出现速率限制。
为了解决这个问题,我已经在“ratelimit-remaining”为“1”时停止,并在“ratelimit-reset”时间戳中添加了额外的一秒钟。但这似乎没有帮助。
let rateLimitRemaining = 5;
let rateLimitReset = 0;
function sendContent()
{
if ( contentQueue.length > 0 )
{
console.log( "Messages in content queue: " + contentQueue.length );
let content = contentQueue[ 0 ];
let dateTimestamp = getCurrentUTCTimestamp();
// Don't send if remaining rate limit is <= 1 and current UTC time is less than reset timestamp
if ( rateLimitRemaining <= 1 && dateTimestamp <= rateLimitReset )
return;
contentQueue.shift();
let url = "...";
sendMessage( content, url );
}
}
function sendMessage( content, url )
{
let payload = JSON.stringify( { "content": content } );
$.ajax(
{
contentType: 'application/json',
method: "POST",
url: url,
data: payload,
dataType: 'json'
} ).done( function( response, status, jqXHR )
{
rateLimitRemaining = parseInt( jqXHR.getResponseHeader( 'x-ratelimit-remaining' ) );
// Add an additional second to the reset timestamp
rateLimitReset = parseInt( jqXHR.getResponseHeader( 'x-ratelimit-reset' ) ) + 1;
let timeToResetRemaining = rateLimitReset - getCurrentUTCTimestamp();
console.log( '[' + getCurrentDateTime() + '] Content sent to webhook. Remaining until rate limit: ' + rateLimitRemaining + ' / Reset @ ' + rateLimitReset + ' (' + getCurrentUTCTimestamp() + ') (' + timeToResetRemaining + ')' );
} ).fail( function( jqXHR, status, error )
{
let response = jqXHR.responseJSON;
// If we got rate limited, respect the retry_after delay
if ( response.hasOwnProperty( 'message' ) && response.message.indexOf( 'rate limited' ) !== 0 )
{
rateLimitRemaining = 0;
rateLimitReset = getCurrentUTCTimestamp() + Math.ceil( response.retry_after / 1000 ) + 1;
}
console.log( '[' + getCurrentDateTime() + '] Error sending request to webhook.' );
console.log( response );
} );
}
同样的请求触发了请求限制,但是x-ratelimit-remaining
响应头的值大于0,这也很奇怪。
我错在哪里了?我需要考虑x-ratelimit-bucket
和x-ratelimit-reset-after
吗?
if ( rateLimitRemaining <= 1 && dateTimestamp <= rateLimitReset )
这行代码正确吗?rateLimitReset 不应该在之前定义吗? - 19mike95rateLimitReset
在代码的第2行被定义和初始化。:)let rateLimitReset = 0;
- Mario Werner