有關Linebot的範例中,針對文字訊息的處理方式如下:
@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text)
)
假設使用richmenu針對特定關鍵字回答可以使用:
@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
parse_text = event.message.text
same_message = TextSendMessage(text=event.message.text)
if parse_text == 'question':
sticker_message = StickerSendMessage(
package_id='11538',
sticker_id='51626499'
)
line_bot_api.reply_message(event.reply_token, sticker_message)
else:
line_bot_api.reply_message(event.reply_token, same_message)
但是假設要設計一個問卷的話,使linebot抓到question這個關鍵字之後,使用者回覆的話依然每次會進到message_text這個迴圈當中,請問要如何修改可以使linebot在處理這個messages時能夠繼續handle其他的訊息?
而不是都只能做到問卷的第一題沒辦法繼續做要持續下關鍵字才能達成?
因為我不是用python寫bot,簡單講一下邏輯就好
使用變數(推薦使用hashMap)存儲當前填寫表單的使用者ID以及對應問卷進度
當此使用者ID觸發Message事件時,根據問卷進度判斷要帶入哪一段function或是退出表單狀態(清除變數)等
重點在於bot觸發事件最初,必需記得自己剛剛有把表單發給誰,之後使用者在繼續填問卷時,bot才不會把每一次回答都當成第一次處理,也就是需要有一個讓bot想起來自己在做甚麼的動作。
這跟網頁的道理一樣,ChatBot都是stateless(無狀態)
因此你必須當作,每次跟你對話的都是不同人的情況下來處理對話
所以你應該記錄每位使用者的當前狀態
而按照問卷形式的聊天應用會有以下流程
基礎版
question
,使用變數紀錄A的狀態為準備要回答問題
(此時B突然也密機器人,即可達成互不干擾的環境)謹慎版
在有 基礎版
的流程下,額外判斷A每次回答的答案是否符合問題描述
個人建議,因使用純文字進行問卷調查,情境非常複雜
個人會搭配 Line 的 Flex Message
限制住可回答的內容,也可以使用比較簡單的 Quick Reply
讓使用者用點選的方式進行回覆
LINEBOT需要建置資料庫才能紀錄每次對話的訊息內容喔
以Python的Django做法可參考系列文:
https://ithelp.ithome.com.tw/users/20121176/articles