发布多个照片到一个职位

我一直在试图创build一个应用程序,需要多张照片才能附加到一个post。 这些是我尝试过的以下尝试,

首先,我使用了JS SDK来实现不同function的Facebook-node-sdk ,但官方的Js Sdk没有file upload的选项,然后我通过form-data的帮助将附件/插入图片本身添加到HTTP POST ,用下面的代码 –

  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所说,我在批处理过程中提到,可以在上传二进制数据的标题下finddevelopers.facebook.com/docs/graph-api/making-multiple-requests。 有一件事给我带来希望,就是这一个说法。

attached_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 

上面的代码发布一个图像

所以我的问题是这样的,它可能附加多个图像/ binary_filescurl的帮助下,像..."attached_files":"file1,file2"...文档build议,请帮助我这个问题,如果你已经做到了这一点,你可以张贴你的代码的快照。

谢谢,拉维

我终于想通了。

因此,首先请阅读标题为“发布带有上传照片的多照片文章”的部分: https : //developers.facebook.com/docs/graph-api/reference/page/photos/#Creating

它说的基本上是正确的,但是,它不是在JavaScript中。 此外,他们没有强调足够的重要步骤:您必须将“已发布”设置为“上传”的图像为“假”,然后才能将其附加到创build的post上。

所以无论如何,这里是工作代码 – 在JavaScript中,与“发布”正确设置为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); } 

上面的代码目前只是上传相同的图像两次,然后附加到新的职位。 很明显,在现实世界中,你会用另一张图片replace第二张照片上传的数据。

无论如何,要使用这个函数,就像这样调用它:

 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); 

这个有可能。

注意:这不是一个有效的方法来做到这一点,只是为了解释我在这里做的事情,

我得到的第一个提示可能是从这篇文章

我使用的步骤:

  1. 按照文档来创build自定义的开放graphics故事
  2. 假设你有四张图片(图[1,2,3,4])
  3. 首先,我使用新的facebook-node-sdk v1.1.0-alpha1和类似的代码(使用批处理)来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); } ); 

现在,有了这两个代码,你将能够推送多个图像/照片到单个post。

注意:这可以更有意义,或者可以在这里描述的命名批处理的帮助下完成。

谢谢,拉维