async await - forループで複数のメッセージを送信するdiscord Pythonボット

okwaves2024-01-25  9

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 分

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。