【问题标题】:How to receive an image in a Facebook Messenger bot如何在 Facebook Messenger 机器人中接收图像
【发布时间】:2016-09-04 03:58:51
【问题描述】:

如何通过 Facebook Messenger API 接收图片形式的附件? 他们的文档仅提供有关如何接收基于文本的消息的说明。

【问题讨论】:

标签: facebook bots messenger


【解决方案1】:

我不确定您使用什么语言来编写您的机器人,但因为您指的是 facebook 文档,其中大多数信使代码 sn-ps 都在 node.js 中 这里有一些东西供你尝试,如果有帮助,请告诉我。

app.post('/webhook/', function (req, res) {
 //Getting the mesagess
 var messaging_events = req.body.entry[0].messaging;
  //Looping through all the messaging events
  for (var i = 0; i < messaging_events.length; i++) {
   var event = req.body.entry[0].messaging[i];
   //Checking for attachments
   if (event.message.attachments) {
    //Checking if there are any image attachments 
    if(atts[0].type === "image"){
     var imageURL = atts[0].payload.url;
     console.log(imageURL);
    }
   }
  }      
 }

【讨论】:

  • 仅供参考,我不确定这个答案现在是否已过时。我正在使用 ClaudiaJS 制作一个 facebook 机器人,它的后端是 lambda/api 网关。对我来说,现在包含图像的是:request.message.attachments[0].payload.url.
【解决方案2】:

2017 年 2 月,我遇到了同样的问题,并且在很长一段时间内都在努力解决这个问题。原来message.attachments 作为对象出现,实际附件在对象内。

结构如下:

附件对象 > JSON 响应 >Type & Payload > URL

app.post('/webhook/', function(req, res) {

  let messaging_events = req.body.entry[0].messaging

  for (let i = 0; i < messaging_events.length; i++) {
    let event = req.body.entry[0].messaging[i]
    let sender = event.sender.id

    // Check if it's a message
    if (event.message) {

      //Create the attachment
      let attachment = event.message.attachments

      // Here we access the JSON as object
      let object1 = attachment[0];

      //Here we access the payload property 
      let payload = object1.payload;

      // Finally we access the URL
      let url = payload.url;

      console.log(url)
    }         
    else if (event.message && event.message.text) {
       // Here you can handle the text 
       console.log("Just Text")
    } 

   }        
  res.sendStatus(200)
})

没有解释的更紧凑的版本如下所示:

  if (event.message) {
    let attachment = event.message.attachments
    console.log(attachment[0].payload.url)
  }

作为额外的奖励,您还可以检查类型是否为图像。您可以通过添加此调整来实现:

  if (event.message && ) {
    let attachment = event.message.attachments[0]
    if (attachment.type === "image") {
        console.log(attachment.payload.url)
    } 
  }

希望这会有所帮助, 朱利安

【讨论】:

    【解决方案3】:

    在 PYTHON 中接收图像附件并将其保存在您的 facebook 聊天机器人中:

    @app.route('/', methods=['POST'])
    def webhook():   # endpoint for processing incoming messaging events
    
    data = request.get_json()
    
    if data["object"] == "page":
    
        for entry in data["entry"]:
            for messaging_event in entry["messaging"]:
                 if messaging_event["message"].get("attachments"):
                     attachment_link = messaging_event["message"]["attachments"][0]["payload"]["url"]
                  print("Image received, boss!")
                  print(attachment_link)
    

    很好的聊天机器人! 马可

    【讨论】:

      【解决方案4】:

      在 PHP 中,

      当用户将其发送给机器人时,我们会得到下面的响应,其中包含附件 typeurl

      {
        "object": "page",
        "entry": [
          {
            "id": "000000000000000",
            "time": 1511956708068,
            "messaging": [
              {
                "sender": {
                  "id": "000000000000000"
                },
                "recipient": {
                  "id": "000000000000000"
                },
                "timestamp": 1511956707862,
                "message": {
                  "mid": "mid.$xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                  "seq": 42172,
                  "sticker_id": 369239263222822,
                  "attachments": [
                    {
                      "type": "image",
                      "payload": {
                        "url": "https:\/\/scontent.xx.fbcdn.net\/v\/t39.1997-6\/851557_369239266556155_759568595_n.png?_nc_ad=z-m&_nc_cid=0&oh=9058fb52f628d0a6ab92f85ea310db0a&oe=5A9DAADC",
                        "sticker_id": 369239263222822
                      }
                    }
                  ]
                }
              }
            ]
          }
        ]
      }
      

      这是您从用户那里获得不同类型消息的方式

      //get the response from user
      $input     = json_decode(file_get_contents('php://input'), true);
      
      //first check if attachment is present
      $attachment = array_key_exists('attachments', $input['entry'][0]['messaging'][0]['message']);
      
      //get the attachement type and url
      $type     = $input['entry'][0]['messaging'][0]['message']['attachments'][0]['type'];
      $file_url = $input['entry'][0]['messaging'][0]['message']['attachments'][0]['payload']['url'];
      

      希望对你有帮助

      【讨论】:

        【解决方案5】:

        https://developers.facebook.com/docs/messenger-platform/implementation#receive_message

        查看此链接。

        它说, “消息可能带有图像、视频或音频附件。”

        更新:

        上述链接已损坏,因为 Facebook 最近将其文档更新为一个奇怪的降级版本,其中许多内容丢失。

        正如评论中指出的那样详细说明,当用户发送请求时,您的服务器将收到这样的json:

            {
                "mid": "some mid",
                "seq": 26,
                "attachments": [{
                    "type": "image",
                    "payload": {
                        "url": "some image url"
                    }
                }]
            }
        

        您也许可以创建一个下载函数来将图像下载到您的服务器。

        要使用这些数据,如上所述,您可以使用 webhook。

          app.post('/webhook', function (req, res) {
            var data = req.body;
            // Make sure this is a page subscription
            if (data.object == 'page') {
              console.log(data.entry);
              // 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) {
                  receivedMessage(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);
            }
          });
        
        
          function receivedMessage(event) {
            var senderID = event.sender.id;
            var recipientID = event.recipient.id;
            var timeOfMessage = event.timestamp;
            var message = event.message;
        
            if (senderID == PAGE_ID) {
              console.error("Sender is self.");
              return;
            }
        
            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.
        
        
            } else if (messageAttachments) {
              messageAttachments.forEach(function(messageAttachment) {
                var attachmentUrl = messageAttachment.payload.url;
                console.log("Received Attachment");
                download(attachmentUrl);
            }
          }
        

        此代码取自 Facebook 的示例代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-28
          • 1970-01-01
          • 2017-05-02
          • 2016-08-20
          • 1970-01-01
          • 2016-09-01
          • 2017-10-15
          • 1970-01-01
          相关资源
          最近更新 更多