YouTube数据v3 API -如何从一个频道请求所有视频?



我正在编写一个Node.js脚本,该脚本将在Lambda中运行,通过YouTube Data v3 API定期请求我组织的一个频道的每个视频(公共,未列出或私有)的列表。要做到这一点,似乎需要两个步骤:

  1. 执行通道/列表调用https://developers.google.com/youtube/v3/docs/channels/list以获取"Uploads"播放列表。
const channelResult = await google.youtube('v3').channels.list({
auth: youtubeApiKey,
part: ['snippet', 'contentDetails'],
id: ["my_channel_id"]
});
  1. 执行playlistItems/list https://developers.google.com/youtube/v3/docs/playlistItems/list查看所有视频
const videosResult = await google.youtube('v3').playlistItems.list({
auth: youtubeApiKey,
part: ['snippet', 'status'],
playlistId: "my_uploads_playlsit_id"
});

这只作为运行在云上的脚本执行;没有用户界面或浏览器组件。当我将唯一的视频设置为公开时,这一切似乎都在我的测试频道中有效。但如果我把它设为private,我得到:

The playlist identified with the request's <code>playlistId</code> parameter cannot be found.

我必须做些什么才能访问我的频道的上传播放列表,并显示私人视频?谢谢!

在原始问题评论中的@stvar的帮助下,我能够实现这一点。流程如下:

  1. 通过启用API和服务从Google开发者控制台启用YouTube Data API v3。
  2. 在YouTube Data API v3的"凭据"下创建一个新的OAuth客户端ID;面板,选择桌面应用。
  3. 保存client_id和client_secret。让你的Node应用可以通过你喜欢的任何环境变量方法访问这些变量。
  4. 创建一个单独的脚本,专门用于通过YouTube Data API v3 OAuth获取refresh_token
import { google } from 'googleapis';
import prompts from 'prompts';
console.log("about to execute oauth");
const yt_client_id = process.env.YOUTUBE_CLIENT_ID;
const yt_client_secret = process.env.YOUTUBE_CLIENT_SECRET;
const oauthClient = new google.auth.OAuth2({
clientId: yt_client_id,
clientSecret: yt_client_secret,
redirectUri: 'http://localhost'
});
const authUrl = oauthClient.generateAuthUrl({
access_type: 'offline', //gives you the refresh_token
scope: 'https://www.googleapis.com/auth/youtube.readonly'
});
const codeUrl = await prompts({
type: 'text',
name: 'codeURl',
message: `Please go to nn${authUrl}nnand paste in resulting localhost uri`
});
const decodedUrl = decodeURIComponent(codeUrl.codeURl);
const code = decodedUrl.split('?code=')[1].split("&scope=")[0];
const token = (await oauthClient.getToken(code)).tokens;
const yt_refresh_token = token.refresh_token;
console.log(`Please save this value into the YOUTUBE_REFRESH_TOKEN env variable for future runs: ${yt_refresh_token}`);
await prompts({
type: 'text',
name: 'blank',
message: 'Hit enter to exit:'
});
process.exit(0);
  1. 将刷新令牌保存在另一个环境变量中,可由主数据获取脚本访问。这样使用:

import { google } from 'googleapis';
console.log("Beginning youtubeIndexer. Checking for valid oauth.");
const yt_refresh_token = process.env.YOUTUBE_REFRESH_TOKEN;
const yt_client_id = process.env.YOUTUBE_CLIENT_ID;
const yt_client_secret = process.env.YOUTUBE_CLIENT_SECRET;
const yt_channel_id = process.env.YOUTUBE_CHANNEL_ID;
const oauthClient = new google.auth.OAuth2({
clientId: yt_client_id,
clientSecret: yt_client_secret,
redirectUri: 'http://localhost'
});
oauthClient.setCredentials({
refresh_token: yt_refresh_token
});
const youtube = google.youtube("v3");
const channelResult = await youtube.channels.list({
auth: oauthClient,
part: ['snippet', 'contentDetails'],
id: [yt_channel_id]
});
let nextPageToken = undefined;
let videosFetched = 0;
do {
const videosResult = await youtube.playlistItems.list({
auth: oauthClient,
maxResults: 50,
pageToken: nextPageToken,
part: ['snippet', 'status'],
playlistId: channelResult.data.items[0].contentDetails.relatedPlaylists.uploads
});
videosFetched += videosResult.data.items.length;
nextPageToken = videosResult.data.nextPageToken;
videosResult.data.items.map((video, index) => {
//process the files as you need to.
});
} while (nextPageToken);
  1. 最后一个.map()函数,标记为"按需处理文件"评论将收到频道中的每个视频,无论是公开的,未列出的还是私人的。

注意:我还不知道给定的refresh_token将持续多长时间,但假设您将定期需要再次运行第一个脚本,并通过第二个脚本的环境变量更新使用的refresh_token。

相关内容

最新更新