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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

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

Q&A

1回答

1647閲覧

discordbotのコード

ficorajo

総合スコア6

Python 3.x

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

0グッド

1クリップ

投稿2019/07/25 09:58

編集2019/07/28 09:31

discordのbotで天気をlivedoorから取得しようとしたら

コード

import

1import urllib.request 2import json 3import re 4CHANNEL_ID = 602723871522553871 5client = discord.Client() 6citycodes = { 7 "東京": 130010, 8 "大阪": 270000, 9 "神戸": 280010, 10 "京都": 260010, 11 "大津": 250010, 12 "奈良": 290010, 13} 14 15@client.event 16async def on_ready(): 17 print('login done') 18 19@client.event 20async def on_message(message): 21 if message.author != client.user: 22 23 reg_res = re.compile(u'Bot君、(.+)の天気は?').search(message.content) 24 if reg_res: 25 26 if reg_res.group(1) in citycodes.keys(): 27 28 citycode = citycodes[reg_res.group(1)] 29 resp = urllib.request.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read() 30 resp = json.loads(resp.decode('utf-8')) 31 32 msg = resp['location']['city'] 33 msg += "の天気は、/n" 34 for f in resp['forecasts']: 35 msg += f['dateLabel'] + 'が' + f['telop'] + '\n' 36 msg += 'です。' 37 38 await channel.send(message.author.mention + msg) 39 40 else: 41 await channel.send('なにそんな過疎地知らないよ^^') 42 43 44client.run("")``` 45 46#内容 47エラーは吐かないのですが、hiには反応するのにBot君、どこか(大阪とかすべて)の天気は?と聞いても反応しません。そして、場所に違うものを入れても、反応しません。ですので、コードの問題だと思うのですが、調べてもわからなかったのでここにあげました。回答していただけると嬉しいです。 48 49#エラー 50ご指摘ありがとうございます。エラーが出ないことは解決しましたが、エラーの解決方法がわかりません。 51エラーはこれです 52 53![イメージ説明](a5d5480f618c6b042fc8cb1e62f1b21c.png) 54![イメージ説明](659626dab5ff3f5428826e0e4fdfa888.png) 55![イメージ説明](937b32bbd401d4e6c8c1b507c1f0c16b.png)

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

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

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

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

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

suama

2019/07/26 00:08

こんにちは。可能でしたらソースコードは ``` でくくっていただけると見やすくて助かります。 きになるところを回答に添えておきますね。
guest

回答1

0

こんにちは。
Pythonだとインデントが重要なので、できればコードの投稿の仕方を参考にして貼り付けてくださいませ。

そのうえで、動かしていないのでちょっと確実とは言えないのですが、

def on_message(message) の処理が2つ書かれていますよね。

読み込みの順場で、後からの def on_message(message)のほうで上書きされてしまうと思います。
なので、hiの呼びかけには答えますがお天気の処理は頑張ってコードを書いていてもスルーされてしまうのではと...。

いったん後からの def on_message(message)のほうを#をつけてコメントアウトして実行すると、どうなるでしょうか?

def on_message(message)の部分で条件分岐をさせる感じでやってくとのかなあと思います。
こちらの記事を参考に...。
https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f

20190727追記:

コメントにも記載しましたが、回答に添えておきます。

キャプチャありがとうござます。重ねてお願いですが、ソースコードはと囲んだ形で貼り付けていいただけないでしょうか?
上記だと、「インデントが崩れているのでエラーにしかなりません」としか言えなくなってしまうので。
質問の際のテンプレートに出てきように記載してください。
アドバイスが難しくなってしまうので、今回のみ。

さて、一番シンプルなDiscordに接続するプログラムを書いてみて、そこから広げていくといいと思います。

最初に書かれていた、エラーは吐かないのですが、hiには反応するのに というのは、Discord上ではメッセージを返してくれていたということですよね。
このときは、メッセージを送信するのは message.channel.send(...) になっていたはずです。

上記のキャプチャだと、 Messageable.send(...) になっています。
エラーメッセージをみると、 「 Messageableなんて知らないよ!」と言われています。

もう一点、画面のエラーメッセーですが、"Unable to import discord" と表示されているので、そもそもDiscord用のライブラリが読めていますでしょうか?
なにか修正したり試したため、このエラーが出てくる様になったのであれば、まずはここを確認で。

その上で、Messageable.send(...) じゃなくて、message.channel.send(送信したい内容) ではないでしょうか?

投稿2019/07/26 00:15

編集2019/07/26 21:57
suama

総合スコア1997

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

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

ficorajo

2019/07/26 03:00

ご指摘ありがとうございます。ご指摘の通りにすると、エラーをちゃんと吐いてくれました。エラーを加筆したので、それについてもお教え願いませんでしょうか。
suama

2019/07/26 21:44

キャプチャありがとうござます。重ねてお願いですが、ソースコードは ``` .... ``` と囲んだ形で貼り付けていいただけないでしょうか? 上記だと、「インデントが崩れているのでエラーにしかなりません」としか言えなくなってしまうので。 さて、一番シンプルなDiscordに接続するプログラムを書いてみて、そこから広げていくといいと思うのですが、最初に書かれていた、 "エラーは吐かないのですが、hiには反応するのに" というのは、Discord上ではメッセージを返してくれていたということですよね。 このときは、メッセージを送信するのは message.channel.send(...) になっていたはずです。 上記のキャプチャだと、 Messageable.send(...) になっています。 エラーメッセージをみると、 「 Messageableなんて知らないよ!」と言われていますね。 もう一点、画面のエラーメッセーですが、"Unable to import discord" と表示されているので、そもそもDiscord用のライブラリが読めていますでしょうか? 編集されていたのであれば、まずはここを確認で。 その上で、Messageable.send(...) じゃなくて、message.channel.send(送信したい内容) ではないでしょうか?
ficorajo

2019/07/28 09:33

最後のを変更すると、問題のほうは消えたのですが、 Traceback (most recent call last): File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\site-packages\discord\client.py", line 270, in _run_event await coro(*args, **kwargs) File "discordbot.py", line 39, in on_message await message.channel.send(message.channel,message.author.mention + msg) TypeError: send() takes from 1 to 2 positional arguments but 3 were given と、また新たなエラーが出ました。そして、await coro()あたりのエラーの理由がわからないのですが、お教えいただけますでしょうか
suama

2019/07/29 03:12

現時点のソースがわからないので、助けようがないので、すみません。 (最初に質問をした時点から変わってますよね?) とにかくエラーメッセージを読んで見てくださいね。 File "discordbot.py", line 39, in on_messageとあるので、とにかく39行目を見ること。 で、エラーは英語ですけど、「send() メソッドにわたす引数の数が違ってます!3個渡ってきてるけど1個か2個だよ!」と言われているだけですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問