2016-05-09 4 views
4

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

+0

Привет и добро пожаловать в SO. Пожалуйста, убедитесь, что вы [прочитайте это] (http://stackoverflow.com/help/mcve) и попытайтесь улучшить свой вопрос. Это облегчит для других понимание этого и поможет вам. –

+0

https://developers.facebook.com/docs/messenger-platform/webhook-reference#received_message имеет пример того, как выглядит структура данных JSON для сообщения с вложением. – CBroe

ответ

6

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

FYI Я не уверен, что этот ответ устарел сейчас. Я делаю боттон facebook с помощью ClaudiaJS, а его бэкэнд - шлюз лямбда/api. Для меня теперь то, что содержит изображение: 'request.message.attachments [0] .payload.url'. – SMT

0

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

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

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

UPDATE:

выше ссылка сломана 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.

1

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

структура выглядит следующим образом:

Вложения Object> JSON ответ> Тип & 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) 
    } 
    } 

Надеется, что это помогает, Julian

1

В то время как в PYTHON получить и сохранить вложение изображения в вашей facebook Chatbot работы:

@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

0

В 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']; 

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