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

Bots 在Facebook Messenger机器人中保存/跟踪状态的正确方法是什么?,bots,chatbot,facebook-chatbot,Bots,Chatbot,Facebook Chatbot,如果我的机器人问不同的问题,如果用户回答了每个问题,我如何找出哪个答案与哪个问题相关。有一个名为metadata的字段,可以附加到sendTextMessage API,但当用户响应时,该元数据以未定义的形式出现。你们是否使用任何节点缓存来跟踪状态,或者像machina.js这样的FSM?我如何才能最好地了解我们目前陷入的对话是什么?您的代码中可以有一个状态代码,以跟踪用户与机器人的对话在哪里 例如,如果您有10个问题,请先保持statuscode=0,然后问第一个问题。当您收到webhook的

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

您的代码中可以有一个状态代码,以跟踪用户与机器人的对话在哪里

例如,如果您有10个问题,请先保持statuscode=0,然后问第一个问题。当您收到webhook的消息时,检查statuscode==0,并将该用户消息存储为对第一个问题的响应。然后递增statusCode=1并问下一个问题


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

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


每次用户重新加入会话时进行API调用可能会降低bot的性能。此外,我注意到,如果您是这样建议的,那么您不能通过使用API中的元数据密钥来真正构建“伪分布式数据库”。元数据标签可以从服务器->客户端(Messenger)发送,但不能从文档中所述的客户端->服务器发送。

据我所知,在Facebook聊天机器人中,您可以通过设置回发按钮的有效负载将数据从用户发送到聊天机器人

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

所以,若你们真的想设置状态,你们应该使用database,而senderID每次都会保持不变,这样你们就可以通过特定用户的特定id处理来自数据库的数据

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


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

当您的应用程序收到消息时,没有与之相关的负载或元数据。这与快速回复或回邮相反,后者可能有有效负载。将回答与问题关联起来的唯一方法是按照@Anshman dhamoon的建议手动跟踪应用程序中的对话状态

为此,最好为每个用户维护一个状态,以及每个状态的下一个状态

//可以选择将其存储在数据库中
常量用户={}
//状态常数的对象
常量状态={
问题1:‘问题1’,
问题2:‘问题2’,
结束:'结束',
}
//将每个to状态映射到与每个状态关联的消息
常量消息={
[国家问题1]:“你今天怎么样?”,
[国家问题2]:“你从哪里来?”,
[结束语]:“太酷了,很高兴见到你!”,
}
//将每个状态映射到下一个状态
常数nextStates={
[州问题1]:州问题2,
[州。问题2]:州。结束,
}
const receivedMessage=(事件)=>{
//按发件人ID跟踪每个用户
const senderId=event.sender.id
如果(!users[senderId].currentState){
//设置初始状态
用户[senderId].currentState=states.question1
}否则{
//存储答案并更新状态
用户[senderId][users[senderId].currentState]=event.message.text
用户[senderId].currentState=nextStates[users[senderId.currentState]]
}
//通过Messenger API向用户发送消息
sendTextMessage(senderId,messages[users[senderId].currentState])
}

注意如果您愿意,您甚至可以将
nextStates
的值放入可调用函数中,这些函数获取当前状态的答案,并根据用户的响应将其传递到不同的状态,从而分支到不同的对话流中。

我花了一些时间来处理这个问题。最好的解决方案是使用数据库来跟踪用户的对话流。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.'"';

}

元数据不起作用,它返回未定义的数据,我已经尝试过了,只需在payload in按钮中传递数据,Postback元数据仅在您订阅echo时返回,它有什么用?我不清楚-是的,到目前为止运气如何?db是保存状态的唯一方法吗?