【问题标题】:Posting multiple Photos to one post将多张照片发布到一个帖子
【发布时间】:2016-04-11 12:55:42
【问题描述】:

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

首先我使用facebook-node-sdk 哪个JS SDK 来实现不同的功能,但是官方Js Sdk 没有文件上传选项,然后我在@987654322 的帮助下将照片本身附加/插入到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 所提到的,我说在批处理中查找,可以在上传二进制数据下找到标题为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 的帮助下将多个图像/二进制文件附加到帖子中,就像 docs 建议的 ..."attached_files":"file1,file2"... 一样,请帮助我解决这个问题,如果你已经这样做了可以请张贴您的代码快照。

谢谢,拉维

【问题讨论】:

    标签: javascript node.js facebook-graph-api curl facebook-node-sdk


    【解决方案1】:

    我终于想通了。

    首先,请阅读此处标题为“发布包含已上传照片的多照片帖子”的部分: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);
    

    【讨论】:

      【解决方案2】:

      这是可能的。

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

      我得到的第一个提示可能是来自post

      我使用的步骤:

      1. 按照文档创建custom open graph stories
      2. 假设您要附加四张图片 (pic[1, 2, 3, 4])
      3. 首先,我在新的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);
        });
        
      4. 现在从响应部分获取 url 并使用相同的 library 发布帖子。使用类似这样的代码。

        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 描述的命名批处理来完成。

      谢谢, 拉维

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        相关资源
        最近更新 更多