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

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

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

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

Q&A

解決済

2回答

2991閲覧

AttributeError: 'CallbackContext' object has no attribute 'message'

salah0615

総合スコア49

Python

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

0グッド

0クリップ

投稿2021/04/22 11:30

編集2021/04/27 15:24

telegamについて

telegram_github

こちらにtelegramのpythonライブラリを載せました。

使用しているバージョンは
telegram: 2.7.1
python: 3.7.5
です。

python3 *.pyを実行し、telegramでbotに対して、/start と入力すると下記のようなエラーが発生します。

No error handlers are registered, logging exception.
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/telegram/ext/dispatcher.py", line 442, in process_update
handler.handle_update(update, self, check, context)
File "/usr/local/lib/python3.7/site-packages/telegram/ext/handler.py", line 160, in handle_update
return self.callback(update, context)
File "/Users/tanakakoutarou/Projects/dsbook/telegram_bot.py", line 13, in start
input = {'utt': None, 'sessionId': str(update.message.from_user.id)}
AttributeError: 'CallbackContext' object has no attribute 'message'

このCallbackContextがmessageを持っていない、というのは、
おそらくcallbackcontext.pyのCallbackContextクラスにmessageが定義されていないということだと思うのですが、どのようにmessageを実装したら良いのでしょうか。
そもそも問題はそこなのでしょうか。
コード自体が難解で、あまりpythonにも慣れていないのですが、まずは色々な対話システムを実行してみたいので
解決方法がわかる方よろしくお願いいたします。

下記は入力した文字をそのまま返す対話システムです。(例)

python3

1#telegram_bot.py 2 3 4from telegram.ext import Updater, CommandHandler, MessageHandler, Filters 5 6# アクセストークン(先ほど発行されたアクセストークンに書き換えてください) 7TOKEN = " " 8 9 10class TelegramBot: 11 def __init__(self, system): 12 self.system = system 13 14 def start(self, bot, update): 15 # 辞書型 inputにユーザIDを設定 16 input = {'utt': None, 'sessionId': str(update.message.from_user.id)} 17 18 # システムからの最初の発話をinitial_messageから取得し,送信 19 update.message.reply_text(self.system.initial_message(input)["utt"]) 20 21 def message(self, bot, update): 22 # 辞書型 inputにユーザからの発話とユーザIDを設定 23 input = {'utt': update.message.text, 'sessionId': str(update.message.from_user.id)} 24 25 # replyメソッドによりinputから発話を生成 26 system_output = self.system.reply(input) 27 28 # 発話を送信 29 update.message.reply_text(system_output["utt"]) 30 31 def run(self): 32 updater = Updater(TOKEN) 33 dp = updater.dispatcher 34 dp.add_handler(CommandHandler("start", self.start)) 35 dp.add_handler(MessageHandler(Filters.text, self.message)) 36 updater.start_polling() 37 updater.idle() 38 39

python3

1#echo_system.py 2 3 4from telegram.ext import Updater, CommandHandler, MessageHandler, Filters 5from telegram_bot import TelegramBot 6 7# ユーザの入力をそのまま返す対話システム. 8class EchoSystem: 9 def __init__(self): 10 pass 11 12 def initial_message(self, input): 13 return {'utt': 'こんにちは。対話を始めましょう。', 'end':False} 14 15 def reply(self, input): 16 return {"utt": input['utt'], "end": False} 17 18 19if __name__ == '__main__': 20 system = EchoSystem() 21 bot = TelegramBot(system) 22 bot.run() 23 24

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

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

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

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

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

BeatStar

2021/04/24 08:33

メッセージぐらいは読みましょう。
guest

回答2

0

ベストアンサー

これ

Python

1def start(self, bot, update):

Python

1def start(self, update, bot):

ですね。サンプルが間違っています。これを理解するにはコールバックという概念を理解する必要があります。

Python

1 dp.add_handler(CommandHandler("start", self.start))

self.start を渡していますが、これがコールバック関数と呼ばれるもので、"start" コマンドのときこれを実行してね、と渡しています。関数ですから引数が必要になります。ここでドキュメントcallback という箇所を見ると

Python

1def callback(update: Update, context: CallbackContext)

という形で呼ばれますよ、と書いています(self がないのはまた別の話)。試してませんが、これで動いたらサンプルに Pull Request でも送りましょう。そしてサンプル作成者をはっ倒しましょう。

投稿2021/04/30 02:16

A_kirisaki

総合スコア2853

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

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

salah0615

2021/05/01 03:36

無事にエラーなく動作しました! 本当にありがとうございます。 このドキュメントは今後も参考にしたいと思います。 本当に助かりました!
guest

0

メッセージぐらいは読みましょう。

メッセージは怒声でも暴言でもないです。
コンパイラやインタプリタからのメッセージ』です。

Pythonなのでインタプリタでしょうか。

No error handlers are registered, logging exception. Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/telegram/ext/dispatcher.py", line 442, in process_update handler.handle_update(update, self, check, context) File "/usr/local/lib/python3.7/site-packages/telegram/ext/handler.py", line 160, in handle_update return self.callback(update, context) File "/Users/tanakakoutarou/Projects/dsbook/telegram_bot.py", line 13, in start input = {'utt': None, 'sessionId': str(update.message.from_user.id)} AttributeError: 'CallbackContext' object has no attribute 'message'
[訳] 例外が飛んできたが、エラーハンドリングできずにいる…… トレースバック (最近呼ばれたもの): (略)/dispatcher.py の 442行目。 (中略) アトリビュートエラー: "CallbackContext" オブジェクトには "message"というメンバは持っていない

つまり、例外ですね。

今回の場合、『存在しないはずのメンバを使おうとしている』ことが原因。

あるいは、『単なるタイポ(= スペルミス)』でしょうか。

使っているオブジェクト名やメソッド、フィールド、プロパティ等々のスペルを確認し、
ちゃんと存在するものなのかを公式リファレンス等で調べましょう。


[追記0]

もし自作クラスとかならそのクラスのメソッド等を確認しましょう。

投稿2021/04/24 08:40

編集2021/04/24 08:41
BeatStar

総合スコア4962

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

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

salah0615

2021/04/27 15:34

すみません、質問があまりにも抽象的でした。 メッセージはもちろん読みまして、書いてあることもなんとなくは解るのですが、実際にどのように解決したらいいのかわかりません。 また、これらのコードは https://github.com/dsbook/dsbook から持ってきたものであり、特に変更等はしておりません。 もしよろしければ、質問の方を編集しましたので回答いただけたらと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問