node.js / Youtube API / Upload



使用以下代码,我试图通过直接上传视频youtube。我已经有了访问令牌(auth_key)。我很确定我发送的post数据不正确…

function upload(auth_key, devKey, callback){
    fs.readFile('test.mp4', function(err, movie){
        var boundary = randomString();
        var xml =
            '<?xml version="1.0"?>' +
            '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">' +
            '<media:group>' + 
            '<media:title type="plain">Bad Wedding Toast</media:title>' +
            '<media:description type="plain">I gave a bad toast at my friends wedding.</media:description>' +
            '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>' +
            '<media:keywords>toast, wedding</media:keywords>' + 
            '</media:group>' + 
            '</entry>'
        ;
        var post_data = 
            '--' + boundary + 'n' +
            'Content-Type: application/atom+xml; charset=UTF-8' + 'n' +
            xml + 'n' +
            '--' + boundary + 'n' +
            'Content-Type: video/mp4' + 'n' +
            'Content-Transfer-Encoding: binary' + 'n' +
            movie + 'n' +
            '--' + boundary + '--' + 'n'
        ;   
        var options = {
          host: 'uploads.gdata.youtube.com',
          port: 443,
          path: '/feeds/api/users/default/uploads',
          method: 'POST',
            headers: {
                'Authorization:': 'GoogleLogin auth=' + auth_key,
                'GData-Version': '2',
                'X-GData-Key': 'key=' + devKey,
                'Slug': 'test.mp4',
                'Content-Type': 'multipart/related; boundary="' + boundary + '"',
                'Content-Length': post_data.length,
                'Connection': 'close'
            }
        }
        var req = https.request(options, function(res) {
            var response = '';
          res.on('data', function(chunk) {
                response += chunk;
          });
            res.on('end', function(){
                callback(response);
            });
        });
        if(post_data){
            req.write(post_data);
        }
        req.end();
        req.on('error', function(e) {
          console.error(e);
        });
    });
}

显示"无效请求"失败吗?

您的代码中有一些错误,html请求的语法缺少"rn"。您还应该使用http库和端口80。您的授权头无效,末尾不应包含":"。我认为你添加数据和计算内容长度的方式也把事情搞砸了。

我已经成功地用以下代码上传视频到youtube:

var file_reader = fs.createReadStream(file_path, {encoding: 'binary'});
var file_contents = '';
file_reader.on('data', function(data)
{
    file_contents += data;
});
file_reader.on('end', function()
{
    var xml =
        '<?xml version="1.0"?>' +
        '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">' +
        '   <media:group>' + 
        '       <media:title type="plain">' + title + '</media:title>' +
        '       <media:description type="plain">' + description + '</media:description>' +
        '       <media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">' + category + '</media:category>' +
        '       <media:keywords>' + keywords + '</media:keywords>' + 
        '   </media:group>' + 
        '</entry>';
    var boundary = Math.random();
    var post_data = [];
    var part = '';
    part = "--" + boundary + "rnContent-Type: application/atom+xml; charset=UTF-8rnrn" + xml + "rn";
    post_data.push(new Buffer(part, "utf8"));
    part = "--" + boundary + "rnContent-Type: video/mp4rnContent-Transfer-Encoding: binaryrnrn";
    post_data.push(new Buffer(part, 'ascii'));
    post_data.push(new Buffer(file_contents, 'binary'));
    post_data.push(new Buffer("rn--" + boundary + "--"), 'ascii');
    var post_length = 0;
    for(var i = 0; i < post_data.length; i++)
    {
        post_length += post_data[i].length;
    }
    var options = {
      host: 'uploads.gdata.youtube.com',
      port: 80,
      path: '/feeds/api/users/default/uploads?alt=json',
      method: 'POST',
        headers: {
            'Authorization': 'GoogleLogin auth=' + auth_key,
            'GData-Version': '2',
            'X-GData-Key': 'key=' + exports.developer_key,
            'Slug': 'video.mp4',
            'Content-Type': 'multipart/related; boundary="' + boundary + '"',
            'Content-Length': post_length,
            'Connection': 'close'
        }
    }
    var req = http.request(options, function(res)
    {
        res.setEncoding('utf8');
        var response = '';
        res.on('data', function(chunk)
        {
            response += chunk;
        });
        res.on('end', function()
        {
            console.log(response);
            response = JSON.parse(response);
            callback(response);
        });
    });
    for (var i = 0; i < post_data.length; i++)
    {
        req.write(post_data[i]);
    }
    req.on('error', function(e) {
      console.error(e);
    });
    req.end();
});

相关内容

  • 没有找到相关文章

最新更新