実現したいこと
-
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
申し訳ありません、修正しました。

回答1件
あなたの回答
tips
プレビュー