Node.js post 通过 Graph 从 s3 到 Facebook 的视频 API

Node.js post video from s3 to Facebook via Graph API

我在 s3 上有一个视频文件,我想 post 到用户 Facebook 帐户:

https.get(signedUrlOfObjectInS3, function(httpRes){

    var form = new formData(); // that's form-data module https://github.com/felixge/node-form-data
    form.append('source', httpRes); 

    var options = {
        method: 'post',
        host: 'graph-video.facebook.com',
        path: '/me/videos?access_token=' + user_access_token,
        headers: form.getHeaders(),
    }

    var buffer = '';
    var apiCall = https.request(options, function (res){
        res.on('data',function(chunk){
            buffer += chunk; 
        });

        res.on('end',function(){
            var data = JSON.parse(buffer);
            console.log('data from fb is: ' + util.inspect(data));
        });
    });

    form.pipe(apiCall);

});

我从 Facebook 得到的回复是:

(#352) Sorry, the video file you selected is in a format that we don\'t support.

s3上的视频文件是内容类型为video/quicktime的mov文件。

下面的代码实际上对我来说工作得很好:

https.get(signedUrlOfObjectInS3, function(httpRes) {
    var form = new FormData(); // that's form-data module https://github.com/felixge/node-form-data
    form.append('source', httpRes);
    var options = {
        method: 'post',
        host: 'graph-video.facebook.com',
        path: '/me/videos?access_token=' + user_access_token,
        headers: form.getHeaders(),
    }

    var apiCall = https.request(options);

    form.pipe(apiCall);

    apiCall.on('response', function(res) {

        console.log(res.statusCode);
    });

});

尝试在 apiCall 回发中做出细微差别,

其他解释可能是我使用了 public 亚马逊 URL...

好的,显然 Facebook 忽略了 headers 中的内容类型并从文件名中猜测。例如,由于 s3 签名 url 没有以 filename.mov 结尾,所以它不明白...

我所要做的就是将“&f=filename.mov”连接到 signedUrl 的末尾,现在 Facebook 明白了...