Se il mio bot pone domande diverse e se l'utente risponde a ciascuno di essi, come faccio a sapere quale risposta si riferisce a quale domanda. C'è un campo chiamato metadati che è possibile allegare alle API sendTextMessage ma quando l'utente risponde, questi metadati entra come indefinito. Do you guys usare qualsiasi nodo della cache per il monitoraggio dello stato o un FSM, come machina.js? Come posso figura migliore fuori in quello della conversazione che stiamo attualmente bloccati in?
Qual è il modo giusto per salvare / stato di pista all'interno di un bot Facebook Messenger?
Si può avere un codice di stato nel codice, per tenere traccia di dove la conversazione dell'utente con il bot è.
Per per esempio. se si dispone di 10 domande, tenere statuscode = 0 inizialmente, e porre la prima domanda. Quando si riceve un messaggio al tuo webhook, controllare se statuscode == 0, e memorizzare il messaggio all'utente come risposta alla tua prima domanda. Poi incrementare statusCode = 1 e porre la domanda successiva.
È possibile avere più bandiere e StatusCodes per affrontare diversi flussi di conversazione.
Io corro in questo problema io stesso. Anche se non è stato menzionato a tutti nella loro documentazione, non credo che il collegamento di un database in memoria è fuori questione. Sembra che la user_idè la stessa indipendentemente da quando è iniziata la conversazione.
Effettuare una chiamata API ogni volta che l'utente si ricongiunge la sessione probabilmente rallentare le prestazioni del bot. Inoltre, ho notato che non si può davvero costruire una "banca dati pseudo-distribuito" utilizzando la chiave metadati nell'API se questo è quello che stavi suggerendo. Il tag di metadati possono essere inviate dal Server -> Client (Messenger), ma non da client -> Server da quello che dice la documentazione.
Come per la mia conoscenza , in Facebook chatbot è possibile inviare i dati da utente a chatbot semplicemente impostando payload dai pulsanti di postback in quanto hanno dato in riferimento API .
E chatbot non memorizzerà la sessione o qualsiasi Stati / bandiere .potete impostare lo stato o bandiere o array, ma tutto sarà perso quando si aggiorna l'applicazione o riavviare il server.
quindi, se si vuole veramente per impostare lo stato si dovrebbe usare banca dati per that.and SenderID rimarrà lo stesso ogni volta in modo da poter gestire i dati dal database da quel particolare ID per utente particolare.
Per maggiori dettagli cassa referance tecnica qui .
Spero che questo vi aiuterà you.if così, gentilmente contrassegnare come una risposta.
Quando la tua applicazione riceve un messaggio, non c'è carico o metadati associati con esso. Questo è in contrasto con una rapida risposta o post-posteriore che può avere un carico utile. L'unico modo per associare una risposta con una domanda a questo è quello di tenere traccia manualmente lo stato di conversazione nella vostra applicazione, come suggerito da @ Anshuman-dhamoon
Per fare questo, è meglio mantenere uno stato per ogni utente, così come lo stato successivo per ogni stato.
// 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])
}
Nota Se si voleva, si può anche fare i valori di nextStatesin funzioni richiamabili che prendono la risposta dello stato attuale e si diramano in diverse conversazione scorre passando l'utente a uno stato diverso a seconda del suo / sua risposta.
Ho passato un po 'di tempo a lavorare con questo. La soluzione migliore è quella di utilizzare un database per monitorare il flusso di conversazione dell'utente. L'oggetto POST contiene l'ID mittenti. È possibile utilizzare questo ID per fare una riga nel database in cui si sarebbe sicuramente bisogno di memorizzare questo ID, eventuali risposte alle domande, e un campo per tenere traccia di quale passo nella conversazione.
Quindi è possibile utilizzare se le dichiarazioni nel codice per restituire le risposte corrette. Qualche esempio di codice qui sotto:
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.'"';
}













