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)内でエラーが発生
- エラー内容をコンソールログに出力
- エラー内容をファイル出力
- os.system("kill 1")を実行してシステムを落とす
2.の処理は運用を考えて、実装することにしました。
ちょっと特殊なことをしますのでログ吐かせる方は、ぜひ参考にしてください。
1.コード解説
1-1.今回のコード
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.実際に動かしてみた
トークンが不適切だというエラーが出てますので成功です。
(時間表記が気になる方はフォーマットいじるなり、splitで区切るなりしてください)
無論、429 Too Many Requests (error code: 0)の対策もできています。
ココまでお付き合いいただきありがとうございました。
※何か連絡や依頼がありましたらDMをお願いします。
Twitter: Don't Pray Debug