🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Discord

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

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

3247閲覧

discord bot でランダムに画像を選んで送れるようにしたい

jun12

総合スコア5

Discord

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

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/12/25 15:03

編集2020/12/25 18:44

前提・実現したいこと

Discord bot でランダムに画像を選択して送れるようにしたい。

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

Ignoring exception in on_message Traceback (most recent call last): File "C:\Users\〇〇\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\client.py", line 333, in _run_event await coro(*args, **kwargs) File "C:\Users\〇〇\AppData\Local\Programs\Python\Python39\cocoabot\cocoabot.py", line 38, in on_message await message.channel.send(random.choice(file=file)) TypeError: choice() got an unexpected keyword argument 'file'

該当のソースコード

Python

1import discord 2 3import random 4 5from discord import channel 6 7TOKEN = ----------------------------------- 8 9CHANNEL_ID = -------------------------------- 10 11client = discord.Client() 12 13@client.event 14async def on_ready(): 15 16 print('ログインしました') 17 print(client.user.name) 18 print(client.user.id) 19 print('________') 20 21 22@client.event 23async def on_message(message): 24 25 if message.author.bot: 26 return 27 28 if message.content == 'おはよう': 29 await message.channel.send('おっはよ~!') 30 31 32 if message.content == '暇': 33 await message.channel.send('どうしたの?') 34 35 if message.content == '〇〇': 36 file = discord.File("〇〇.png",filename="〇〇1.png") 37 file = discord.File("〇〇.png",filename="〇〇2.png") 38 await message.channel.send(random.choice(file=file)) 39#"""新規メンバー参加時に実行されるイベントハンドラ""" 40@client.event 41async def on_member_join(member): 42 await member.send('よろしく~!') 43 44#bot起動時に行うイベント 45async def greet(): 46 channel = client.get_channel(CHANNEL_ID) 47 await channel.send('みんな~!おっはよ~!') 48 49@client.event 50async def on_ready(): 51 await greet() 52 53client.run (TOKEN)

試したこと

別途の質問をした際に教えて貰った事と、ネットで調べたことを試しました!(random.choiceの使い方)

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

Python 3.9.1
VScode

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

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

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

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

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

guest

回答2

0

数点、大きな誤りがあります。

  1. random.choiceはリストから要素を一つランダムに選択するものですから引数はリストになります.

random.choice(file=file)は誤りです。
第一引数として単純にリストを渡して下さい。
0. 逆にchannel.senでファイルを送信する時はfile=としてファイルオブジェクトを渡して下さい。
0. file = discord.File("〇〇.png",filename="〇〇1.png")のようなかたちでファイルを2回代入していますが、これはそもそもリストにはなっていません。
また、単純に変数に代入するつもりだとしてもfileという変数の値が最後に代入した値になるだけで意味のないコードとなります。

投稿2020/12/25 20:35

udon-ken

総合スコア657

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

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

jun12

2020/12/26 05:13

ありがとうございます! 2.の"file =“でやるとしたら、 "file = (“パス名01","パス名02") await message.channel.send(file)" でしょうか? すいません、今出先で試せなくて…
udon-ken

2020/12/26 08:45

えーと・・・分かってない事が複数ありそうなので・・・全部同時には無理だと思います。 上の、1,2,3はどれでやるというのではなく、全部修正する必要があります。 まず、最初はリストのリストの概念から理解しましょう。 とりあえず、 https://www.javadrive.jp/python/list/index1.html これあたりですかね。 まず、ファイルオブジェクトを複数格納したリストを作るのが先決です。 リストになってないデータはどうやってもrandom.choiceで選択する事はできませんので。 もっと手前の段階、1つの画像を出力するのは過去質問を見ると解決してそうなので、大丈夫と考えた上の回答です。
jun12

2020/12/26 14:05

ありがとうございます! サイト拝見させていただきました。" file=["パス名"","パス名"] " でリストが作成されるって事でしょうか? ここからランダムにするには"await message.channel.send"の後にrandomでしょうか? それとも前の段階でするのでしょうか?
jun12

2020/12/26 17:57

リストを作ってランダムに送信見たいなのは出来たのですが、テキストで帰ってきます、、、 discord.File を使用しようとするとエラーが出てしまい、、、 ソースコード↓ "if message.content == '〇〇': file = ["パス名","パス名"] file2 = random.choice(file) await message.channel.send(file2)"
udon-ken

2020/12/27 00:10

file = ["パス名","パス名"] fileはこの時点でちゃんとリストになっています。要素が2つ、中身は単なる文字列です(書いたままの文字) ※ リストは複数の要素を格納するものですから、複数形の名称を付けた方が後々の混乱を防げます。 単なる名前なのでプログラム的には何でも構いませんが一般的にはfilesのような命名をする事が多いです file2 = random.choice(file) ここで、file2という変数に格納されるのは、2つの文字列から1つを選択したものですから、当然文字列です。 await message.channel.send(file2)" それを踏まえると、これは await message.channel.send('path\hoge.jpeg') のように記述しているのと同じ事なので当然エラーになります。 ここまで理解できれば、これまでの知識との組み合わせで解決できませんでしょうか?
jun12

2020/12/27 13:44

ありがとうございます! "discord.File"を使うんでしょうけど、エラーが出てしまうんですよね、、、 discord上のファイル名ってのは、一つの画像を送信できるようにするやつと同じく1つ1つのファイルやるのでしょうか。。? すいません<(_ _)>
guest

0

ベストアンサー

python

1file_names = ["パス名", "パス名"] 2file_name = random.choice(file_names) 3file_obj = discord.File(file_name) 4await message.channel.send(file=file_obj)

いろいろまとめて書く方法はありますが、基本的にはこうなります。
この4行、基本中の基本ですので、これをしっかり理解する必要がありますし、理解すればもう少しまとめて書く事ができます。

投稿2020/12/27 17:17

udon-ken

総合スコア657

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

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

jun12

2020/12/27 17:23

ありがとうございます!! なるはど、、今まで"file1"と"file2"の二つだけでやっていて、4行目の所も"file2"を使ってました… 本当にありがとうございます! 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問