Если мой бот задают разные вопросы, и если пользователь отвечает на каждый из них, как я могу узнать, какой ответ относится к какому вопросу. Существует поле называемые метаданные, которые вы можете прикрепить к API sendTextMessage но когда пользователь отвечает, что эти метаданные приходит как неопределенные. Как вы, ребята, использовать любой узел-кэш для отслеживания состояния или конечного автомата, таких как machina.js? Как я могу лучше всего выяснить, в какой из разговора мы в настоящее время застрял в?
Что такое правильный путь для сохранения / состояния дорожки внутри бота Facebook Messenger?
Вы можете иметь код состояния в вашем коде, чтобы отслеживать, где пользователь разговор с ботом.
Для например. если у вас есть 10 вопросов, держать StatusCode = 0 на начальном этапе, и задать первый вопрос. Когда вы получите сообщение на webhook, проверьте StatusCode == 0, и сохранить это сообщение пользователя в ответ на ваш первый вопрос. Тогда приращение StatusCode = 1 и задать следующий вопрос.
Вы можете иметь несколько флагов и statusCodes для борьбы с различными потоками разговора.
Я бегу в этот вопрос сам. Хотя это не упоминается в их документации, я не думаю , что прикрепление база данных в оперативной памяти , не может быть и речи. Кажется , что user_idодно и то же , независимо от того, когда начинается разговор.
Выполнение вызова API каждый раз, когда пользователь возвращается на сессии, вероятно, замедлить производительность бота. Кроме того, я заметил, что вы не можете построить «псевдо-распределенной базы данных» с использованием ключа метаданных в API, если это то, что вы предлагали. Тег метаданных может быть отправлено с сервера -> Client (Messenger), а не от клиента -> Сервер от того, что сказано в документации.
По моим сведениям , в Facebook Chatbot вы можете передавать данные от пользователя к Chatbot , просто установив полезную нагрузку от кнопки обратной передачи , как они приведены в справочнике API .
И Chatbot не будет хранить вашу сессию или любые флаги штатов / .Вы можете установить статус или флаги или массивы , но все они будут потеряны при обновлении приложения или перезагрузить сервер.
поэтому, если вы действительно хотите установить статус , вы должны использовать базу данных для that.and SenderId будет оставаться такими же каждый раз, так что вы можете работать с данными из базы данных с помощью этого конкретного идентификатора для конкретного пользователя.
Для получения более подробной информации проверка технического Referance здесь .
Я надеюсь, что это поможет you.if так, пожалуйста отметьте его в качестве ответа.
Когда ваше приложение получает сообщение, нет полезной нагрузки или метаданных, связанной с ним. Это в отличие от быстрого ответа или пост-спины, которая может иметь полезную нагрузку. Единственный способ связать ответ на вопрос это вручную отслеживать состояние разговора в вашем приложении, как было предложено @ 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в ГОО функций , которые принимают ответ текущего состояния и ответвляетесь в разные потоках разговора, передавая пользователь в другое состояние , в зависимости от его / ее ответа.
Я провел некоторое время, работая с этим. Наилучшим решением является использование базы данных для отслеживания потока разговора пользователя. Объект 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.'"';
}













