使用node.js直接从服务器使用youtube / google API进行视频上传?

时间:2014-09-12 08:30:13

标签: node.js youtube google-api youtube-api google-api-nodejs-client

我正在尝试从服务器上传视频而无需用户在客户端进行任何手动身份验证。我尝试使用以下代码段进行视频上传,但它会在浏览器中对用户进行身份验证,并要求接受该应用。

var ResumableUpload = require('node-youtube-resumable-upload');
var googleauth = require('google-auth-cli');
var google = require('googleapis');

var getTokens = function(callback) {
  googleauth({
      access_type: 'offline',
      scope: 'https://www.googleapis.com/auth/youtube.upload' //can do just 'youtube', but 'youtube.upload' is more restrictive
  },
  {     client_id: CLIENT_ID, //replace with your client_id and _secret
      client_secret: CLIENT_SECRET,
      port: 3000
  },
  function(err, authClient, tokens) {
    console.log(tokens);
    callback(tokens);
  });
};

getTokens(function(result) {
  tokens = result;
  upload();
});



var upload = function() {
      var metadata = {snippet: { title: 'title', description: 'Uploaded with ResumableUpload' },
          status: { privacyStatus: 'public' }};
      var resumableUpload = new ResumableUpload(); //create new ResumableUpload
      resumableUpload.tokens = tokens;
      resumableUpload.filepath = 'youtube/test4.mp4';
      resumableUpload.metadata = metadata;
      resumableUpload.monitor = true;
    resumableUpload.eventEmitter.on('progress', function(progress) {
        console.log(progress);
    });
      resumableUpload.initUpload(function(result) {
        console.log(result);
        return;
      });
    }

但对于我的应用,它应该直接从服务器上传视频到youtube。为此,我需要访问令牌和刷新令牌,我尝试了直接获取访问令牌,但我无法得到它。

所以有关如何将视频直接从服务器上传到频道帐户的任何帮助或想法。我在谷歌搜索了一个节点模块,但是我无法找到它。

我一直在使用这种方法上传视频

  1. 使用客户端库获取基于Web的生成令牌。
  2. 获取用户对我的应用程序的youtube上传权限& ACCESS_TYPE =脱机。
  3. 离线访问类型提供刷新令牌作为响应。这个令牌 将有助于继续从后端服务器令牌上传 到期。
  4. 获得许可后。它将使用代码重定向到URL。
  5. 使用给定代码生成access_token
  6. 保存此令牌以供将来使用。
  7. 使用相同的令牌将视频从服务器推送到youtube 服务器
  8. 到期时刷新令牌。
  9. 但是,如果没有获得用户对我的应用程序的youtube上传权限,是否有任何方法可以实现此方法。

1 个答案:

答案 0 :(得分:12)

您可以使用google API(JWT)和#34;服务帐户"进行服务器端验证。但是无法在没有用户许可的情况下从您的服务器直接上传到YouTube服务器。要上传视频,Google需要OAuth2.0身份验证。它将为您提供错误 unAuthorized(401) - youtubeSignupRequired 与"服务帐户"使用JWT身份验证。 youtubeSignupRequired

