在Facebook Messenger机器人中保存/跟踪状态的正确方法是什么?

时间:2016-08-22 09:11:39

标签: bots chatbot facebook-chatbot

如果我的机器人提出不同的问题,如果用户回答了每个问题,我如何找出哪个答案与哪个问题相关。有一个称为元数据的字段,您可以将其附加到sendTextMessage API,但是当用户响应时,此元数据将以未定义的形式出现。你们是否使用任何节点缓存来跟踪状态或FSM,如machina.js?我怎样才能最好地弄清楚我们目前所处的对话是什么?




5 个答案:

答案 0 :(得分:9)

当您的应用收到消息时,没有与之关联的有效负载或元数据。这与可以具有有效载荷的快速回复或后回复相反。将响应与问题相关联的唯一方法是按照@ 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 :(得分:3)

您可以在代码中包含状态代码,以跟踪用户与机器人的对话位置。

例如。如果你有10个问题,最初保持statuscode = 0,并询问第一个问题。当您收到向webhook发送的消息时,请检查statuscode == 0,并将该用户消息存储为对第一个问题的回复。然后递增statusCode = 1并询问下一个问题。

您可以使用多个标志和statusCodes来处理不同的会话流。

答案 2 :(得分:2)

据我所知,在Facebook聊天机器人中,您只需在API reference中设置有效负载,就可以从用户发送到聊天机器人

并且chatbot 不会存储您的会话或任何状态/标志。您可以设置状态或标志或数组,但是当您更新应用程序或重新启动服务器时,所有这些都将丢失。< / p>

所以,如果你真的想设置状态,那么你应该使用数据库 senderID 每次都会保持相同,这样你就可以通过特定的id来处理来自数据库的数据对于特定用户。

有关详细信息,请结帐technical referance here

我希望这会对你有所帮助。如果是,请将其标记为答案。

答案 3 :(得分:1)

我自己也遇到过这个问题。虽然在他们的文档中根本没有提到它,但我不认为附加内存数据库是不可能的。无论何时发起对话,似乎user_id都是相同的。

每次用户重新加入会话时进行API调用都可能会降低机器人的性能。另外,我注意到你无法构建一个伪分布式数据库&#34;通过使用API​​中的元数据键,如果这是您的建议。元数据标签可以从服务器发送 - &gt;客户端(Messenger)但不是来自客户端 - &gt;来自文档所说的服务器。

答案 4 :(得分: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.'"';

}