Wenn mein bot verschiedene Fragen stellt, und wenn der Benutzer jede von ihnen Antworten, wie finde ich heraus, welche Antwort, auf die Frage bezieht. Es gibt ein Feld namens Metadaten, die Sie dem sendTextMessage API anhängen können aber, wenn der Benutzer antwortet, diese Metadaten kommt als undefiniert. Verwenden Sie Jungs einen beliebigen Knoten-Cache für Zustand oder einen FSM wie machina.js Tracking? Wie kann ich am besten herausfinden, was der Unterhaltung, die wir in zur Zeit stecken?
Was ist der richtige Weg zum Speichern / Spur-Zustand in einem Bot Facebook Messenger?
Sie können einen Statuscode in Ihrem Code haben, um zu verfolgen, wo der Benutzer Gespräch mit dem Bot ist.
Für zB. wenn Sie 10 Fragen haben, halten Statuscode = 0 zunächst, und die erste Frage stellen. Wenn Sie eine Nachricht an Ihre Webhook erhalten, prüfen Sie, ob status == 0, und speichern, dass die Benutzernachricht als Antwort auf Ihre erste Frage. Dann erhöht status = 1 und die nächste Frage stellen.
Sie können mehrere Fahnen und status zu tun haben mit unterschiedlichen Gespräch fließt.
Ich laufe in dieser Frage selbst. Obwohl es ist überhaupt nicht in ihrer Dokumentation erwähnt, glaube ich nicht , eine In-Memory - Datenbank Anbringen indiskutabel ist. Es scheint , dass die user_iddie gleiche ist , unabhängig davon , wann das Gespräch initiiert wird.
Erstellen Sie ein API-Aufruf der Benutzer jedes Mal, wahrscheinlich die Leistung des Bot verlangsamen würde die Sitzung entgegnet. Auch bemerkte ich, dass man nicht wirklich eine „pseudo-verteilte Datenbank“ erstellen, indem Sie den Metadaten-Schlüssel in der API zu verwenden, wenn das ist, was Sie vorschlagen. Der Metadaten-Tag kann von Server gesendet werden -> Client (Messenger), aber nicht von Client -> Server aus, was die Dokumentation sagt.
Wie pro meinem Wissen , in Facebook chatbot können Sie Daten von Benutzern zu chatbot senden Sie einfach durch das Setzen Nutzlast von Postback - Tasten , wie sie in gegeben haben API - Referenz .
Und chatbot wird nicht speichern Sie Ihre Sitzung oder alle Staaten / Flaggen .Sie Status oder Flags oder Arrays festlegen können , aber alle verloren gehen, wenn Sie Ihre Anwendung aktualisieren oder den Server neu starten.
so, wenn Sie wirklich Status festlegen möchten , sollten Sie verwenden Datenbank für that.and SenderID wird jedes Mal gleichen bleiben , so dass Sie Daten aus der Datenbank von diesem bestimmten ID für bestimmte Benutzer verarbeiten kann.
Weitere Details Kasse hier technische referance .
Ich hoffe, das you.if hilft so, als Antwort markiert es freundlich.
Wenn Ihre App eine Nachricht empfängt, gibt es keine Nutzlast oder Metadaten, die mit ihr verbunden sind. Dies ist im Gegensatz zu einer Schnell Antwort oder post zurück, die eine Nutzlast hat. Der einzige Weg, eine Antwort mit einer Frage zu assoziieren dies manuell zu dem Gesprächszustand in Ihrer App verfolgen wie von @ Anshuman-dhamoon
Um dies zu tun, ist es am besten, einen Zustand für jeden Benutzer zu halten, sowie der nächsten Zustand für jeden Zustand.
// 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])
}
Hinweis Wenn Sie möchten, können Sie auch die Werte machen nextStatesin aufrufbaren Funktionen, die die Antwort des aktuellen Zustands nehmen und in verschiedene Gespräch fließt , indem der Benutzer in einen anderen Zustand in Abhängigkeit von seiner / ihrer Antwort abzweigen.
Ich habe einige Zeit die Arbeit mit diesem ausgegeben. Die beste Lösung ist es, eine Datenbank zu verwenden, um das Gespräch Fluss des Benutzers zu verfolgen. Das POST-Objekt enthält die Absender-ID. Sie können diese ID verwenden, um eine Zeile in der Datenbank zu machen, in dem Sie auf jeden Fall diese ID speichern müssen, keine Antworten auf die Fragen, und eine Feldspur von dem Schritt in dem Gespräch zu halten.
Dann können Sie verwenden, wenn Anweisungen in Ihrem Code die richtigen Antworten zurückzukehren. Einige Beispiel-Code unten:
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.'"';
}













