Javascript 将多张照片发布到一个帖子

Javascript 将多张照片发布到一个帖子,javascript,node.js,facebook-graph-api,curl,facebook-node-sdk,Javascript,Node.js,Facebook Graph Api,Curl,Facebook Node Sdk,我一直在尝试创建一个应用程序,需要将多张照片附加到一个帖子。以下是我尝试过的尝试 首先,我使用了哪个JS SDK来实现不同的功能,但官方JS SDK没有文件上传选项,然后我在表单数据的帮助下将照片本身附加/插入到HTTP POST,代码如下- var form = new FormData(); form.append('file', fs.createReadStream(picPaths[0])); form.append('message', "Hello"); /

我一直在尝试创建一个应用程序,需要将多张照片附加到一个帖子。以下是我尝试过的尝试

首先,我使用了哪个JS SDK来实现不同的功能,但官方JS SDK没有文件上传选项,然后我在
表单数据的帮助下将照片本身附加/插入到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所提到的,我在batch process中进行了查找,可以在developers.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
上面的代码用一个图像发布

因此,我的问题是,在curl的帮助下,可以将多个图像/二进制文件附加到文章中,类似于
…“attached\u files”:“file1,file2”…
正如docs建议的那样,请帮助我解决这个问题,如果您已经这样做了,请发布代码的快照

谢谢,拉维,这是可能的

注意:这不是一种有效的方法,只是为了解释我在这里的目的

我得到的第一个暗示是,这是可能的

我使用的步骤:

  • 按照文档进行创建
  • 让我们假设您要附加四个图像(图[1,2,3,4])
  • 首先,我使用新的
    facebook节点sdk
    v1.1.0-alpha1
    将它们放在舞台上,代码如下(使用批处理)

  • 现在从响应部分获取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);
        }
    );
    
  • 现在,通过这两段代码,您将能够将多个图像/照片推送到一篇文章中

    注意:这可能更有意义,或者可以借助正在描述的命名批处理过程来完成

    谢谢, 拉维这是可能的

    注意:这不是一种有效的方法,只是为了解释我在这里的目的

    我得到的第一个暗示是,这是可能的

    我使用的步骤:

  • 按照文档进行创建
  • 让我们假设您要附加四个图像(图[1,2,3,4])
  • 首先,我使用新的
    facebook节点sdk
    v1.1.0-alpha1
    将它们放在舞台上,代码如下(使用批处理)

  • 现在从响应部分获取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);
        }
    );
    
  • 现在,通过这两段代码,您将能够将多个图像/照片推送到一篇文章中

    注意:这可能更有意义,或者可以借助正在描述的命名批处理过程来完成

    谢谢,
    拉维

    我终于想出了办法

    因此,首先,请阅读此处标题为“发布带有上传照片的多张照片帖子”的部分:

    它所说的基本上是正确的,但是,它不是JavaScript。此外,他们没有充分强调一个重要的步骤:您必须将上载的图像的“published”设置为“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);
    
    函数dataURItoBlob(dataURI){ var byteString=atob(dataURI.split(“,”[1]); var ab=新阵列缓冲区(byteString.length); var ia=新的UINT8阵列(ab); for(var i=0;i
    我终于想出了办法

    因此,首先,请阅读此处标题为“发布带有上传照片的多张照片帖子”的部分:

    它所说的基本上是正确的,但是,它不是JavaScript。此外,他们没有充分强调一个重要的步骤:您必须将上载的图像的“published”设置为“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);
    
    函数dataURItoBlob(dataURI){ var byteString=atob(dataURI.split(“,”[1]); var ab=新阵列缓冲区(byteString.length); var ia=新的UINT8阵列(ab); for(var i=0;i