2016-08-22 63 views
8

如果我的機器人問了不同的問題,並且用戶回答了每個問題,我如何知道哪個答案與哪個問題有關。有一個稱爲元數據的字段,您可以將其附加到sendTextMessage API,但當用戶響應時,此元數據未定義。你們是否使用任何節點緩存來跟蹤狀態或FSM,如machina.js?我怎樣才能最好地弄清楚我們目前陷入的對話是什麼?在Facebook Messenger機器人內保存/跟蹤狀態的正確方法是什麼?

回答

2

你可以在你的代碼中有一個狀態碼,以跟蹤用戶與機器人對話的位置。

例如,如果你有10個問題,最初保持statuscode = 0,並提出第一個問題。當你收到一條消息給你的webhook時,請檢查statuscode == 0,並將該用戶消息存儲爲對第一個問題的迴應。然後增加statusCode = 1並提出下一個問題。

您可以有多個標誌和statusCodes來處理不同的對話流。

1

我正在自己遇到這個問題。儘管在他們的文檔中沒有提到它,但我不認爲附加內存數據庫是不可能的。看起來user_id是相同的,無論何時開始通話。

每次用戶重新加入會話時進行API調用都可能會降低bot的性能。另外,我注意到,如果這是您的建議,則您無法通過在API中使用元數據密鑰來構建「僞分佈式數據庫」。可以從服務器 - >客戶端(Messenger)發送元數據標籤,但不能從客戶端 - >服務器發送文檔說明的內容。

+0

確實,到目前爲止運氣還不錯? db是保存狀態的唯一方法嗎? – Rusty

2

按我的知識,Facebook的聊天機器人你可以通過設置自回傳按鈕有效載荷,因爲他們在API reference給了與用戶的數據發送到聊天機器人。

而聊天機器人不會存儲您的會話或任何州/標誌。您可以設置狀態或旗或數組,但一切都將失去,當你更新你的應用程序或重新啓動服務器。

所以,如果你真的想設置的狀態,你應該使用數據庫爲that.and senderID將保持同樣每次這樣你就可以通過爲特定用戶的特定ID處理來自數據庫的數據。

欲瞭解更多詳情結賬technical referance here

我希望這會幫助你。如果是這樣,請將其標記爲答案。

+0

元數據不起作用,它返回undefined,我已經嘗試過 – PirateApp

+0

只是通過回傳數據在有效載荷中的按鈕與回發 –

+0

元數據只有當您訂閱回聲時才返回,它有什麼用途我不清楚 - https:// developers.facebook.com/docs/messenger-platform/webhook-reference/message-echo – Rusty

8

當您的應用程序收到消息時,沒有與其關聯的有效內容或元數據。這與可以具有有效載荷的快速回復或回傳相反。將回答與問題關聯起來的唯一方法就是按照@ anshuman-dhamoon建議的方式手動跟蹤應用程序中的對話狀態。爲此,最好爲每個用戶維護一個狀態,以及每個狀態的下一個狀態。

// optionally store this in a database 
const users = {} 

// an object of state constants 
const states = { 
    question1: 'question1', 
    question2: 'question2', 
    closing: 'closing', 
} 

// mapping of each to state to the message associated with each state 
const messages = { 
    [states.question1]: 'How are you today?', 
    [states.question2]: 'Where are you from?', 
    [states.closing]: 'That\'s cool. It\'s nice to meet you!', 
} 

// mapping of each state to the next state 
const nextStates = { 
    [states.question1]: states.question2, 
    [states.question2]: states.closing, 
} 

const receivedMessage = (event) => { 
    // keep track of each user by their senderId 
    const senderId = event.sender.id 
    if (!users[senderId].currentState){ 
     // set the initial state 
     users[senderId].currentState = states.question1 
    } else { 
     // store the answer and update the state 
     users[senderId][users[senderId].currentState] = event.message.text 
     users[senderId].currentState = nextStates[users[senderId.currentState]] 
    } 
    // send a message to the user via the Messenger API 
    sendTextMessage(senderId, messages[users[senderId].currentState]) 
} 

注意如果你願意,你甚至可以使nextStates值成利用目前狀態的回答和分支成不同的談話用戶傳遞到根據不同的狀態流可調用的函數他/她的迴應。

1

我花了一些時間處理這個問題。最好的解決方案是使用數據庫來跟蹤用戶的對話流程。 POST對象包含發件人ID。您可以使用此ID在數據庫中創建一行,您肯定需要存儲此ID,問題的任何答案以及跟蹤對話中哪個步驟的字段。

然後,您可以在代碼中使用if語句來返回正確的響應。下面的一些示例代碼:

if($currentStep == '1'){ 

    // Ask Next Question 
    $message_to_reply = "Thank you! What's your name?"; 
    $message_to_reply = '"text":"'.$message_to_reply.'"'; 

} elseif($currentStep == '2'){ 

    // Ask Next Question 
    $message_to_reply = "Thank you! What's your email address?"; 
    $message_to_reply = '"text":"'.$message_to_reply.'"'; 


} elseif($currentStep == '3'){ 

    // Ask Next Question 
    $message_to_reply = "Thank you! What's your address?"; 
    $message_to_reply = '"text":"'.$message_to_reply.'"'; 

} 
相關問題