2

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

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

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 я сказал, глядя в пакетном процессе, который может быть найден developers.facebook.com/docs/graph-api/making-multiple-requests озаглавленные под загрузив двоичные данные. Единственное, что бьет и дает мне надежду, - это одно утверждение.

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

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

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

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

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

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

Thanks, Ravi

ответ

-1

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

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

Первый намек, что я получил, что это может быть возможным с этой post

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

  1. Следуйте за документ, чтобы создать custom open graph stories
  2. Давайте предположим, что вам четыре изображения прикрепить (рис [1, 2, 3, 4])
  3. Сначала я поставил их с помощью новой facebook-node-sdkv1.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); 
        } 
    ); 
    

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

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

Спасибо, Ravi

0

я, наконец, понял, как.

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

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

Так или иначе, вот рабочий код - в JavaScript, и с «опубликован» правильно установлен неверно:

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); 
Смежные вопросы