2016-08-22 4 views
8

Si mon bot pose différentes questions et si l'utilisateur répond à chacune d'entre elles, comment puis-je savoir quelle réponse correspond à quelle question. Il existe un champ appelé métadonnées que vous pouvez attacher à l'API sendTextMessage mais lorsque l'utilisateur répond, cette métadonnée est non définie. Est-ce que vous utilisez un cache-noeud pour suivre un état ou un FSM tel que machina.js? Comment puis-je savoir au mieux de la conversation dans laquelle nous sommes actuellement coincés?Quelle est la bonne façon de sauvegarder/suivre l'état dans un bot Facebook Messenger?

Répondre

2

Vous pouvez avoir un code d'état dans votre code, pour garder une trace de l'endroit où la conversation de l'utilisateur avec le bot est.

Par exemple. Si vous avez 10 questions, conservez initialement statuscode = 0 et posez la première question. Lorsque vous recevez un message sur votre webhook, vérifiez si statuscode == 0 et stockez ce message en réponse à votre première question. Ensuite, incrémentez statusCode = 1 et posez la question suivante.

Vous pouvez avoir plusieurs indicateurs et codes d'état pour gérer différents flux de conversation.

1

Je suis moi-même confronté à ce problème. Bien que cela n'ait pas été mentionné du tout dans leur documentation, je ne pense pas qu'il soit hors de question de joindre une base de données en mémoire. Il semble que le user_id est le même indépendamment du moment où la conversation est lancée. Faire un appel API chaque fois que l'utilisateur rejoint la session ralentirait probablement les performances du bot. De plus, j'ai remarqué que vous ne pouvez pas vraiment construire une "base de données pseudo-distribuée" 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 peut être envoyée à partir de Serveur -> Client (Messenger) mais pas de Client -> Serveur à partir de ce que dit la documentation.

+0

Vrai, Avez-vous déjà eu de la chance? Est-ce que db est le seul moyen de sauver l'état? – Rusty

2

Selon ma connaissance, en chatbot Facebook, vous pouvez envoyer des données d'un utilisateur à chatbot simplement en juxtaposant charge utile boutons postback comme ils l'ont donné API reference.

Et chatbot ne stockera pas votre session ou n'importe quels états/drapeaux. Vous pouvez définir le statut ou les drapeaux ou les tableaux mais tout sera 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, passez la commande technical referance here.

J'espère que cela vous aidera. Si oui, veuillez le marquer comme une réponse.

+0

métadonnées ne fonctionne pas, il retourne indéfini, je l'ai essayé – PirateApp

+0

juste passer les données dans la charge utile dans le bouton avec postback –

+0

métadonnées est seulement retourné lorsque vous vous abonnez l'écho, ce qui est l'utilisation de ce n'est pas clair pour moi - https: // developers.facebook.com/docs/messenger-platform/webhook-reference/message-echo – Rusty

8

Lorsque votre application reçoit un message, aucune charge ou métadonnée n'est associée à celle-ci. 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 la conversation dans votre application comme suggéré par @ anshuman-dhamoon

Pour cela, il est préférable de maintenir un état pour chaque utilisateur, ainsi que le prochain état 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 de nextStates en fonctions appelables qui prennent la réponse de l'état actuel et bifurquent conversation différents flux en passant l'utilisateur à un état différent selon sa réponse.

1

J'ai passé un certain temps à travailler avec ça. La meilleure solution consiste à utiliser une base de données pour suivre le flux de conversation de l'utilisateur. L'objet POST contient l'ID de l'expéditeur. Vous pouvez utiliser cet ID pour créer une ligne dans la base de données dans laquelle vous devez absolument stocker cet ID, les réponses aux questions et un champ pour suivre l'étape de la conversation.

Ensuite, vous pouvez utiliser if instructions dans votre code pour renvoyer les réponses appropriées. Quelques 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.'"'; 

}