2016-08-22 4 views
8

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

ответ

2

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

Для примера. если у вас есть 10 вопросов, сначала сохраните statuscode = 0 и задайте первый вопрос. Когда вы получаете сообщение на свой веб-чек, проверьте, является ли statuscode == 0, и сохраните это сообщение пользователя в ответ на свой первый вопрос. Затем увеличьте statusCode = 1 и задайте следующий вопрос.

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

1

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

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

+0

Действительно, Любая удача до сих пор? Является ли db единственным способом сохранения состояния? – Rusty

2

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

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

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

Подробнее о заказе technical referance here.

Надеюсь, это поможет вам. Если так, пожалуйста, отметьте это как ответ.

+0

metadata не работает, он возвращает undefined, я пробовал его – PirateApp

+0

просто передал данные в полезной нагрузке в кнопке с обратной передачей –

+0

метаданные возвращаются только при подписке на эхо, для чего мне это не понятно - https: // developers.facebook.com/docs/messenger-platform/webhook-reference/message-echo – Rusty

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 в ГОО функций, которые принимают ответ текущего состояния и ответвляются в другой разговор течет, передавая пользователь другого состояния в зависимости от его/ее ответ.

1

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

Затем вы можете использовать операторы if в своем коде для возврата правильных ответов. Пример кода ниже:

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

}