当前位置: 首页 > 知识库问答 >
问题:

YouTube API错误,Node.js

巫马泓
2023-03-14
When I try to connect with YouTube API (by node.js) this error show up: 

    var redirectUrl = credentials.installed.redirect_uris[0];
                                                           ^

    TypeError: Cannot read property '0' of undefined
        at authorize (D:\Node.js\yt-api\server.js:37:56)
        at processClientSecrets (D:\Node.js\yt-api\server.js:24:3)
        at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3)


    var express = require('express');
    var server = express();
    var fs = require('fs')
    var readline = require('readline');
    var {google} = require('googleapis');
    var OAuth2 = google.auth.OAuth2;

    server.use(express.static('public'));

    // If modifying these scopes, delete your previously saved credentials
    // at ~/.credentials/youtube-nodejs-quickstart.json
    var SCOPES = ['https://www.googleapis.com/auth/youtube.readonly'];
    var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
        process.env.USERPROFILE) + '/.credentials/';
    var TOKEN_PATH = TOKEN_DIR + 'youtube-nodejs-quickstart.json';

    // Load client secrets from a local file.
    fs.readFile('client_secret.json', function processClientSecrets(err, content) {
      if (err) {
        console.log('Error loading client secret file: ' + err);
        return;
      }
      // Authorize a client with the loaded credentials, then call the YouTube API.
      authorize(JSON.parse(content), getChannel);
    });

    /**
     * Create an OAuth2 client with the given credentials, and then execute the
     * given callback function.
     *
     * @param {Object} credentials The authorization client credentials.
     * @param {function} callback The callback to call with the authorized client.
     */
    function authorize(credentials, callback) {
      var clientSecret = credentials.installed.client_secret;
      var clientId = credentials.installed.client_id;
      var redirectUrl = credentials.installed.redirect_uris[0];
      var oauth2Client = new OAuth2(clientId, clientSecret, redirectUrl);

      // Check if we have previously stored a token.
      fs.readFile(TOKEN_PATH, function(err, token) {
        if (err) {
          getNewToken(oauth2Client, callback);
        } else {
          oauth2Client.credentials = JSON.parse(token);
          callback(oauth2Client);
        }
      });
    }

    /**
     * Get and store new token after prompting for user authorization, and then
     * execute the given callback with the authorized OAuth2 client.
     *
     * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for.
     * @param {getEventsCallback} callback The callback to call with the authorized
     *     client.
     */
    function getNewToken(oauth2Client, callback) {
      var authUrl = oauth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES
      });
      console.log('Authorize this app by visiting this url: ', authUrl);
      var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
      });
      rl.question('Enter the code from that page here: ', function(code) {
        rl.close();
        oauth2Client.getToken(code, function(err, token) {
          if (err) {
            console.log('Error while trying to retrieve access token', err);
            return;
          }
          oauth2Client.credentials = token;
          storeToken(token);
          callback(oauth2Client);
        });
      });
    }

    /**
     * Store token to disk be used in later program executions.
     *
     * @param {Object} token The token to store to disk.
     */
    function storeToken(token) {
      try {
        fs.mkdirSync(TOKEN_DIR);
      } catch (err) {
        if (err.code != 'EEXIST') {
          throw err;
        }
      }
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) throw err;
        console.log('Token stored to ' + TOKEN_PATH);
      });
      console.log('Token stored to ' + TOKEN_PATH);
    }

    /**
     * Lists the names and IDs of up to 10 files.
     *
     * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
     */
    function getChannel(auth) {
      var service = google.youtube('v3');
      service.channels.list({
        auth: auth,
        part: 'snippet,contentDetails,statistics',
        forUsername: 'GoogleDevelopers'
      }, function(err, response) {
        if (err) {
          console.log('The API returned an error: ' + err);
          return;
        }
        var channels = response.data.items;
        if (channels.length == 0) {
          console.log('No channel found.');
        } else {
          console.log('This channel\'s ID is %s. Its title is \'%s\', and ' +
                      'it has %s views.',
                      channels[0].id,
                      channels[0].snippet.title,
                      channels[0].statistics.viewCount);
        }
      });
    }


    var port = process.env.port || 4001;

    server.listen(port, () => {
      console.log(`Listening on port ${port}`)
    })

