Si mon bot pose des questions différentes et si l'utilisateur répond à chacun d'eux, comment puis-je savoir quelle réponse se rapporte à quelle question. Il y a un champ de métadonnées appelé que vous pouvez joindre à l'API sendTextMessage mais quand l'utilisateur répond, ces métadonnées est disponible en tant que non défini. Avez-vous les gars utiliser un nœud-cache pour l'état de suivi ou un EFM tel que machina.js? Comment puis-je le mieux à la figure sur ce de la conversation que nous sommes actuellement coincés dans?
Quelle est la bonne façon de sauver / état de piste à l'intérieur d'un bot Facebook Messenger?
Vous pouvez avoir un code d'état dans votre code, de garder une trace de l'endroit où la conversation utilisateur avec le bot est.
Pour exemple. si vous avez 10 questions, garder statuscode = 0 d'abord et poser la première question. Lorsque vous recevez un message à votre webhook, vérifier si statuscode == 0, et stocker ce message utilisateur en réponse à votre première question. incrémenter ensuite statusCode = 1 et poser la question suivante.
Vous pouvez avoir plusieurs drapeaux et statusCodes pour faire face à différents flux de conversation.
Je suis en cours d' exécution dans cette question moi - même. Bien qu'il n'a pas été mentionné du tout dans leur documentation, je ne pense pas que la fixation d' une base de données en mémoire est hors de question. Il semble que le user_idest le même quel que soit le moment où la conversation est lancée.
Faire un appel API à chaque fois que l'utilisateur rejoint la session serait probablement ralentir les performances du bot. De plus, je remarque que vous ne pouvez pas vraiment construire une « base de données pseudo-distribué » en utilisant la clé de métadonnées dans l'API si c'est ce que vous suggérez. La balise de métadonnées peuvent être envoyées à partir du serveur -> Client (Messenger), mais pas de client -> serveur de ce que dit la documentation.
Selon ma connaissance , dans chatbot Facebook , vous pouvez envoyer des données d' un utilisateur à chatbot simplement en juxtaposant la charge utile de boutons postback comme ils l' ont donné en référence de l' API .
Et chatbot ne stockera pas votre session ou des états / drapeaux .vous pouvez définir l' état ou des drapeaux ou des tableaux , mais tout est perdu lorsque vous mettez à jour votre application ou redémarrez votre serveur.
Donc, si vous voulez vraiment définir l' état , vous devez utiliser la base de données pour that.and senderID restera même à chaque fois que vous pouvez gérer les données de base de données par cet identifiant particulier pour l' utilisateur particulier.
Pour plus de détails la caisse referance technique ici .
J'espère que cela vous aidera you.if donc, marquer gentiment comme une réponse.
Lorsque votre application reçoit un message, il n'y a aucune charge utile ou les métadonnées associées. Ceci est par opposition à une réponse rapide ou post-retour qui peut avoir une charge utile. La seule façon d'associer une réponse à une question est de suivre manuellement l'état de conversation dans votre application comme suggéré par @ Anshuman-dhamoon
Pour ce faire, il est préférable de maintenir un état pour chaque utilisateur, ainsi que l'état suivant pour chaque état.
// 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])
}
Remarque Si vous voulez, vous pouvez même faire les valeurs des nextStatesen fonctions appelables qui prennent la réponse de l'état actuel et bifurquer dans la conversation différents flux en passant l'utilisateur à un état différent en fonction de son / sa réponse.
J'ai passé du temps à travailler avec cela. La meilleure solution est d'utiliser une base de données pour suivre les flux de conversation de l'utilisateur. L'objet POST contient l'ID de l'expéditeur. Vous pouvez utiliser cet ID pour faire une ligne dans la base de données dans laquelle vous auriez certainement besoin de stocker cet ID, toutes les réponses aux questions, et un champ de garder une trace de qui pas dans la conversation.
Ensuite, vous pouvez utiliser si des déclarations dans votre code pour renvoyer les réponses appropriées. Certains exemples de code ci-dessous:
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.'"';
}