由于上述限制。您可以使用以下方法来处理此问题 -

  1. 使用客户端库获取基于Web的生成令牌。
  2. 获取用户对您的应用程序的YouTube上传权限& ACCESS_TYPE =脱机。
  3. 离线访问类型为您提供响应中的刷新令牌。此令牌将帮助您在后端服务器令牌过期时继续从后端服务器令牌上载。
  4. 获得许可后。它将使用代码重定向到URL。
  5. 使用给定代码生成access_token
  6. 保存此令牌以供将来使用。
  7. 使用相同的令牌将视频从服务器推送到YouTube服务器
  8. 到期时刷新令牌。然后再按照步骤3 - 5进行操作。
  9. 目前,这是在youtube上上传视频的唯一方式。
  10. 在git repository nodejs-upload-youtube-video-using-google-api
  11. 上添加了代码

    为什么它不可能?检查以下参考链接&代码:

    1. 来自Google API文档:如果您尝试使用OAuth 2.0服务帐户流,则会出现此错误。 YouTube不支持服务帐户 ,如果您尝试使用服务帐户进行身份验证,则会收到此错误。您可以检查所有错误代码&其详细信息使用链接:YouTube Data API - Errors
    2. 来自gadata问题: Youtube v3 Google Service Account Access
    3. 来自google blog spot: List of Google API supported using Service Account
    4. 检查以下代码以从服务器端获取access_token
    5. 您可以使用以下步骤自行检查&代码:

      • 转到Google Developer Console
      • 创建项目
      • 要获取 Google+ API ,请访问:API& Auth-> API - >启用YouTube Data API v3
      • 要启用服务帐户,请访问:API& Auth->凭据 - >创建新的客户ID - >点击服务帐户 - >创建客户ID
      • 将秘密文件保存在您的系统上&保持安全。
      • 使用以下命令创建密钥&您下载的文件:
    6. openssl pkcs12 -in /home/rajesh/Downloads/Yourkeyfile.p12 -out youtube.pem -nodes

      - Enter password: ***notasecret***
      

      6。你可以授权&从服务器端访问api,如下所示:

          var google = require('googleapis');
          var authClient = new google.auth.JWT(
                  'Service account client email address', #You will get "Email address" in developer console for Service Account:
                  'youtube.pem', #path to pem file which we create using step 6
                  null,
                  ['https://www.googleapis.com/auth/youtube.upload'],
                  null
          );
          authClient.authorize(function(err, tokens) {
             if (err) {
                     console.log(err);
                     return;
             }
             console.log(tokens);
          });
      
      1. 使用服务帐户(正常工作)获取YouTube视频列表:

             var google = require('googleapis');
             var youtube = google.youtube('v3');
             var authClient = new google.auth.JWT(
                  'Service account client email address', #You will get "Email address" in developer console for Service Account:
                  'youtube.pem',
                  null,
               ['https://www.googleapis.com/auth/youtube','https://www.googleapis.com/auth/youtube.upload'],
               null
             );
            authClient.authorize(function(err, tokens) {
                if (err) {
                   console.log(err);
                   return;
            }
            youtube.videos.list({auth:authClient,part:'snippet',chart:'mostPopular'}, function(err, resp) {
               console.log(resp);
               console.log(err);
             });
            });
        
      2. 使用服务帐户和googleapis模块插入YouTube视频:

             var google = require('googleapis');
             var youtube = google.youtube('v3');
             var authClient = new google.auth.JWT(
                  'Service account client email address', #You will get "Email address" in developer console for Service Account:
                  'youtube.pem',
                  null,
               ['https://www.googleapis.com/auth/youtube','https://www.googleapis.com/auth/youtube.upload'],
               null
             );
            authClient.authorize(function(err, tokens) {
                if (err) {
                   console.log(err);
                   return;
            }
              youtube.videos.insert({auth:authClient,part:'snippet,status,contentDetails'},function(err,resp)
               console.log(resp);
               console.log(err);
             });
            });
        
      3. 插入/上传API返回错误:

        { errors: 
           [ { domain: 'youtube.header',
               reason: 'youtubeSignupRequired',
               message: 'Unauthorized',
               locationType: 'header',
               location: 'Authorization' } ],
          code: 401,
          message: 'Unauthorized' }
        
        1. 使用服务帐户和ResumableUpload模块插入YouTube视频:

               var google = require('googleapis');
               var ResumableUpload = require('node-youtube-resumable-upload');
               var authClient = new google.auth.JWT(
                    'Service account client email address', #You will get "Email address" in developer console for Service Account:
                    'youtube.pem',
                    null,
                 ['https://www.googleapis.com/auth/youtube','https://www.googleapis.com/auth/youtube.upload'],
                 null
               );
              authClient.authorize(function(err, tokens) {
                  if (err) {
                     console.log(err);
                     return;
              }
                var metadata = {snippet: { title: 'title', description: 'Uploaded with ResumableUpload' },status: { privacyStatus: 'private' }};
                var resumableUpload = new ResumableUpload(); //create new ResumableUpload
                resumableUpload.tokens = tokens;
                resumableUpload.filepath = 'youtube.3gp';
                resumableUpload.metadata = metadata;
                resumableUpload.monitor = true;
                resumableUpload.eventEmitter.on('progress', function(progress) {
                     console.log(progress);
                });
                resumableUpload.initUpload(function(result) {
                     console.log(result);
                     return;
                });
          
              });
          
        2. 插入/上传API返回错误:

             { 'www-authenticate': 'Bearer realm="https://accounts.google.com/AuthSubRequest", error=invalid_token',
            'content-type': 'application/json; charset=UTF-8',
            'content-length': '255',
            date: 'Tue, 16 Sep 2014 10:21:53 GMT',
            server: 'UploadServer ("Built on Aug 18 2014 11:58:36 (1408388316)")',
            'alternate-protocol': '443:quic,p=0.002' }
          
          1. 附加屏幕截图"如何获取Google密钥?" Create Client Id Download Application key & Password Client Email id used to call using backend
          2. 结论:无法在没有用户许可的情况下上传视频。