Размещение нескольких фотографий в одном посте

Я пытался создать приложение, которому нужно прикрепить несколько фотографий к одному сообщению. Это следующие попытки, которые я пробовал,

Сначала я использовал facebook-node-sdk, который JS SDK для достижения другой функциональности, но официальный Js У Sdk нет возможности загрузки файла, когда я перешел к прикреплению/вставке самой фотографии в HTTP POST с помощью form-data со следующим кодом:

    var form = new FormData();
    form.append('file', fs.createReadStream(picPaths[0]));
    form.append('message', "Hello"); //Put message
    var ACCESS_TOKEN = "ACCESS_TOKEN";
    var options = {
        method: 'post',
        host: 'graph.facebook.com',
        path:  '{Object-ID}/photos' + '?access_token=' + ACCESS_TOKEN,
        headers: form.getHeaders(),
    }

    var request = https.request(options, function(res) {
        console.log(res, false, null);
    });

    form.pipe(request);

    request.on('error', function(error) {
        console.log(error);
    });

Это работает с одной фотографией.

Но, как вы можете видеть на этом github.com/Thuzi/facebook-node-sdk/issues/113, который я начал, невозможно прикрепить более одной фотографии.

Итак, как упомянул dantman, я сказал, что просматриваю пакетный процесс, который можно найти на сайте developer.facebook.com/docs/graph-api/making-multiple-requests под названием Загрузка двоичных данных. Единственное, что поражает и вселяет в меня надежду, — это одно заявление.

Свойство attach_files может принимать в качестве значения список имен вложений, разделенных запятыми.

Примечание (пакетная обработка фотографий) также невозможна с этой библиотекой или JS SDK (пожалуйста, поправьте меня, если я ошибаюсь)

Вы можете публиковать изображения с помощью curl, как это,

curl -F 'access_token=ACCESS_TOKEN' -F 'batch=[{"method":"POST","relative_url":"{Object-Id}/photos","body":"message=Test Post","attached_files":"file1"}]' -F 'file1=@image1' -F 'file2=@image2' https://graph.facebook.com

Приведенный выше код сообщения с одним изображением

Итак, мой вопрос заключается в следующем: можно прикрепить к сообщению несколько изображений/бинарных_файлов с помощью curl, что-то вроде ..."attached_files":"file1,file2"..., как это предлагается в документах, пожалуйста, помогите мне с этой проблемой, и если вы уже сделали это, не могли бы вы опубликовать снимок вашего кода.

Спасибо, Рави.


person Ravi Ojha    schedule 07.01.2016    source источник


Ответы (2)


Наконец-то я понял, как.

Итак, сначала прочитайте здесь раздел под названием «Публикация публикации с несколькими фотографиями с загруженными фотографиями»: https://developers.facebook.com/docs/graph-api/reference/page/photos/#Creating

То, что он говорит, в основном правильно, однако это не в JavaScript. Кроме того, они недостаточно подчеркивают важный шаг: вы должны установить «опубликовано» на «ложь» для загружаемого изображения, чтобы его можно было прикрепить к создаваемому сообщению.

Так или иначе, вот рабочий код - в JavaScript, и для параметра "published" правильно установлено значение false:

