質問編集履歴
3
詳細を記載
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
[telegram_github](https://github.com/kotarotanaka0123/telegram)
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
こちらにtelegramのpythonライブラリを載せました。
|
10
|
+
|
11
|
+
|
12
|
+
|
5
13
|
使用しているバージョンは
|
6
14
|
|
7
15
|
telegram: 2.7.1
|
@@ -38,140 +46,156 @@
|
|
38
46
|
|
39
47
|
|
40
48
|
|
49
|
+
このCallbackContextがmessageを持っていない、というのは、
|
50
|
+
|
51
|
+
おそらくcallbackcontext.pyのCallbackContextクラスにmessageが定義されていないということだと思うのですが、どのようにmessageを実装したら良いのでしょうか。
|
52
|
+
|
53
|
+
そもそも問題はそこなのでしょうか。
|
54
|
+
|
55
|
+
コード自体が難解で、あまりpythonにも慣れていないのですが、まずは色々な対話システムを実行してみたいので
|
56
|
+
|
41
|
-
|
57
|
+
解決方法がわかる方よろしくお願いいたします。
|
42
|
-
|
43
|
-
|
44
|
-
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
45
|
-
|
63
|
+
下記は入力した文字をそのまま返す対話システムです。(例)
|
46
|
-
|
64
|
+
|
65
|
+
|
66
|
+
|
47
|
-
```python
|
67
|
+
```python3
|
48
|
-
|
68
|
+
|
49
|
-
#
|
69
|
+
#telegram_bot.py
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
70
|
+
|
54
|
-
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
55
|
-
|
75
|
+
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
|
76
|
+
|
77
|
+
|
78
|
+
|
56
|
-
|
79
|
+
# アクセストークン(先ほど発行されたアクセストークンに書き換えてください)
|
80
|
+
|
81
|
+
TOKEN = " "
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
class TelegramBot:
|
88
|
+
|
89
|
+
def __init__(self, system):
|
90
|
+
|
91
|
+
self.system = system
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
def start(self, bot, update):
|
96
|
+
|
97
|
+
# 辞書型 inputにユーザIDを設定
|
98
|
+
|
99
|
+
input = {'utt': None, 'sessionId': str(update.message.from_user.id)}
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
# システムからの最初の発話をinitial_messageから取得し,送信
|
104
|
+
|
105
|
+
update.message.reply_text(self.system.initial_message(input)["utt"])
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
def message(self, bot, update):
|
110
|
+
|
111
|
+
# 辞書型 inputにユーザからの発話とユーザIDを設定
|
112
|
+
|
113
|
+
input = {'utt': update.message.text, 'sessionId': str(update.message.from_user.id)}
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
# replyメソッドによりinputから発話を生成
|
118
|
+
|
119
|
+
system_output = self.system.reply(input)
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
# 発話を送信
|
124
|
+
|
125
|
+
update.message.reply_text(system_output["utt"])
|
126
|
+
|
127
|
+
|
128
|
+
|
57
|
-
|
129
|
+
def run(self):
|
130
|
+
|
58
|
-
|
131
|
+
updater = Updater(TOKEN)
|
132
|
+
|
133
|
+
dp = updater.dispatcher
|
134
|
+
|
135
|
+
dp.add_handler(CommandHandler("start", self.start))
|
136
|
+
|
59
|
-
|
137
|
+
dp.add_handler(MessageHandler(Filters.text, self.message))
|
60
|
-
|
138
|
+
|
61
|
-
|
139
|
+
updater.start_polling()
|
140
|
+
|
141
|
+
updater.idle()
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
|
62
146
|
|
63
147
|
```
|
64
148
|
|
65
149
|
|
66
150
|
|
67
|
-
```python
|
151
|
+
```python3
|
68
|
-
|
152
|
+
|
69
|
-
#
|
153
|
+
#echo_system.py
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
|
158
|
+
|
70
|
-
|
159
|
+
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
|
160
|
+
|
71
|
-
|
161
|
+
from telegram_bot import TelegramBot
|
162
|
+
|
163
|
+
|
164
|
+
|
72
|
-
|
165
|
+
# ユーザの入力をそのまま返す対話システム.
|
166
|
+
|
167
|
+
class EchoSystem:
|
168
|
+
|
169
|
+
def __init__(self):
|
170
|
+
|
171
|
+
pass
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
def initial_message(self, input):
|
176
|
+
|
177
|
+
return {'utt': 'こんにちは。対話を始めましょう。', 'end':False}
|
178
|
+
|
179
|
+
|
180
|
+
|
73
|
-
f
|
181
|
+
def reply(self, input):
|
74
|
-
|
75
|
-
|
182
|
+
|
76
|
-
|
77
|
-
for handler in self.handlers[group]:
|
78
|
-
|
79
|
-
check = handler.check_update(update)
|
80
|
-
|
81
|
-
|
183
|
+
return {"utt": input['utt'], "end": False}
|
82
|
-
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
|
83
|
-
|
189
|
+
if __name__ == '__main__':
|
84
|
-
|
85
|
-
|
190
|
+
|
86
|
-
|
87
|
-
|
191
|
+
system = EchoSystem()
|
88
|
-
|
192
|
+
|
89
|
-
|
193
|
+
bot = TelegramBot(system)
|
90
|
-
|
91
|
-
|
194
|
+
|
92
|
-
|
93
|
-
|
195
|
+
bot.run()
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
|
94
200
|
|
95
201
|
```
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
```python
|
100
|
-
|
101
|
-
#telegram_bot.py
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
# アクセストークン(先ほど発行されたアクセストークンに書き換えてください)
|
112
|
-
|
113
|
-
TOKEN = "ーーーーーーーーーー"
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
class TelegramBot:
|
120
|
-
|
121
|
-
def __init__(self, system):
|
122
|
-
|
123
|
-
self.system = system
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
def start(self, bot, update):
|
128
|
-
|
129
|
-
# 辞書型 inputにユーザIDを設定
|
130
|
-
|
131
|
-
input = {'utt': None, 'sessionId': str(update.message.from_user.id)}
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
# システムからの最初の発話をinitial_messageから取得し,送信
|
136
|
-
|
137
|
-
update.message.reply_text(self.system.initial_message(input)["utt"])
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
def message(self, bot, update):
|
142
|
-
|
143
|
-
# 辞書型 inputにユーザからの発話とユーザIDを設定
|
144
|
-
|
145
|
-
input = {'utt': update.message.text, 'sessionId': str(update.message.from_user.id)}
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
# replyメソッドによりinputから発話を生成
|
150
|
-
|
151
|
-
system_output = self.system.reply(input)
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
# 発話を送信
|
156
|
-
|
157
|
-
update.message.reply_text(system_output["utt"])
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
def run(self):
|
162
|
-
|
163
|
-
updater = Updater(TOKEN)
|
164
|
-
|
165
|
-
dp = updater.dispatcher
|
166
|
-
|
167
|
-
dp.add_handler(CommandHandler("start", self.start))
|
168
|
-
|
169
|
-
dp.add_handler(MessageHandler(Filters.text, self.message))
|
170
|
-
|
171
|
-
updater.start_polling()
|
172
|
-
|
173
|
-
updater.idle()
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
```
|
2
tokenを隠した
test
CHANGED
File without changes
|
test
CHANGED
@@ -5,6 +5,8 @@
|
|
5
5
|
使用しているバージョンは
|
6
6
|
|
7
7
|
telegram: 2.7.1
|
8
|
+
|
9
|
+
python: 3.7.5
|
8
10
|
|
9
11
|
です。
|
10
12
|
|
@@ -108,7 +110,7 @@
|
|
108
110
|
|
109
111
|
# アクセストークン(先ほど発行されたアクセストークンに書き換えてください)
|
110
112
|
|
111
|
-
TOKEN = "
|
113
|
+
TOKEN = "ーーーーーーーーーー"
|
112
114
|
|
113
115
|
|
114
116
|
|
1
内容が不十分の状態で投稿されてしまったので、再度記載しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
python3 *.pyを実行し、telegramでbotに対して、/start と入力すると下記のような
|
15
|
+
python3 *.pyを実行し、telegramでbotに対して、/start と入力すると下記のようなエラーが発生します。
|
16
16
|
|
17
17
|
|
18
18
|
|
@@ -33,3 +33,143 @@
|
|
33
33
|
input = {'utt': None, 'sessionId': str(update.message.from_user.id)}
|
34
34
|
|
35
35
|
AttributeError: 'CallbackContext' object has no attribute 'message'
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
なぜでしょうか? 丸投げのような形になりますが、解決方法がわかる方よろしくお願いします。
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
一応、エラーの箇所だけコードを記載しておきます。
|
44
|
+
|
45
|
+
```python
|
46
|
+
|
47
|
+
#handler.py
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
if context:
|
52
|
+
|
53
|
+
self.collect_additional_context(context, update, dispatcher, check_result)
|
54
|
+
|
55
|
+
if run_async:
|
56
|
+
|
57
|
+
return dispatcher.run_async(self.callback, update, context, update=update)
|
58
|
+
|
59
|
+
return self.callback(update, context)
|
60
|
+
|
61
|
+
```
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
```python
|
66
|
+
|
67
|
+
#dispatcher.py
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
for group in self.groups:
|
72
|
+
|
73
|
+
try:
|
74
|
+
|
75
|
+
for handler in self.handlers[group]:
|
76
|
+
|
77
|
+
check = handler.check_update(update)
|
78
|
+
|
79
|
+
if check is not None and check is not False:
|
80
|
+
|
81
|
+
if not context and self.use_context:
|
82
|
+
|
83
|
+
context = CallbackContext.from_update(update, self)
|
84
|
+
|
85
|
+
handled = True
|
86
|
+
|
87
|
+
sync_modes.append(handler.run_async)
|
88
|
+
|
89
|
+
handler.handle_update(update, self, check, context)
|
90
|
+
|
91
|
+
break
|
92
|
+
|
93
|
+
```
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
```python
|
98
|
+
|
99
|
+
#telegram_bot.py
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
# アクセストークン(先ほど発行されたアクセストークンに書き換えてください)
|
110
|
+
|
111
|
+
TOKEN = "1704029777:AAEn-j1xI_Mlx_Cs1KuHtre4XBnZpN_2QJQ"
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
class TelegramBot:
|
118
|
+
|
119
|
+
def __init__(self, system):
|
120
|
+
|
121
|
+
self.system = system
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
def start(self, bot, update):
|
126
|
+
|
127
|
+
# 辞書型 inputにユーザIDを設定
|
128
|
+
|
129
|
+
input = {'utt': None, 'sessionId': str(update.message.from_user.id)}
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
# システムからの最初の発話をinitial_messageから取得し,送信
|
134
|
+
|
135
|
+
update.message.reply_text(self.system.initial_message(input)["utt"])
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
def message(self, bot, update):
|
140
|
+
|
141
|
+
# 辞書型 inputにユーザからの発話とユーザIDを設定
|
142
|
+
|
143
|
+
input = {'utt': update.message.text, 'sessionId': str(update.message.from_user.id)}
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
# replyメソッドによりinputから発話を生成
|
148
|
+
|
149
|
+
system_output = self.system.reply(input)
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
# 発話を送信
|
154
|
+
|
155
|
+
update.message.reply_text(system_output["utt"])
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
def run(self):
|
160
|
+
|
161
|
+
updater = Updater(TOKEN)
|
162
|
+
|
163
|
+
dp = updater.dispatcher
|
164
|
+
|
165
|
+
dp.add_handler(CommandHandler("start", self.start))
|
166
|
+
|
167
|
+
dp.add_handler(MessageHandler(Filters.text, self.message))
|
168
|
+
|
169
|
+
updater.start_polling()
|
170
|
+
|
171
|
+
updater.idle()
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
```
|