Как получить изображение в боте Facebook Messenger

Как я могу получить вложение в виде изображения через API Facebook Messenger? Их документация содержит только инструкции о том, как получать текстовые сообщения.

5 ответов

Я не уверен, какой язык вы используете для кодирования своего бота, но поскольку вы ссылаетесь на документы Facebook, где большинство фрагментов кода мессенджера находятся в 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);
    }
   }
  }      
 }

Находясь в 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)

хорошая чатбот-вещь! Marco

В феврале 2017 года я столкнулся с той же проблемой и очень долго пытался ее запустить. Оказывается, что message.attachments приходит как объект, где фактическое вложение находится внутри объекта.

Структура выглядит так:

Объект вложений> Ответ JSON> Тип и полезная нагрузка> 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)
    } 
  }

Надеюсь, это поможет, Джулиан

В PHP

Когда пользователь отправляет его боту, ниже ответа мы получаем, который содержит вложение type а также url

{
  "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'];

Надеюсь, это поможет вам

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

Проверьте эту ссылку.

В нем говорится, что "к сообщениям может быть прикреплено изображение, видео или аудио".

ОБНОВИТЬ:

Приведенная выше ссылка не работает, поскольку 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.

Другие вопросы по тегам