În cazul în care bot meu pune diferite întrebări și dacă utilizatorul răspunde fiecare dintre ele, cum aflu care răspunsul se referă la care întrebare. Există un câmp numit metadate pe care le puteți atașa la API-ul sendTextMessage, dar atunci când utilizatorul răspunde, aceste metadate vine ca nedefinită. Nu voi folosi orice nod-cache pentru urmărirea de stat sau FSM, cum ar fi machina.js? Cum pot cel mai bine dau seama la ce conversației suntem blocați în prezent?
Care este modul corect de a salva / starea de cale în interiorul unui robot pe Facebook Messenger?
Puteți avea un cod de stare în codul dvs., pentru a urmări în cazul în care conversația de utilizator cu bot este.
De ex. dacă aveți 10 întrebări, păstrați statusCode = 0, inițial, și de a pune prima întrebare. Când primiți un mesaj la webhook, verificați dacă statusCode == 0, și se păstrează acel mesaj de utilizator ca un răspuns la prima întrebare. Apoi incrementa statusCode = 1 și pune întrebarea următoare.
Puteți avea mai multe steaguri și statusCodes pentru a face față cu diferite fluxuri de conversație.
Am această problemă pentru mine. Deși nu a fost menționat deloc în documentația lor, nu cred că atașarea unei baze de date din memorie este iese din discuție. Se pare că user_ideste aceeași , indiferent de momentul inițiat conversația.
Efectuarea unui apel API de fiecare dată când utilizatorul va fi reintegrată sesiune va încetini probabil în jos performanța bot. De asemenea, am observat că nu se poate construi cu adevărat o „bază de date distribuită pseudo“ folosind cheia de metadate în API-ul în cazul în care este ceea ce sugerau. Eticheta de metadate pot fi trimise de la server -> Client (Messenger), dar nu de la Client -> Server de la ceea ce spune documentația.
Ca pe cunoștințele mele , Facebook chatbot puteți trimite date de la utilizator la chatbot doar prin setarea unei sarcini utile de la butoane postback așa cum le - au dat în referință API .
Și chatbot nu va stoca sesiunea sau orice alte state / steaguri .Puteți seta starea sau steaguri sau rețele , dar toate vor fi pierdute atunci când actualizați aplicația sau reporniți server.
așa că, dacă într-adevăr doriți să setați starea pe care ar trebui să utilizați bază de date pentru that.and senderID va rămâne același de fiecare dată, astfel încât să puteți manipula datele din baza de date de acest id special pentru un anumit utilizator.
Pentru mai multe detalii finalizarea comenzii referance tehnice aici .
Sper că acest lucru va ajuta la you.if atât, vă rugăm să-l marcați ca răspuns.
Când aplicația primește un mesaj, nu există nici o sarcină utilă sau metadate asociate cu acesta. Acest lucru este, spre deosebire de un rapid de răspuns sau post-back, care pot avea o sarcină utilă. Singura modalitate de a asocia un răspuns cu o întrebare acest lucru este de a urmări manual starea de conversație în aplicația dvs. așa cum a sugerat @ Anshuman-dhamoon
Pentru a face acest lucru, cel mai bine este de a menține o stare pentru fiecare utilizator, precum și starea următoare pentru fiecare 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])
}
Notă Dacă ați dorit, puteți face chiar și valorile nextStatesîn funcții apelabile care iau răspunsul de starea actuală și se ramifică în conversație diferite fluxuri prin trecerea către utilizator a unui stat diferit , în funcție de răspunsul lui / ei.
Am petrecut ceva timp de lucru cu acest lucru. Cea mai bună soluție este de a utiliza o bază de date pentru a urmări fluxul de conversație utilizatorului. Obiectul POST conține expeditori ID. Puteți utiliza acest ID pentru a face un rând în baza de date în care ai nevoie pentru a stoca cu siguranta acest ID, orice răspunsuri la întrebări, și un câmp pentru a ține evidența de care pas în conversație.
Apoi, puteți utiliza în cazul în care situațiile în cod pentru a returna răspunsurile corespunzătoare. Unele exemplu de cod de mai jos:
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.'"';
}













