1
1

More than 1 year has passed since last update.

discord.errors.HTTPException: 429 Too Many Requests (error code: 0)対策法

Posted at

0.前回のあらすじと今回の処理内容

0-1.前回のあらすじと対策法

前回記事で解決できたと思ったのですが…
デバッグ中に 429 Too Many Requests (error code: 0) を吐きました。

このエラーは リクエストを投げすぎると発生するエラーです。
(よくある例:デバッグ中に何度もrun(TOKEN)を実行する)

コレの対処法はos.system("kill 1") を実行すれば解決できます。
(少し時間をおいてからrun(TOKEN)を実行すること)

前回記事ではログアウト処理を実装し、その際にos.system("kill 1")を実行してました。
ですが、完全対策には至らなかったようです。
(エラー出した後にos.system("kill 1")を実行させるのが正解)

なので今回は例外処理を走らせて対策していきます。

0-2.処理内容について

  • run(TOKEN)内でエラーが発生
    1. エラー内容をコンソールログに出力
    2. エラー内容をファイル出力
    3. os.system("kill 1")を実行してシステムを落とす

2.の処理は運用を考えて、実装することにしました。
ちょっと特殊なことをしますのでログ吐かせる方は、ぜひ参考にしてください。

1.コード解説

1-1.今回のコード

.py
import discord
import os, datetime, time

class MyClient(discord.Client):
  #botクラスの処理内容

def main():
  #タイムゾーン調整
  tz_jst = datetime.timezone(datetime.timedelta(hours=9))

  #すべての機能を使えるようにする
  intents = discord.Intents.all()
  #クラス生成、intentsは必須パラメータ
  client = MyClient(intents=intents)

  try:
    #Discord接続(エラー発生用)
    client.run("ABC")

    if (client.is_closed()):
      #discord.errors.HTTPException: 429 Too Many Requests対策
      SysClose()
    
  except discord.DiscordException as e:
    errorTime = str(datetime.datetime.now(tz_jst))
    errorText = "エラー発生:" + errorTime + "\n"
    errorText += str(e) + "\n"

    print("\n" + errorText)
    #エラーログを保存
    LogWrite(errorText)
    #discord.errors.HTTPException: 429 Too Many Requests対策
    SysClose()

#discord.errors.HTTPException: 429 Too Many Requests対策
def SysClose():
  print("osを切ります")
  os.system("kill 1")

#エラーログを保存する
def LogWrite(logText):
  sleepTime = 12
  textFile = open('log.txt', 'a')
  textFile.write(logText)
  textFile.close()
  print("処理が終わるまで待ちます:" + str(sleepTime) + "")
  #更新が終わるまで待たせる(早いと更新が正常に終わらない)
  time.sleep(sleepTime)

if __name__ == "__main__":
  main()

では、それぞれの処理について解説します。

1-2.try-except discord.DiscordException as e

例外処理判定をしている箇所です。
エラーが発生するとexcept内の処理を実行します。

変数eにエラー内容が入っています。
あとは、テキストを生成して、ぞれぞれの処理を呼び出しているだけですね。

1-3.LogWrite(logText)

エラーログを書き込んでる場所です。
ファイルを指定して末尾にエラーログを書き込んでます。

ココで大事な箇所はtime.sleep(sleepTime)

この処理は指定した時間内、処理を停止させる処理です。
コレを組み込まないとログがうまく保存されませんでした。
※os.system("kill 1")が悪さしています。

2.実際に動かしてみた

image.png
image.png
トークンが不適切だというエラーが出てますので成功です。
(時間表記が気になる方はフォーマットいじるなり、splitで区切るなりしてください)

無論、429 Too Many Requests (error code: 0)の対策もできています。
image.png
image.png

ココまでお付き合いいただきありがとうございました。

※何か連絡や依頼がありましたらDMをお願いします。
Twitter: Don't Pray Debug

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1