Discord APIにレート制限がかかった時の調査法

普段からReplitでBotをホストしているのですが、無料だと共通シャードなだけあって、たまーにレート制限にかかってることがあります。

おそらく同じシャードで動いてる誰かのプロジェクトが無茶したんでしょうが、自分のBotに影響されるのは少し困る場合もあるでしょう。

そんな時に、①あとどれくらいで解除されるのかを調べる方法と、②もし仮にdiscord.jsを使ったコーディング/デバッグ中にこの問題に当たってしまった時の応急処置策を備忘録代わりに書いておきます。

①レート制限の時間を調べる

レート制限がかかると、botがオフラインになってしまい、特に制限のときを考えていないBOTだと、エディタからだとレート制限にかかってることも分からないというのが事実です。
そんな時に「本当にレート制限に引っかかっているのか」「レート制限はあとどれくらいなのか」を調べる方法があります。
それはreplitのターミナル機能を使用すると可能です。
ターミナルを開いた状態で、次のコマンドを入力します。
curl -v https://discord.com/api/v9
すると、なにやらテキストが沢山出力されますが、必要なのはHTTP/2のあとです。

画像の場合HTTP/2のあとは、404となっています。
これがレート制限がかかっていると429となります。429は、HTTPのステータスコードのひとつで、Too Many Requestsという意味です。
くわしくはMozillaの記事を参照してください。
そして、肝心の「あとどれくらいで解除されるのか」は、HTTP/2の行の下にあるretry-after:のあとを見ると分かります。
429の時にはretry-afterが着いていると思います。その後の数字が解除までの時間です。
単位はです。

②開発中の応急的対処

開発中にレート制限が掛かって待てない!という場合には、DiscordのCanaryまたはPTBのエンドポイントを使うと開発を進めることができる可能性があります。
間違っても本番環境で使用しないでください
new Client({
    intent: [/*インテント*/],
    http: {
        api: "https://canary.discord.com/api"
    }
})
などとします
そうすると運が良ければ開発額が続けられると思います。
(ちなみに執筆時のdiscord.jsのバージョンはv13.6)
後で気づいたのですがCanaryもPTBもWebSocketの接続先はws://gateway.discord.ggですね
なのでこの対処策はWebhookしか使えません

終わりに

役立つかなあと思ってまとめておきました
参考にしてみてください
では(* ˙꒳˙ * )

コメント