YouTube API 错误,Node.js

Posted

技术标签:

【中文标题】YouTube API 错误,Node.js【英文标题】:YouTube API Error, Node.js 【发布时间】:2019-02-04 18:01:03 【问题描述】:
When I try to connect with YouTube API (by node.js) this error show up: 
var redirectUrl = credentials.installed.redirect_uris[0]; ^ TypeError:无法读取未定义的属性“0” 在授权 (D:\Node.js\yt-api\server.js:37:56) 在 processClientSecrets (D:\Node.js\yt-api\server.js:24:3) 在 FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3) var express = require('express'); var server = express(); var fs = 要求('fs') var readline = require('readline'); var google = 要求('googleapis'); var OAuth2 = google.auth.OAuth2; server.use(express.static('public')); // 如果修改这些范围,请删除您之前保存的凭据 // 在 ~/.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'; // 从本地文件加载客户端机密。 fs.readFile('client_secret.json', function processClientSecrets(err, content) 如果(错误) console.log('加载客户端机密文件时出错:' + err); 返回; // 使用加载的凭据授权客户端,然后调用 YouTube API。 授权(JSON.parse(内容),getChannel); ); /** * 使用给定的凭据创建一个 OAuth2 客户端,然后执行 * 给定回调函数。 * * @param Object credentials 授权客户端凭证。 * @param function 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); // 检查我们之前是否存储了一个令牌。 fs.readFile(TOKEN_PATH,函数(错误,令牌) 如果(错误) getNewToken(oauth2Client, 回调); 别的 oauth2Client.credentials = JSON.parse(token); 回调(oauth2Client); ); /** * 提示用户授权后获取并存储新的token,然后 * 使用授权的 OAuth2 客户端执行给定的回调。 * * @param google.auth.OAuth2 oauth2Client 要获取令牌的 OAuth2 客户端。 * @param getEventsCallback callback 授权调用的回调 * 客户。 */ 函数getNewToken(oauth2Client,回调) var authUrl = oauth2Client.generateAuthUrl( access_type: '离线', 范围:范围 ); console.log('通过访问这个 url 来授权这个应用程序:', authUrl); var rl = readline.createInterface( 输入:process.stdin, 输出:process.stdout ); rl.question('在此处输入该页面的代码:', function(code) rl.close(); oauth2Client.getToken(代码,函数(错误,令牌) 如果(错误) console.log('尝试获取访问令牌时出错', err); 返回; oauth2Client.credentials = 令牌; 存储令牌(令牌); 回调(oauth2Client); ); ); /** * 将令牌存储到磁盘以供以后的程序执行使用。 * * @param Object token 要存储到磁盘的令牌。 */ 功能存储令牌(令牌) 尝试 fs.mkdirSync(TOKEN_DIR); 捕捉(错误) if (err.code != 'EEXIST') 抛出错误; fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => if (err) 抛出错误; console.log('令牌存储到' + TOKEN_PATH); ); console.log('令牌存储到' + TOKEN_PATH); /** * 列出最多 10 个文件的名称和 ID。 * * @param google.auth.OAuth2 auth 授权的 OAuth2 客户端。 */ 函数 getChannel(auth) var service = google.youtube('v3'); service.channels.list( 认证:认证, 部分:'sn-p,contentDetails,统计', forUsername: '谷歌开发者' ,函数(错误,响应) 如果(错误) console.log('API返回错误:' + err); 返回; var 频道 = response.data.items; 如果(channels.length == 0) console.log('没有找到频道。'); 别的 console.log('这个频道的ID是%s,标题是\'%s\','+ '它有 %s 个视图。', 频道[0].id, 频道[0].sn-p.title, 频道[0].statistics.viewCount); ); var port = process.env.port || 4001; server.listen(端口,()=> console.log(`监听端口 $port`) )

如何解决? oAuth2 有问题吗?

【问题讨论】:

【参考方案1】:

您的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 错误,Node.js的主要内容,如果未能解决你的问题,请参考以下文章

Youtube“类别过滤器无效”API 错误

youtube api 401 错误 youtubeSigupRequired

YouTube 数据 API 错误 403 权限不足

youtube-v3-api 频道列表错误

错误:“消息”:使用 Youtube 分析 API 时需要登录

youtube api入门节点错误