Что такое правильный путь для сохранения / состояния дорожки внутри бота Facebook Messenger?

голоса
8

Если мой бот задают разные вопросы, и если пользователь отвечает на каждый из них, как я могу узнать, какой ответ относится к какому вопросу. Существует поле называемые метаданные, которые вы можете прикрепить к API sendTextMessage но когда пользователь отвечает, что эти метаданные приходит как неопределенные. Как вы, ребята, использовать любой узел-кэш для отслеживания состояния или конечного автомата, таких как machina.js? Как я могу лучше всего выяснить, в какой из разговора мы в настоящее время застрял в?

Задан 22/08/2016 в 09:11
источник пользователем
На других языках...                            


5 ответов

голоса
2

Вы можете иметь код состояния в вашем коде, чтобы отслеживать, где пользователь разговор с ботом.

Для например. если у вас есть 10 вопросов, держать StatusCode = 0 на начальном этапе, и задать первый вопрос. Когда вы получите сообщение на webhook, проверьте StatusCode == 0, и сохранить это сообщение пользователя в ответ на ваш первый вопрос. Тогда приращение StatusCode = 1 и задать следующий вопрос.

Вы можете иметь несколько флагов и statusCodes для борьбы с различными потоками разговора.

Ответил 30/08/2016 в 10:52
источник пользователем

голоса
1

Я бегу в этот вопрос сам. Хотя это не упоминается в их документации, я не думаю , что прикрепление база данных в оперативной памяти , не может быть и речи. Кажется , что user_idодно и то же , независимо от того, когда начинается разговор.

Выполнение вызова API каждый раз, когда пользователь возвращается на сессии, вероятно, замедлить производительность бота. Кроме того, я заметил, что вы не можете построить «псевдо-распределенной базы данных» с использованием ключа метаданных в API, если это то, что вы предлагали. Тег метаданных может быть отправлено с сервера -> Client (Messenger), а не от клиента -> Сервер от того, что сказано в документации.

Ответил 02/09/2016 в 19:55
источник пользователем

голоса
2

По моим сведениям , в Facebook Chatbot вы можете передавать данные от пользователя к Chatbot , просто установив полезную нагрузку от кнопки обратной передачи , как они приведены в справочнике API .

И Chatbot не будет хранить вашу сессию или любые флаги штатов / .Вы можете установить статус или флаги или массивы , но все они будут потеряны при обновлении приложения или перезагрузить сервер.

поэтому, если вы действительно хотите установить статус , вы должны использовать базу данных для that.and SenderId будет оставаться такими же каждый раз, так что вы можете работать с данными из базы данных с помощью этого конкретного идентификатора для конкретного пользователя.

Для получения более подробной информации проверка технического Referance здесь .

Я надеюсь, что это поможет you.if так, пожалуйста отметьте его в качестве ответа.

Ответил 07/09/2016 в 06:40
источник пользователем

голоса
8

Когда ваше приложение получает сообщение, нет полезной нагрузки или метаданных, связанной с ним. Это в отличие от быстрого ответа или пост-спины, которая может иметь полезную нагрузку. Единственный способ связать ответ на вопрос это вручную отслеживать состояние разговора в вашем приложении, как было предложено @ Anshuman-dhamoon

Чтобы сделать это, то лучше поддерживать состояние для каждого состояния каждого пользователя, а также следующего состояния.

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

Примечание Если вы хотите, вы можете даже сделать значение nextStatesв ГОО функций , которые принимают ответ текущего состояния и ответвляетесь в разные потоках разговора, передавая пользователь в другое состояние , в зависимости от его / ее ответа.

Ответил 14/04/2017 в 03:37
источник пользователем

голоса
1

Я провел некоторое время, работая с этим. Наилучшим решением является использование базы данных для отслеживания потока разговора пользователя. Объект POST содержит идентификатор отправителей. Вы можете использовать этот идентификатор, чтобы сделать строку в базе данных, в которой вы определенно должны сохранить этот идентификатор, любые ответы на вопросы, и поле для отслеживания которых шаг в разговоре.

Затем вы можете использовать, если заявления в своем коде, чтобы вернуть правильные ответы. Некоторые примеры кода ниже:

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

}
Ответил 21/12/2017 в 20:26
источник пользователем

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