async function PostImageToFacebook(token, filename, mimeType, imageDataBlob, message) {
    var fd = new FormData();
    fd.append("access_token", token);
    fd.append("source", imageDataBlob);
    //fd.append("message", "photo message for " + filename);
    fd.append("no_story", "true");
    //fd.append("privacy", "SELF");
    fd.append("published", "false");

    // Upload image to facebook without story(post to feed)
    let uploadPhotoResponse = await $.ajax({
         url: "https://graph.facebook.com/me/photos?access_token=" + token,
         type: "POST",
         data: fd,
         processData: false,
         contentType: false,
         cache: false
    });
    console.log(`Uploaded photo "${filename}": `, uploadPhotoResponse);

    let uploadPhotoResponse2 = await $.ajax({
        url: "https://graph.facebook.com/me/photos?access_token=" + token,
        type: "POST",
        data: fd,
        processData: false,
        contentType: false,
        cache: false
  });
  console.log(`Uploaded photo "${filename}": `, uploadPhotoResponse2);

    let makePostResponse = await $.ajax({
        "async": true,
        "crossDomain": true,
        "url": "https://graph.facebook.com/v2.11/me/feed",
        "method": "POST",
        "headers": {
            "cache-control": "no-cache",
            "content-type": "application/x-www-form-urlencoded"
        },
        "data": {
            "message": "Testing multi-photo post2!",
            "attached_media[0]": `{"media_fbid":${uploadPhotoResponse.id}}`,
            "attached_media[1]": `{"media_fbid":${uploadPhotoResponse2.id}}`,
            "access_token": token
        }
    });
    console.log(`Made post: `, makePostResponse);
}

Приведенный выше код в настоящее время просто загружает одно и то же изображение дважды, а затем прикрепляет оба изображения к новому сообщению. Очевидно, что в реальном мире вы замените данные во второй загрузке фотографии другим изображением.

В любом случае, чтобы использовать функцию, просто вызовите ее так:

function dataURItoBlob(dataURI) {
    var byteString = atob(dataURI.split(",")[1]);
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
         ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ab], {type: "image/png"});
}

let imageDataURI = GetImageDataURIFromSomewhere();
let imageBlob = dataURItoBlob(imageDataURI);

PostImageToFacebook(fbToken, "some_filename", "image/png", imageBlob, window.location.href);
person Venryx    schedule 05.12.2017

это возможно.

Примечание. Это неэффективный способ сделать это, а только для того, чтобы объяснить цель, которую я здесь делаю,

Первый намек на то, что это возможно, я получил из этого post< /а>

Шаги, которые я использовал:

  1. Следуйте документу, чтобы создавать индивидуальные истории Open Graph.
  2. Предположим, вам нужно прикрепить четыре изображения (pic[1, 2, 3, 4])
  3. Сначала я поставил их с помощью новых facebook-node-sdk v1.1.0-alpha1 с примерно таким кодом (с пакетным процессом).

    FB.api( "", "post", {
        batch: [
        {
            method: "POST",
            relative_url: "me/staging_resources",
            attached_files: "file1",
            type:"image/png"
        }, {
            method: "POST",
            relative_url: "me/staging_resources",
            attached_files: "file2",
            type:"image/png"
        }, {
            method: "POST",
            relative_url: "me/staging_resources",
            attached_files: "file3",
            type:"image/png"
        }, {
            method: "POST",
            relative_url: "me/staging_resources",
            attached_files: "file4",
            type:"image/png"
        }],
        file1: fs.createReadStream(picPaths[0]),
        file2: fs.createReadStream(picPaths[1]),
        file3: fs.createReadStream(picPaths[2]),
        file4: fs.createReadStream(picPaths[3])
    },
    function(response) {
        console.log(response);
    });
    
  4. Теперь из ответной части получите url и удалите сообщение с той же библиотекой. С кодом примерно так.

    FB.api(
        "me/objects/{app-namespace}:{custom-object}",
        "post", {
            "object": {
                "og:title": "Sample Post",
                "og:image[0]": {
                    "url": "fbstaging:{...}",
                    "user_generated": true
                },
                "og:image[1]": {
                    "url": "fbstaging:{...}",
                    "user_generated": true
                },
                "og:image[2]": {
                    "url": "fbstaging:{...}",
                    "user_generated": true
                },
                "og:image[3]": {
                    "url": "fbstaging:{...}",
                    "user_generated": true
                }
            }
        },
        function(response) {
            console.log(response);
        }
    );
    

Теперь с помощью этих двух фрагментов кода вы сможете добавлять несколько изображений/фотографий в один пост.

Примечание: это может иметь больше смысла или может быть выполнено с помощью именованного пакетного процесса, который описывается здесь.

Спасибо, Рави.

person Ravi Ojha    schedule 26.01.2016