我一直在尝试创建一个需要将多张照片附加到一个帖子的应用程序。这些是我尝试过的以下尝试,
首先我使用了facebook-node-sdk哪个 JS SDK 可以实现不同的功能,但是官方 Js SDK 没有上传文件的选项,然后我在 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
所提到的,我说要查看批处理过程,可以在标题为 Uploading binary 的 developers.facebook.com/docs/graph-api/making-multiple-requests 中找到数据。这句话给我带来了希望。
The attached_files property can take a comma separated list of attachment names in its value.
注意这个库或 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 的帮助下将多个图像/binary_files 附加到帖子,比如 ..."attached_files":"file1,file2"...
按照文档的建议,请帮助我解决这个问题,如果您已经这样做了,请发布您的代码快照。
谢谢拉维
最佳答案
我终于想通了。
因此,首先,请阅读此处标题为“使用上传的照片发布多张照片帖子”的部分:https://developers.facebook.com/docs/graph-api/reference/page/photos/#Creating
它说的基本上是正确的,但是它不是在 JavaScript 中。此外,他们没有足够强调一个重要步骤:您必须将上传的图片的“已发布”设置为“false”,然后才能将其附加到创建的帖子中。
所以无论如何,这里是工作代码——在 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);
关于javascript - 将多张照片发布到一个帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34649987/