回答編集履歴

2

文章を修正

2018/01/15 08:48

投稿

Udomomo
Udomomo

スコア1524

test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  このとき、最初にいきなり「男」と入力しても、占いのフローを無視して「誕生日を教えてください」と返されますが、
66
66
 
67
- フローに依存せずに適当に結果を返しければ問題ないでしょう。
67
+ フローに依存せずに適当に結果を返してもよければ問題ないでしょう。
68
68
 
69
69
  botは本来ステートレス(以前の会話を覚えていないこと)であるという想定で作られているので、botに複雑な処理を求めるとコードも複雑になってしまいます。
70
70
 

1

回答を追記しました

2018/01/15 08:48

投稿

Udomomo
Udomomo

スコア1524

test CHANGED
@@ -23,3 +23,97 @@
23
23
 
24
24
 
25
25
  ⑤から抜けられない件は、⑤の結果を出す部分のソースコードがないのでわかりません。
26
+
27
+
28
+
29
+ -- 追記 --
30
+
31
+ handlerがいくつもあり、テキストを入力するとどのhandlerが呼ばれるかわからないのが、変な動作の原因になっている気がします。
32
+
33
+ 以下のように直すと、handlerが1つになります。
34
+
35
+
36
+
37
+ ```python
38
+
39
+ @handler.add(MessageEvent, message=TextMessage)
40
+
41
+ def handle_text_message(event):
42
+
43
+ text = event.message.text
44
+
45
+ if text == '占い':
46
+
47
+ # メッセージを返す処理
48
+
49
+ elif text in ['男', '女']:
50
+
51
+ # メッセージを返す処理
52
+
53
+ ...
54
+
55
+ elif text in ['A', 'B', 'O', 'AB']:
56
+
57
+ # 結果を返す処理
58
+
59
+ else:
60
+
61
+ # その他の入力があったときのエラーメッセージを返す処理
62
+
63
+ ```
64
+
65
+ このとき、最初にいきなり「男」と入力しても、占いのフローを無視して「誕生日を教えてください」と返されますが、
66
+
67
+ フローに依存せずに適当に結果を返したければ問題ないでしょう。
68
+
69
+ botは本来ステートレス(以前の会話を覚えていないこと)であるという想定で作られているので、botに複雑な処理を求めるとコードも複雑になってしまいます。
70
+
71
+
72
+
73
+ もし、ステートフル(今までの会話のやり取りを覚えており、それをふまえて会話すること)なサービスにしたいのであれば、bot単体だけでは厳しいです。
74
+
75
+
76
+
77
+ 少しコーディングが難しくなってもよければ、結果を出す用のスクリプトとデータベースを用意する方がよいと思います。
78
+
79
+ 例えば、以下のものを用意します。
80
+
81
+ ・受付コード:ユーザと占い師を仲介し、それぞれと情報をやり取りするだけ
82
+
83
+ ・占い師コード:受付からユーザの入力をもらい、占いをするだけ
84
+
85
+ ・データベース:ユーザの入力を記憶しておくだけ
86
+
87
+
88
+
89
+ 例として、③と④の流れは以下のようにできます。
90
+
91
+
92
+
93
+ ③「0101」と入力
94
+
95
+ ・受付は占い師に「0101」を伝え、「血液型を教えてください」と返す
96
+
97
+ ・占い師はデータベースに「0101」を入れておく。
98
+
99
+
100
+
101
+ ④「A」と入力
102
+
103
+ ・受付は占い師に「A」を伝え、結果を判定するよう伝える
104
+
105
+ ・占い師はデータベースに「A」を入れる
106
+
107
+ ・占い師コードの結果判定用の関数が動く。データベースからそのユーザの情報を全て取り出し、必要なものが全てあれば結果を判定し、受付に伝える。
108
+
109
+ ・受付はユーザに結果を伝える
110
+
111
+
112
+
113
+ こうすると、受付コードはユーザとの会話の流れを覚えておく必要がありません。実際に占っているのは背後の占い師コードなので、botがステートレスでも、ユーザからはbotが占ってるように見えます。
114
+
115
+ また、このように役割を分担すると、将来機能を追加したりメンテナンスしたりするときに、どこをいじればよいかわかりやすくなり、コードが複雑になりにくいです。
116
+
117
+
118
+
119
+ もしこういう実装を自力でやるのは難しすぎると思うのであれば、コーディングなしでノンプログラマーでもステートフルなLine botを作れるツールが世の中にあるので、それを使うと良いと思います。(「チャットボットツール」で検索するといろいろ出てきます。ものによっては個人向け無料プランもあります)