在 Facebook Messenger 机器人中 save/track 状态的正确方法是什么?

What is the right way to save/track state inside a Facebook Messenger bot?

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

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

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

您可以有多个标志和状态代码来处理不同的对话流。

我自己 运行 陷入这个问题。虽然在他们的文档中根本没有提到它,但我认为附加内存数据库不是不可能的。看来无论什么时候发起对话,user_id都是一样的

每次用户重新加入会话时进行 API 调用可能会降低机器人的性能。另外,我注意到如果您的建议是这样的话,您不能通过使用 API 中的元数据键来真正构建 "pseudo-distributed database"。元数据标签可以从服务器 -> 客户端(Messenger)发送,但不能从文档中所说的客户端 -> 服务器发送。

据我所知,在 Facebook 聊天机器人中,您可以通过设置 来自回发按钮的负载 将数据从用户发送到聊天机器人,因为它们已在 API reference.

中给出

并且聊天机器人 不会存储您的会话或任何 states/flags。您可以设置状态或标志或数组,但当您更新您的应用程序或重新启动服务器。

所以,如果你真的想设置状态,你应该使用 database 因为 that.and senderID 每次都会保持不变所以您可以通过特定用户的特定 ID 处理数据库中的数据。

有关更多详细信息,请查看 technical referance here

我希望这会有所帮助 you.if 所以,请将其标记为答案。

当您的应用收到一条消息时,没有与之关联的有效负载或元数据。这与可以具有有效负载的快速回复或 post-back 相反。将响应与问题相关联的唯一方法是按照 @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 的值变成可调用函数,这些函数采用当前状态的答案并分支到不同的对话流根据 his/her 响应将用户传递到不同的状态。

我花了一些时间来处理这个问题。最好的解决方案是使用数据库来跟踪用户的对话流。 POST 对象包含发件人 ID。您可以使用此 ID 在数据库中创建一行,您肯定需要在其中存储此 ID、问题的任何答案以及用于跟踪对话中哪一步的字段。

然后您可以在代码中使用 if 语句来 return 正确的响应。下面是一些示例代码:

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.'"';

}