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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

1919閲覧

【python】【discord.py】実行されたコマンドへの返信を、一定時間後に削除したい

Usaka_1

総合スコア14

Discord

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2023/03/09 16:55

編集2023/03/10 14:43

実現したいこと

・@bot.tree.commandというデコレータを使い、スラッシュコマンドを実装したい
・コマンドの実行があった場合、メッセージを返したい
・そのメッセージをX秒後に削除したい
・そのメッセージのIDを取得したい

前提

はじめたての初心者です。
discord.pyでbotを作っています。

・質問内容
質問内容は、[実現したいこと]の通りです。
以下のソースコードを実行しましたが、28行目が書けず困っています。

該当のソースコード

python

1import os 2from dotenv import load_dotenv 3import asyncio 4 5import discord 6from discord.ext import commands 7from discord import app_commands 8 9load_dotenv() 10token = os.getenv('DISCORD_BOT_TOKEN') 11 12bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) 13 14 15# コマンドの同期 16@bot.event 17async def on_ready(): 18 await bot.tree.sync() 19 print(f'{bot.user} is UP and READY') 20 21 22# ギルドコマンドとして登録 23@app_commands.guilds(discord.Object(id='サーバーid')) 24# 問題のコード 25@bot.tree.command(name="ping", description="pongと返します") 26async def ping(interaction: discord.Interaction): 27 await interaction.response.send_message('pong\nこのメッセージは5秒後に削除されます') # このメッセージのid入手したい 28 message = await interaction.channel.fetch_message() # ここが書けずに困っています 29 await asyncio.sleep(5) 30 await message.delete() 31 32 33bot.run(token) 34

検討したこと

①interaction.channel.last_message_idで直近のメッセージIDを取得し、これを削除する方法

または

➁interaction.channel.history()でメッセージIDを取得してこれを削除する方法

python

1@bot.tree.command(name="ping", description="pongと返します") 2async def ping(interaction: discord.Interaction): 3 await interaction.response.send_message('pong\nこのメッセージは5秒後に削除されます') 4 5 channel = interaction.channel 6 async for mes in channel.history(limit=30): 7 if mes.author == bot.user: 8 if f'{mes.content}' == 'pong\nこのメッセージは5秒後に削除されます': 9 mes_id = mes.id 10 break 11 12 message = await channel.fetch_message(mes_id) 13 await asyncio.sleep(5) 14 await message.delete()

この二つを考えましたが、遅延などにより取得するメッセージがズレてしまわないか心配しています。
(後者は異なるユーザーが、同一のメッセージIDを取得するケースを考えました)

そこで、より確実で簡潔な方法がないか探しています。
拙い質問ですが、よろしくお願いいたします。

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

Python 3.11.2
discord.py 2.2.2
powershellで実行しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

インタラクションに関するAPIリファレンスを見てみると、使えそうなAPIがいくつかありそうです。実現にはこちらを使ってみるのは如何でしょうか。

そのメッセージをX秒後に削除したい

send_message() には delete_after というパラメーターを含めることが可能(v2.1~)で、メッセージを送信してから削除するまでの待機時間を指定できるようです。

python

1await interaction.response.send_message( 2 content='pong\nこのメッセージは5秒後に削除されます', 3 delete_after=5 4)

そのメッセージのIDを取得したい

interaction で応答したメッセージを取得するには、 original_response() が使えると思います。これは返り値として InteractionMessage という型が返り、基本的には Message を継承しているので id を指定すれば取得できると思います。

python

1 message = await interaction.original_response() 2 mes_id = message.id

未テストなので動かないかもしれませんが参考のほどよろしくお願いします。
その他不明な点等があれば上記のAPIリファレンスをご確認ください。

投稿2023/03/10 00:51

XiFlashlight

総合スコア16

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

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

Usaka_1

2023/03/10 05:43

丁寧な回答ありがとうございます。 掲載していただいた方法で、削除とID取得のどちらも可能でした。 これからは、公式リファレンスを読み込む力をつけようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問