Wat is de juiste manier om te besparen / track staat in een Facebook Messenger bot?

stemmen
8

Als mijn bot stelt verschillende vragen en als de gebruiker elk van hen antwoorden, hoe kom ik erachter welk antwoord betrekking heeft op die vraag. Er is een veld met de naam metadata die je kunt hechten aan de sendTextMessage API, maar wanneer de gebruiker reageert, deze metadata komt als ongedefinieerd. Doen jullie gebruiken een willekeurig knooppunt-cache voor het volgen van de staat of een FSM zoals machina.js? Hoe kan ik het beste uitzoeken wat van het gesprek we op dit moment vast in?

De vraag is gesteld op 22/08/2016 om 09:11
bron van user
In andere talen...                            


5 antwoorden

stemmen
2

U kunt een status-code in uw code, om bij te houden waar de gebruiker gesprek met het bot is te houden.

Voor bijvoorbeeld. als u 10 vragen, houden statuscode = 0 in eerste instantie, en vraag de eerste vraag. Wanneer u een bericht ontvangt op uw webhook, controleer dan of statuscode == 0, en op te slaan die gebruiker bericht als een antwoord op uw eerste vraag. increment dan statusCode = 1 en vraag de volgende vraag.

U kunt meerdere vlaggen en Statuscodes te maken met verschillende gesprek stromen hebben.

antwoordde op 30/08/2016 om 10:52
bron van user

stemmen
1

Ik ben actief in deze kwestie zelf. Hoewel het heeft helemaal niet in hun documentatie is gezegd, ik denk niet dat het aanbrengen van een in-memory database is uit den boze. Het lijkt erop dat het user_idis hetzelfde, ongeacht wanneer het gesprek wordt gestart.

Het maken van een API oproep elke keer dat de gebruiker de sessie zou waarschijnlijk vertragen de prestaties van het bot weer samen. Ook, merkte ik dat u een "pseudo-gedistribueerde database" niet echt kan bouwen met behulp van de metadata sleutel in de API als dat is wat u suggereert. De metadata tag kan worden verzonden vanaf Server -> Client (Messenger) maar niet van Client -> Server van wat de documentatie zegt.

antwoordde op 02/09/2016 om 19:55
bron van user

stemmen
2

Per mijn kennis , in Facebook chatbot kunt u gegevens van gebruiker tot chatbot sturen door gewoon payload van postback knoppen zoals ze in hebben gegeven API referentie .

En chatbot zal uw sessie of staten / flags Bewaren Kunt u status of flags of arrays gezet, maar alles zal verloren gaan wanneer u uw toepassing bij te werken of uw server opnieuw op.

dus, als je echt wilt status in te stellen die u moet gebruiken databank voor dat.En SenderID zal hetzelfde zijn elke keer blijven, zodat je kunt omgaan met de gegevens uit de database van die bepaalde id voor bepaalde gebruiker.

Voor meer informatie kassa technische referance hier .

Ik hoop dat dit zal you.if zo helpen, vriendelijk markeren als een antwoord.

antwoordde op 07/09/2016 om 06:40
bron van user

stemmen
8

Wanneer uw app een bericht ontvangt, is er geen payload of metadata die ermee verbonden zijn. Dit is in tegenstelling tot een quick-reply of post-back, die een nuttige lading kan hebben. De enige manier om een ​​antwoord met een vraag is om het gesprek staat in uw app handmatig bijhouden zoals voorgesteld door @ Anshuman-dhamoon associëren

Om dit te doen, is het best om een ​​status te behouden voor elke gebruiker, evenals de volgende toestand voor elke staat.

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

Opmerking Als je wilde, kunt u zelfs de waarden van te maken nextStatesin callable functies die het antwoord van de huidige stand te nemen en vertakken in verschillende conversatie stroomt door het passeren van de gebruiker naar een andere staat afhankelijk van zijn / haar reactie.

antwoordde op 14/04/2017 om 03:37
bron van user

stemmen
1

Ik heb wat tijd besteed aan het werken met dit. De beste oplossing is om een ​​database te gebruiken om de gebruiker gesprek stroom te volgen. De POST object bevat de afzenders ID. U kunt deze ID gebruiken om een ​​rij te maken in de database waarin u zou zeker nodig hebt om dit ID, geen antwoorden op de vragen op te slaan, en een veld om bij te houden van welke stap in het gesprek te houden.

Dan kunt u gebruiken als statements in de code om de juiste antwoorden terug. Enkele voorbeelden onderstaande code:

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

}
antwoordde op 21/12/2017 om 20:26
bron van user

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