Hva er den riktige måten å lagre / spor tilstand inne i en Facebook Messenger bot?

stemmer
9

Hvis min bot spør forskjellige spørsmål, og hvis brukeren svarer hver av dem, hvordan finner jeg ut hvilke svar knyttet til hvilket spørsmål. Det er et felt som kalles metadata som du kan feste til sendTextMessage API, men når brukeren svarer, kommer dette metadata i så udefinert. Har dere bruke node-cache for sporing stat eller en FSM som machina.js? Hvordan kan jeg best finne ut hva av samtalen vi nå fast i?

Publisert på 22/08/2016 klokken 09:11
kilden bruker
På andre språk...                            


5 svar

stemmer
3

Du kan ha en statuskode i koden din, for å holde styr på hvor brukeren samtale med boten er.

For eg. hvis du har 10 spørsmål, holde status = 0 i utgangspunktet, og stille det første spørsmålet. Når du mottar en melding til webhook, sjekk om status == 0, og lagre den brukeren meldingen som et svar på det første spørsmålet ditt. Deretter øke status = 1 og spør neste spørsmål.

Du kan ha flere flagg og statusCodes å håndtere ulike samtalen flyter.

Svarte 30/08/2016 kl. 10:52
kilden bruker

stemmer
1

Jeg kjører inn i denne saken selv. Selv om det ikke har blitt nevnt i det hele tatt i sin dokumentasjon, tror jeg ikke feste en in-memory database er uaktuelt. Det virker som det user_ider den samme uavhengig av når samtalen starter.

Å gjøre et API-kall hver gang brukeren rejoins økten vil trolig bremse ned ytelsen til bot. Også, la jeg merke til at du ikke kan virkelig lage en "pseudo-distribuert database" ved hjelp av metadata nøkkelen i API hvis det er det du antyder. Den metadatatag kan sendes fra server -> Client (Messenger), men ikke fra Client -> Server fra hva dokumentasjonen sier.

Svarte 02/09/2016 kl. 19:55
kilden bruker

stemmer
2

Pr min kunnskap , i Facebook chatbot kan du sende data fra brukeren til chatbot bare ved å sette nyttelast fra sendings knapper som de har gitt i API referansen .

Og chatbot vil ikke lagre økten eller noen stater / flagg .Du kan angi status eller flagg eller arrays, men alle vil gå tapt når du oppdaterer din søknad eller starte serveren.

Så hvis du virkelig ønsker å sette status bør du bruke database for that.and senderID vil forbli samme hver gang, slik at du kan håndtere data fra databasen ved den aktuelle id for bestemt bruker.

For mer informasjon kassa teknisk innskriften her .

Jeg håper dette vil hjelpe deg.Hvis så, vennligst merke det som et svar.

Svarte 07/09/2016 kl. 06:40
kilden bruker

stemmer
8

Når app mottar en melding, er det ingen nyttelast eller metadata knyttet til den. Dette er i motsetning til en rask svar eller post-back som kan ha en nyttelast. Den eneste måten å knytte et svar med et spørsmål dette er å spore samtalen tilstanden i app manuelt som foreslått av @ Anshuman-dhamoon

For å gjøre dette, er det best å opprettholde en tilstand for hver bruker, samt neste tilstand for hver stat.

// 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])
}

Merk Hvis du ønsker, kan du selv gjøre verdiene nextStatesi callable funksjoner som tar svaret av den nåværende tilstand og avgreining i ulike samtalen flyter ved å sende brukeren til en annen stat avhengig av hans / hennes reaksjon.

Svarte 14/04/2017 kl. 03:37
kilden bruker

stemmer
1

Jeg har brukt litt tid på å jobbe med dette. Den beste løsningen er å bruke en database for å spore brukerens samtalen flyt. Den POST objekt inneholder sendere ID. Du kan bruke denne ID for å gjøre en rad i databasen der du vil definitivt trenger å lagre denne ID, noen svar på spørsmålene, og et felt for å holde oversikt over hvor trinnet i samtalen.

Deretter kan du bruke hvis uttalelser i koden for å returnere de riktige svarene. Noen eksempel koden under:

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

}
Svarte 21/12/2017 kl. 20:26
kilden bruker

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