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?
Hva er den riktige måten å lagre / spor tilstand inne i en Facebook Messenger bot?
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.
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.
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.
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.
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.'"';
}













