2016-08-22 8 views
8

यदि मेरा बॉट अलग-अलग प्रश्न पूछता है और यदि उपयोगकर्ता उनमें से प्रत्येक का जवाब देता है, तो मैं कैसे पता लगा सकता हूं कि कौन सा उत्तर संबंधित प्रश्न से संबंधित है। मेटाडेटा नामक एक फ़ील्ड है जिसे आप sendTextMessage API से जोड़ सकते हैं लेकिन जब उपयोगकर्ता प्रतिसाद देता है, तो यह मेटाडेटा अनिर्धारित में आता है। क्या आप लोग राज्य या एफएसएम जैसे machina.js के लिए किसी नोड-कैश का उपयोग करते हैं? वर्तमान में हम किस बातचीत में फंस गए हैं, इस बारे में मैं सबसे अच्छा कैसे पता लगा सकता हूं?फेसबुक मैसेंजर बॉट के अंदर राज्य को सहेजने/ट्रैक करने का सही तरीका क्या है?

उत्तर

2

आपके पास बॉट के साथ उपयोगकर्ता बातचीत कहां है, इसका ट्रैक रखने के लिए आपके पास कोड कोड हो सकता है।

उदाहरण के लिए। यदि आपके पास 10 प्रश्न हैं, तो शुरुआत में स्थिति कोड = 0 रखें, और पहले प्रश्न पूछें। जब आपको अपने वेबहूक पर कोई संदेश प्राप्त होता है, तो स्थिति स्थिति == 0 जांचें, और उस उपयोगकर्ता संदेश को अपने पहले प्रश्न के उत्तर के रूप में संग्रहीत करें। फिर वृद्धि स्थिति कोड = 1 और अगले प्रश्न पूछें।

अलग-अलग वार्तालाप प्रवाह से निपटने के लिए आपके पास एकाधिक झंडे और स्थिति कोड हो सकते हैं।

1

मैं इस मुद्दे में खुद को चला रहा हूं। यद्यपि इसका उल्लेख उनके दस्तावेज़ीकरण में नहीं किया गया है, लेकिन मुझे नहीं लगता कि इन-मेमोरी डेटाबेस को अटैचमेंट करना सवाल से बाहर है। ऐसा लगता है कि user_id बातचीत की शुरूआत के बावजूद समान है।

हर बार जब उपयोगकर्ता सत्र को दोबारा जोड़ता है तो एपीआई कॉल करना संभवतः बॉट के प्रदर्शन को धीमा कर देगा। साथ ही, मैंने देखा है कि यदि आप सुझाव दे रहे थे तो आप एपीआई में मेटाडेटा कुंजी का उपयोग करके वास्तव में "छद्म-वितरित डेटाबेस" नहीं बना सकते हैं। मेटाडाटा टैग सर्वर -> क्लाइंट (मैसेंजर) से भेजा जा सकता है लेकिन क्लाइंट से नहीं -> सर्वर जो दस्तावेज कहता है उससे।

+0

सच है, अब तक कोई भाग्य? डीबी राज्य को बचाने का एकमात्र तरीका है? – Rusty

2

मेरी जानकारी के अनुसार, फेसबुक chatbot में आप डेटा उपयोगकर्ता से chatbot करने के लिए सिर्फ पोस्टबैक बटन से पेलोड की स्थापना के रूप में वे API reference में दे दिया है द्वारा भेज सकते हैं।

और chatbot अपने सत्र या किसी राज्य/झंडे संग्रहीत नहीं करेगा है.आप स्थिति या झंडे या सरणियों सेट कर सकते हैं लेकिन सभी जब आप अपने आवेदन को अपडेट करने या अपने सर्वर को पुनः आरंभ खो जाएगा।

हां, तो आप है.और SenderID के लिए डेटाबेस का उपयोग करना चाहिए एक ही हर रहेगा ताकि आप विशेष उपयोगकर्ता के लिए है कि विशेष आईडी द्वारा डेटाबेस से डेटा संभाल कर सकते हैं क्या तुम सच में स्थिति सेट करना चाहते हैं।

अधिक जानकारी के लिए चेकआउट technical referance here

मुझे उम्मीद है कि यह आपकी मदद करेगा। अगर ऐसा है, तो कृपया इसे उत्तर के रूप में चिह्नित करें।

+0

मेटाडाटा काम नहीं करता है, यह अपरिभाषित करता है, मैंने इसे – PirateApp

+0

पोस्टबैक –

+0

के साथ बस पेलोड में डेटा पास किया है मेटाडाटा केवल तब ही लौटाया जाता है जब आप गूंज की सदस्यता लेते हैं, इसका उपयोग क्या है मुझे स्पष्ट नहीं है - https: // developers.facebook.com/docs/messenger-platform/webhook-reference/message-echo – Rusty

8

जब आपके ऐप को कोई संदेश प्राप्त होता है, तो इसमें कोई पेलोड या मेटाडेटा नहीं होता है। यह एक त्वरित उत्तर या पोस्ट-बैक के विपरीत है जिसमें एक पेलोड हो सकता है। एक प्रश्न के साथ प्रतिक्रिया को जोड़ने का एकमात्र तरीका यह है कि @ एशुमान-धामून

द्वारा सुझाए गए अनुसार आपके ऐप में वार्तालाप स्थिति को मैन्युअल रूप से ट्रैक करना है, ऐसा करने के लिए, प्रत्येक उपयोगकर्ता के लिए एक राज्य को बनाए रखना सर्वोत्तम है, साथ ही साथ प्रत्येक राज्य के लिए अगला राज्य।

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

} 
संबंधित मुद्दे