teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

文章を修正

2018/01/15 08:48

投稿

Udomomo
Udomomo

スコア1524

answer CHANGED
@@ -31,7 +31,7 @@
31
31
  # その他の入力があったときのエラーメッセージを返す処理
32
32
  ```
33
33
  このとき、最初にいきなり「男」と入力しても、占いのフローを無視して「誕生日を教えてください」と返されますが、
34
- フローに依存せずに適当に結果を返しければ問題ないでしょう。
34
+ フローに依存せずに適当に結果を返してもよければ問題ないでしょう。
35
35
  botは本来ステートレス(以前の会話を覚えていないこと)であるという想定で作られているので、botに複雑な処理を求めるとコードも複雑になってしまいます。
36
36
 
37
37
  もし、ステートフル(今までの会話のやり取りを覚えており、それをふまえて会話すること)なサービスにしたいのであれば、bot単体だけでは厳しいです。

1

回答を追記しました

2018/01/15 08:48

投稿

Udomomo
Udomomo

スコア1524

answer CHANGED
@@ -10,4 +10,51 @@
10
10
  ```
11
11
  とすると、a=0だった場合、何も返されずに関数から抜けます。a+1は実行されません。
12
12
 
13
- ⑤から抜けられない件は、⑤の結果を出す部分のソースコードがないのでわかりません。
13
+ ⑤から抜けられない件は、⑤の結果を出す部分のソースコードがないのでわかりません。
14
+
15
+ -- 追記 --
16
+ handlerがいくつもあり、テキストを入力するとどのhandlerが呼ばれるかわからないのが、変な動作の原因になっている気がします。
17
+ 以下のように直すと、handlerが1つになります。
18
+
19
+ ```python
20
+ @handler.add(MessageEvent, message=TextMessage)
21
+ def handle_text_message(event):
22
+ text = event.message.text
23
+ if text == '占い':
24
+ # メッセージを返す処理
25
+ elif text in ['男', '女']:
26
+ # メッセージを返す処理
27
+ ...
28
+ elif text in ['A', 'B', 'O', 'AB']:
29
+ # 結果を返す処理
30
+ else:
31
+ # その他の入力があったときのエラーメッセージを返す処理
32
+ ```
33
+ このとき、最初にいきなり「男」と入力しても、占いのフローを無視して「誕生日を教えてください」と返されますが、
34
+ フローに依存せずに適当に結果を返したければ問題ないでしょう。
35
+ botは本来ステートレス(以前の会話を覚えていないこと)であるという想定で作られているので、botに複雑な処理を求めるとコードも複雑になってしまいます。
36
+
37
+ もし、ステートフル(今までの会話のやり取りを覚えており、それをふまえて会話すること)なサービスにしたいのであれば、bot単体だけでは厳しいです。
38
+
39
+ 少しコーディングが難しくなってもよければ、結果を出す用のスクリプトとデータベースを用意する方がよいと思います。
40
+ 例えば、以下のものを用意します。
41
+ ・受付コード:ユーザと占い師を仲介し、それぞれと情報をやり取りするだけ
42
+ ・占い師コード:受付からユーザの入力をもらい、占いをするだけ
43
+ ・データベース:ユーザの入力を記憶しておくだけ
44
+
45
+ 例として、③と④の流れは以下のようにできます。
46
+
47
+ ③「0101」と入力
48
+ ・受付は占い師に「0101」を伝え、「血液型を教えてください」と返す
49
+ ・占い師はデータベースに「0101」を入れておく。
50
+
51
+ ④「A」と入力
52
+ ・受付は占い師に「A」を伝え、結果を判定するよう伝える
53
+ ・占い師はデータベースに「A」を入れる
54
+ ・占い師コードの結果判定用の関数が動く。データベースからそのユーザの情報を全て取り出し、必要なものが全てあれば結果を判定し、受付に伝える。
55
+ ・受付はユーザに結果を伝える
56
+
57
+ こうすると、受付コードはユーザとの会話の流れを覚えておく必要がありません。実際に占っているのは背後の占い師コードなので、botがステートレスでも、ユーザからはbotが占ってるように見えます。
58
+ また、このように役割を分担すると、将来機能を追加したりメンテナンスしたりするときに、どこをいじればよいかわかりやすくなり、コードが複雑になりにくいです。
59
+
60
+ もしこういう実装を自力でやるのは難しすぎると思うのであれば、コーディングなしでノンプログラマーでもステートフルなLine botを作れるツールが世の中にあるので、それを使うと良いと思います。(「チャットボットツール」で検索するといろいろ出てきます。ものによっては個人向け無料プランもあります)