Qual è il modo giusto per salvare / stato di pista all'interno di un bot Facebook Messenger?

voti
8

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?

È pubblicato 22/08/2016 alle 09:11
fonte dall'utente
In altre lingue...                            


5 risposte

voti
2

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.

Risposto il 30/08/2016 a 10:52
fonte dall'utente

voti
1

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.

Risposto il 02/09/2016 a 19:55
fonte dall'utente

voti
2

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.

Risposto il 07/09/2016 a 06:40
fonte dall'utente

voti
8

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.

Risposto il 14/04/2017 a 03:37
fonte dall'utente

voti
1

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

}
Risposto il 21/12/2017 a 20:26
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more