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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

833閲覧

Discord.pyでのTimeout context manager should be used inside a taskエラー

yoyuhihami

総合スコア26

Discord

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

Python 3.x

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

0グッド

0クリップ

投稿2023/08/25 02:14

編集2023/08/25 03:48

実現したいこと

  • discord.pyを使用してFlaskでのPOSTリクエストが来た時にその内容を指定したチャンネルに送信したい

すみません、送信自体はできていたのですが、Client.loop.create_new_task()ではイベントループの関係なのか実際に送信までに時間がかかります。

  • できればPOSTリクエストが来た際にタイムロスなくチャンネルに送信したいです。

前提

Discord.pyを使用してBotを作っていた際、「TimeOut Context manager Should be used inside a task.」エラーが出ます。

発生している問題・エラーメッセージ

[2023-08-25 02:03:22,148] ERROR in app: Exception on /api [POST] Traceback (most recent call last): File "/home/runner/discordbot/venv/lib/python3.8/site-packages/flask/app.py", line 2190, in wsgi_app response = self.full_dispatch_request() File "/home/runner/discordbot/venv/lib/python3.8/site-packages/flask/app.py", line 1486, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/runner/discordbot/venv/lib/python3.8/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/runner/discordbot/venv/lib/python3.8/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/runner/discordbot/venv/lib/python3.8/site-packages/asgiref/sync.py", line 277, in __call__ return call_result.result() File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/concurrent/futures/_base.py", line 437, in result return self.__get_result() File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/concurrent/futures/_base.py", line 389, in __get_result raise self._exception File "/home/runner/discordbot/venv/lib/python3.8/site-packages/asgiref/sync.py", line 353, in main_wrap result = await self.awaitable(*args, **kwargs) File "main.py", line 83, in api await send_log(data['chat_content']) File "main.py", line 121, in send_log await channel.send(embed=embed) File "/home/runner/discordbot/venv/lib/python3.8/site-packages/discord/abc.py", line 1562, in send data = await state.http.send_message(channel.id, params=params) File "/home/runner/discordbot/venv/lib/python3.8/site-packages/discord/http.py", line 625, in request async with self.__session.request(method, url, **kwargs) as response: File "/home/runner/discordbot/venv/lib/python3.8/site-packages/aiohttp/client.py", line 1117, in __aenter__ self._resp = await self._coro File "/home/runner/discordbot/venv/lib/python3.8/site-packages/aiohttp/client.py", line 448, in _request with timer: File "/home/runner/discordbot/venv/lib/python3.8/site-packages/aiohttp/helpers.py", line 635, in __enter__ raise RuntimeError( RuntimeError: Timeout context manager should be used inside a task

該当のソースコード

python

1@app.route('/api', methods=['POST']) 2async def api(): 3 try: 4 data = json.loads(request.data) 5 if(data['API_TOKEN'] == os.environ["SERV_API_TOKEN"]): 6 await send_log(data['chat_content']) 7 return "{'status':'complete'}", 200 8 else: 9 return "{'Error':'Access Denied'}", 403 10 except KeyError as e: 11 return "{'Error':'Invaild Request Format'}", 400 12 13async def send_log(chat_content): 14 jst_tz = pytz.timezone('Asia/Tokyo') 15 current_time = datetime.datetime.utcnow().astimezone(jst_tz).strftime("%Y-%m-%d %H:%M:%S") 16 channel = client.get_channel(xxxxxxxxxxxxxxxxxxx) 17 embed = discord.Embed(title='', color=0x1e90ff, description='') 18 embed.set_footer(text=current_time) 19 embed.add_field(name='', value=f'{chat_content}') 20 await channel.send(embed=embed)

試したこと

python

1client.loop.create_new_task(send_log())

ではなぜかうまくいきました、が、このコードだと実際にチャンネルに送信されるまでに時間がかかります

補足情報(FW/ツールのバージョンなど)

replitでホスト
python 3.8

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

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

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

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

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

yoyuhihami

2023/08/25 03:44

申し訳ありません、修正しました。
guest

回答1

0

自己解決

asyncio.run_coroutine_threadsafe()を使用すれば大丈夫でした。

python

1import asyncio 2import discord 3intent = discord.Intents.all() 4client = discord.Client(intents=intent) 5# 中略 6asyncio.run_coroutine_threadsafe(send_log(data['chat_content']), client.loop)

で遅延なくメッセージ送信を行うことができました。

投稿2023/08/25 09:45

yoyuhihami

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問