我一直在尝试创建一个需要将多张照片附加到一个帖子的应用程序。这些是我尝试过的以下尝试,
首先,我使用了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
提到的那样,我说在批处理过程中,可以找到标题为上传二进制数据的developers.facebook.com/docs/graph-api/making-multiple-requests 。打击并给予我希望的一件事是这一个声明。
attachment_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的帮助下将多个图像/ binary_files附加到帖子上,如文档建议的那样..."attached_files":"file1,file2"...
,请帮我解决这个问题,如果你已经完成了您可以发布代码的快照。
谢谢,拉维
答案 0 :(得分:0)
我终于弄明白了。
首先,请阅读标题为&#34的部分;发布带有上传照片的多照片帖子":https://developers.facebook.com/docs/graph-api/reference/page/photos/#Creating
它说的基本上是正确的,但它不是在JavaScript中。此外,他们没有强调足够重要的一步:你必须设置"发布"到"假"对于您上传的图像,它可以附加到创建的帖子上。
所以无论如何,这是工作代码 - 用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);
}
上面的代码目前只上传了两次相同的图片,然后将两者都附加到新帖子上。显然,在实际使用中,您将使用不同的图像替换第二张照片上传中的数据。
无论如何,要使用该功能,只需这样调用:
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 :(得分:-1)
这是可能的。
注意:这个不是一种有效的方法,只是为了解释我在这里做的目的,
我得到的第一个提示可能来自post
我使用的步骤:
首先,我在新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);
});
现在从响应部分获取 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。
谢谢, 拉维