怎么修好?oAuth2有问题吗?

共有1个答案

经景辉
2023-03-14

您的client_secret.json文件缺少“redirect_uris”的键

请参阅下面的示例文件:

{
  "installed": {
    "client_id": "YOUR_CLIENT_ID_HERE",
    "client_secret": "YOUR_CLIENT_SECRET_HERE",
    "redirect_uris": ["http://localhost:8080/oauth2callback"],
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token"
  }
}
 类似资料:
  • 我正试图通过YouTube API访问我的私人视频。当前,当我的应用程序执行请求时,我收到一个错误,错误如下: "请求包含无效的搜索筛选器和/或限制组合。请注意,如果为eventType、videoCaption、videoCategoryId、videoDefinition、videoDimension、videoDuration、videoEmbeddable、videoLicense、vid

  • 现在,您可以创建多个Youtube频道。在我的Android应用程序中,我需要让用户选择其中一个频道并使用它(获取订阅视频等)。 我想效仿官方YouTube应用程序,您可以在其中选择我在YouTube帐户中创建的频道之一。 编辑: 最后,我用易卜拉欣的建议解决了这个问题。在webview中,我使用了oAuth2身份验证,如下所示: https://accounts.google.com/o/oau

  • 我一直在使用v3版本的Youtube API来获取Youtube的播放列表。 示例网址:https://www.googleapis.com/youtube/v3/playlistItems?playlistId=xxxxxxxxx 但是我发现有时YouTubeAPI响应带有错误消息“500内部服务器错误” 如何使用Youtube API修复或防止此错误?

  • 所以我试图从用户上传的视频中抓取10个最新视频。 现在唯一的问题是,播放列表请求中唯一可见的日期是已发布的,这是视频上传的日期 - 而不是公开的日期,这会产生巨大的差异。 我注意到我可以通过视频请求获取正确的日期,但它似乎不是最好的地方。 让我给你看一个我正在处理的例子。 我们走Maroon5频道吧。 forUserName: Maroon5VEVO 获取 https://www.googleap

  • 我尝试使用以下指南在youtube上上传缩略图:https://developers.google.com/youtube/v3/docs/thumbnails/set 我能够使用以下curl在postman上成功运行它: 然而,我很难将其翻译成js,到目前为止我所做的是: (为了简化逻辑,我只手动键入上面的代码,如果有任何输入错误,请原谅。) 但是这抛出的

  • 我们有一个网站,显示我们的YouTube视频频道和我们频道中最喜欢的视频等。我们使用YouTube数据API v2.0来获取数据。 例如: https://gdata.youtube.com/feeds/api/users/“ 用户标识 ”/播放列表?v=2 但现在这些链接返回“NetworkError: 410 Gone”。我们检查了新的YouTube Javascript API,但我们不知道

  • 我需要提取5年前公司YouTube频道上的活动。我遇到了一个YouTube分析API的问题,因为它限制了我最近30天的活动。我正在考虑接下来尝试YouTube数据API V3,但我想首先在这里问一下,是否有人知道如何从YouTube频道中提取深层历史数据。我感兴趣的主要是每天每个视频的浏览量。我正在使用谷歌云平台,需要将数据存储在BigQuery中。 https://developers.goog

  • 目前,我正在处理一个项目,该项目需要为Oauth 2登录用户返回不公开的视频。因为我试图获得不公开的视频,所以我必须使用ForMine变量。所以我得到的是 https://content.googleapis.com/youtube/v3/search?part =片段 它工作正常。但是,我想做一个增量加载。这需要仅在特定时间后发布视频。一旦我添加发布后参数“发布后=1970-01-01T00:0