BoardGameGeek(BGG)APIに複数のリクエストを送信しようとしていますが、特定の時間枠内に一定量のリクエストを送信すると、タイムアウトになります(ステータスコード429)。これを機能させるために、いくつかのライブラリを試しました。
以下のようにsimple-rate-limiterライブラリを使用してみましたが、BGGはレート制限にかなり積極的であり、公式の制限を公開していないため、これは機能しませんでした。
/* simple-rate-limiter initialization (https://www.npmjs.com/package/simple-rate-limiter) */
const limit = require('simple-rate-limiter');
const request = limit(require('request')).to(10).per(1000);
const fetchStatistics = async (game) => {
/* Fetching the statistics from a separate API, because the base API doesn't include stats */
const url = 'https://cors-anywhere.herokuapp.com/https://www.boardgamegeek.com/xmlapi2/thing?id=' + game.$.objectid + '&stats=1';
request(url, (err, res, body) => { // simple-rate-limiter making the request
const xml = body;
return XML2JS.parseString(xml, (err, result) => { //XML2JS library call
console.log(result);
})
})
}
次に、以下に示すように、oibackoffライブラリをsimple-rate-limiterと組み合わせて使用してみましたが、それでもうまくいきませんでした。
/* simple-rate-limiter initialization (https://www.npmjs.com/package/simple-rate-limiter) */
const limit = require('simple-rate-limiter');
const request = limit(require('request')).to(10).per(1000);
/* oibackoff initialization (https://www.npmjs.com/package/oibackoff) */
const backoff = require('oibackoff').backoff({
algorithm: 'exponential',
delayRatio: 1,
maxTries: 0,
});
const fetchStatistics = async (game) => {
/* Fetching the statistics from a separate API, because the base API doesn't include stats */
const url = 'https://cors-anywhere.herokuapp.com/https://www.boardgamegeek.com/xmlapi2/thing?id=' + game.$.objectid + '&stats=1';
backoff(request, url, (err, res, body) => { // simple-rate-limiter making the request
console.log(res.statusCode);
const xml = res.body;
return XML2JS.parseString(xml, (err, result) => {
console.log(result);
})
})
}
私は何か間違ったことをしていますか?別のライブラリ/アプローチを使用する必要がありますか?
補足:request-rate-limiterも試しましたが、プロジェクトで機能する構文を取得できませんでした。
このソリューションは、BoardGameGeekAPI専用です。
したがって、次のような個別のリクエストを大量に実行する代わりに、
/xmlapi2/thing?stats=1&id=188920
/xmlapi2/thing?stats=1&id=174476
次のように、それらすべてを1つのリクエストにまとめることができます。
/xmlapi2/thing?stats=1&id=188920,174476
これは、1つのリクエストのみを送信し、レート制限が適用されないことを意味します。
ただし、1200を超えるゲームIDを添付した場合でも、これは失敗することがわかりました。サーバーはで応答し414 Request-URI Too Large
ます。
ここだ例そのエラーの。
1200以上が必要な場合は、ゲームIDを分割して複数のリクエストを行い、一度に1200のみをリクエストする必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加