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

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