質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

170閲覧

discord.pyで2回目以降のclient.runが途中で動作しなくなる

shupira

総合スコア7

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/03/22 00:04

編集2024/03/22 10:33

実現したいこと

何度実行してもrole.editが動作するようになる.

発生している問題・分からないこと

1度目のclient.runではchange_role_colorが継続して動作する(少なくとも2時間以上動作することを確認)ものの,
2度目以降のclient.runではawait role.editを数回~20回弱処理した後に動作が停止してしまいます.
これは1度目の総実行時間に関係なく発生します.

エラーメッセージ

error

1ごくまれにリクエストが多すぎるから〇〇秒後にやり直せ(60秒未満)という警告が1度発されます.

該当のソースコード

python

1from collections import deque 2 3import discord 4from discord.ext import tasks 5 6from discord_token import TOKEN 7 8RGB_deque = deque([16739953, 16739776, 16739327, 9 16748543, 14389759, 9354751, 10 9371647, 9371540, 16768660]) 11 12# 受信イベント設定 13intents = discord.Intents.all() 14client = discord.Client(intents=intents) 15 16 17@client.event 18async def on_ready(): 19 guild_id = idの数値 20 guild = client.get_guild(guild_id) 21 22 role_id = idの数値 23 role = guild.get_role(role_id) 24 change_role_color.start(role) 25 26 27@tasks.loop(seconds=8) 28async def change_role_color(role): 29 new_color = RGB_deque.popleft() 30 print(f'change {new_color}') 31 await role.edit(color=new_color) 32 print(f'changed {new_color}') 33 RGB_deque.append(new_color) 34 35 36if __name__ == '__main__': 37 try: 38 client.run(TOKEN) 39 except KeyboardInterrupt: 40 client.close() 41

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

検索の結果,os.system("kill 1")をすればよいという情報は得られましたが,wnidowsでは好ましくないように感じますしエラーとなりました.

自身のコードの変更ではget_guildやget_roleをon_ready内に記述することで起動時に1度だけ実行するようにしてアクセス回数を削減してみました.

また,ctrl+cを補足してcloseするように変更しました.

補足

切断方法を頂いた検索ワードで再度調べた結果,以下の切断方法が見つかりましたが,どちらも公式リファレンスには存在しておりませんでした.

python

1await client.logout() 2await client.Logoff()

また,私は提示したソースコードの40行目においてdiscordを切断しているのですが,これは本来awaitを入れなければならないものでした.
しかし,discord bot が想定通り停止しているため今回の問題とは関係ないと思われます.
また,停止後の動作はbotがオフラインとなりプログラムが停止いたします.
何ら一切の処理はそのあと行われません.

動作が継続されているのではそいうご指摘をいただきましたが,念のためwindowsを再起動しても同様の症状であったため,その可能性は低いと考えます.
windowsを再起動して再度コマンドラインから実行しても数回~20回弱で色の更新が止まってしまいます.

1度目のclient.runと2度目以降のclient.runは同一のcmdウィンドウから実行しております.

なお,1日程度日を開けると再度連続して動作するように(期待したように)なるようです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

https://qiita.com/DoNotPrayDebug/items/8ab5dd9d245f35561f4a
を参考にwindows風のアレンジをしたところ自己解決しました!
ただしシステムを殺さなくてもよい方法などがないか模索したいです.

投稿2024/03/22 11:38

shupira

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

2回目以降のclient.runが途中で動作しなくなるということは、1回実行するとそれが動き続けていて2回目以降の動作に問題が出るということdす。
コードを見ても、ボットを止める仕組みが入っていないようです。

「python discord ボット 停止」などで検索すると、特定のメッセージを入れるとボットを停止するようなコードの例がいくつもみつかるので、それを参考に停止処理を入れてみるのがいいでしょう。

投稿2024/03/22 01:27

TakaiY

総合スコア12774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shupira

2024/03/22 03:24

回答ありがとうございます. 提示いただいたワードで調査したところ, await client.logout()やawait client.Logoff() というものを発見することができましたので試してみたいと思います.(公式リファレンスにそのような記載は私の力では発見できませんでした.) しかしながら,用法は間違っているものの, 公式リファレンスには await start(token, *, reconnect=True) Discordとの接続を閉じます。 というものが存在しており, 私の提示したコードの40行目に同等のものが存在します. 確かにawaitがない分動作は予期せぬものになるでしょうが,動作をctrl+Cで停止させた後はdiscord botは想定通りオフラインとなりました. また,windowsを再起動しても同等の現象が起きるため,動き続けているとは考えられにくいと思っております. どうしてそのような現象が発生するのでしょうか...? ※こちらの内容は編集で追記しておきます.
TakaiY

2024/03/22 04:38

Discordとの接続を閉じるのは、startでなくcloseなので書き間違えですよね。 何が起きているのかわからなくなりました。 そもそも、どういう問題が発生しているのですか? 「1度目のclient.run」と「2度目以降のclient.run」はどのように実行していますか? > 動作をctrl+Cで停止させた後はdiscord botは想定通りオフラインとなりました それはそうでしょう。 で、その後の動作はどのようになっていますか? > windowsを再起動しても同等の現象が起きる windowsを再起動した後どのようなことが起きるのですか。具体的に説明ください。 再起動後1回目でもだめということですか? 回答はここではなく、質問を編集して追記などしてください。
shupira

2024/03/22 10:27

返信ありがとうございます. 焦って回答してしまい,誤字や説明不足だらけな文となってしまい申し訳ございません. 返信された内容も含め,さらに追記いたします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問