我收到消息:'(#100)找不到匹配的用户',当使用facebook messenger bot示例教程代码时

Eth*_*son 8 facebook bots node.js facebook-graph-api facebook-messenger

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

我在node.js控制台上输入错误并将其发送到机器人时收到错误.

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

我有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);
  }
}); 
Run Code Online (Sandbox Code Playgroud)

这是被调用的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");
  }
}
Run Code Online (Sandbox Code Playgroud)

这里还有我的要求声明:

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');
Run Code Online (Sandbox Code Playgroud)

以下是使用的其余功能:

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);
    }
  });  
}
Run Code Online (Sandbox Code Playgroud)

所以我在某处读到这一切都与页面ID或facebook处理int的方式有关,但我有点困惑.

任何帮助将非常感激.

小智 13

发生此错误的原因是使用了错误的令牌将消息发送回bot.确保您拥有正确的密码(即使首先进行硬编码),可以从Messenger - >设置 - >令牌生成下的developers.facebook.com页面复制.


Dan*_*ich 6

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

您的Bot有一个唯一的ID(它不是App ID),因此您可以在POST逻辑中尝试此解决方法:

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

您可以通过查看邮件来获取您的Bot ID:

"sender":{
    "id":"USER_ID"
  },
Run Code Online (Sandbox Code Playgroud)

消息已收到参考

JSON示例:

even.message: 
 {"sender":{"id":"**yourBotID**"},
   "recipient":{"id":"**clientID**"},
   "timestamp":1468241667962,
   "message":   {"**is_echo":true**,        
   "app_id":**appID**,
   "mid":"mid....",
   "seq":617,"text":"..."}}
Run Code Online (Sandbox Code Playgroud)

提示:识别您的BotID只需查找"message":{"is_echo":true,..在消息有效负载中.

问候


小智 6

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