discord.py の for ループでいくつかのメッセージを送信したい配列があります。 on_ready() コマンドを使用しようとしていますが、最初のメッセージしか送信できないという問題が発生しています。私は非同期ボットと Discord ボットの両方についてかなり初心者です。もっと簡単な解決策があるはずです...
client = discord.Client()
links = []
for x in y:
# do some things
links.append(stuff)
@client.event
async def on_ready():
channel = client.get_channel(12345678910)
for link in links:
await channel.send(link)
client.run(DISCORD_TOKEN)
事前にご協力いただきありがとうございます。
配列がどのようなものであるかの例を教えていただけますか?
– ジャワド
2020 年 9 月 3 日 21:54
これらは単なる URL 文字列の集まりです。 ['google.com'、'amazon.com'、'facebook.com']
– モジョ713
2020 年 9 月 3 日 22:01
ボットの準備ができたら、それらをチャンネルに送信したいですか?
– ジャワド
2020 年 9 月 3 日 22:02
正解です。チャネルに 1 つずつダンプするだけです。
– モジョ713
2020 年 9 月 3 日 22:04
------------------------
on_ready() イベントの下にコードを追加する代わりに、ボットの準備ができたら 1 回実行して停止するループを作成できます。ループを作成するには、discord.ext.tasks を使用します。
from discord.ext.tasks import loop
@loop(count=1)
async def send_links():
channel = client.get_channel(730064641857683581)
links = ['link1', 'link2', 'link3', 'link4']
for link in links:
await channel.send(link)
@send_links.before_loop
async def before_send_links():
await client.wait_until_ready() # Wait until bot is ready.
@send_links.after_loop
async def after_send_links():
await client.logout() # Make the bot log out.
send_links.start()
client.run(DISCORD_TOKEN)
6
最後の質問です。プログラムがタスクの完了後にハングしているようです。実行後に閉じる方法。 client.logout() が動きのようですが、どこへ行くのかはわかりません
– モジョ713
2020 年 9 月 3 日 22:19
ハングアップとはどういう意味ですか?
– ジャワド
2020 年 9 月 3 日 22:25
リンクを投稿した後もプログラムは終了しません。これを cron で実行したいので、大量のプロセスがハングすることは望ましくありません。
– モジョ713
2020 年 9 月 3 日 22:26
ボットにリンクを投稿してからログアウトさせますか?
– ジャワド
2020 年 9 月 3 日 22:30
美しい。どうもありがとうございます! (ちょっと恥ずかしいのですが、その部分が理解できませんでした:P)
– モジョ713
2020 年 9 月 3 日 22:38
------------------------
最初に、 client = discord.Client() はクライアントを定義するのにはまったく適していません。
を使用してクライアントを定義する必要があります。
client = Commands.Bot(command_prefix='ここにコマンドのプレフィックス')。これをコマンドにしたい場合は、次のようにすることができます。
@client.command()
async def send_link(ctx):
for link in links:
await ctx.send(link)
しかし、あまりにも多くのメッセージが送信されるため、それは良くありません。そのため、埋め込みを使用したいと思います。
async def send_link(ctx):
embed = discord.Embed()
for link in links:
embed.add_field(name=" ", value=link, inline=False)
await ctx.send(embed=embed)
あなたはそれを達成すべきではありませんon_message には意味がないので。コードでは、channel = client.get_channel(1234667890) を実行しました。これも問題です。実際のチャンネル ID に変更する必要があります。
6
ご協力いただきありがとうございます。いくつかの変更に取り組んでいます。実際のコードには正しい ID があります。私がやろうとしていることの一部は、cron で実行する予定であるため、メッセージのプロンプトを表示しないことです。
– モジョ713
2020 年 9 月 3 日 21:59
ctx は何を表しますか?また、send_link 関数は client.run(DISCORD_TOKEN) で呼び出されますか?
– モジョ713
2020 年 9 月 3 日 22:02
API リファレンスなどのドキュメントを読む必要があります。 send_link は、.send_link のように、チャットで prefix + send_link を入力すると実行されるコマンドです。 Ctx は、メッセージが送信されたチャネルを取得し、そのチャネルでメッセージを送信しています。したがって、これらのコードでは、commands.Bot で command_prefix を定義する場合は、「prefi」と入力します。ギルド内で x + send_link を実行すると、配列データが送信されます。
– Nurqm
2020 年 9 月 3 日 22:07
それは当然ですが、プロンプトを表示せずに送信させようとしています。この種の例はドキュメント内で見つからないようです。
– モジョ713
2020 年 9 月 3 日 22:12
一度だけ送信しますか?
– Nウルクム
2020 年 9 月 3 日午後 10 時 15 分