YouTube Data v3 API - 如何请求一个频道的所有视频?
YouTube Data v3 API - How to request all videos from a channel?
我正在编写一个 Node.js 脚本,它将在 Lambda 中 运行 定期请求我组织的一个频道的每个视频(public、不公开或私人)的列表通过 YouTube 数据 v3 API。为此,似乎有两个步骤:
- 正在执行 channels/list 调用 https://developers.google.com/youtube/v3/docs/channels/list 以获取“上传”播放列表。
const channelResult = await google.youtube('v3').channels.list({
auth: youtubeApiKey,
part: ['snippet', 'contentDetails'],
id: ["my_channel_id"]
});
- 正在执行 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"
});
这只会作为脚本执行 运行在云中;没有用户界面或浏览器组件。当我将单独的视频设置为 public 时,这一切似乎都在我的测试频道中起作用。但是如果我将它设置为私有,我会得到:
The playlist identified with the request's <code>playlistId</code> parameter cannot be found.
我需要做什么才能继续访问我频道的上传播放列表并显示私人视频?谢谢!
在原始问题评论中@stvar 的帮助下,我能够实现这一目标。流程是这样的:
- 通过启用 API 和服务从 Google 开发者控制台启用 YouTube 数据 API v3。
- 在 YouTube 数据 API v3 的“凭据”窗格和 select 桌面应用程序下创建一个新的 OAuth 客户端 ID。
- 保存 client_id 和 client_secret。通过您喜欢的任何环境变量方法让您的 Node 应用程序可以访问这些。
- 创建一个单独的脚本,专门用于通过 YouTube 数据 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 \n\n${authUrl}\n\nand 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);
将刷新令牌保存在另一个环境变量中,您的主要数据获取脚本可以访问该变量。像这样使用它:
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);
- 最后一个 .map() 函数,标有“根据需要处理文件”评论将接收频道中的每个视频,无论是 public、未列出还是私有。
注意:我还不知道给定的 refresh_token 会持续多久,但假设您将经常需要再次 运行 第一个脚本并更新使用的 refresh_token通过第二个脚本的环境变量。
我正在编写一个 Node.js 脚本,它将在 Lambda 中 运行 定期请求我组织的一个频道的每个视频(public、不公开或私人)的列表通过 YouTube 数据 v3 API。为此,似乎有两个步骤:
- 正在执行 channels/list 调用 https://developers.google.com/youtube/v3/docs/channels/list 以获取“上传”播放列表。
const channelResult = await google.youtube('v3').channels.list({
auth: youtubeApiKey,
part: ['snippet', 'contentDetails'],
id: ["my_channel_id"]
});
- 正在执行 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"
});
这只会作为脚本执行 运行在云中;没有用户界面或浏览器组件。当我将单独的视频设置为 public 时,这一切似乎都在我的测试频道中起作用。但是如果我将它设置为私有,我会得到:
The playlist identified with the request's <code>playlistId</code> parameter cannot be found.
我需要做什么才能继续访问我频道的上传播放列表并显示私人视频?谢谢!
在原始问题评论中@stvar 的帮助下,我能够实现这一目标。流程是这样的:
- 通过启用 API 和服务从 Google 开发者控制台启用 YouTube 数据 API v3。
- 在 YouTube 数据 API v3 的“凭据”窗格和 select 桌面应用程序下创建一个新的 OAuth 客户端 ID。
- 保存 client_id 和 client_secret。通过您喜欢的任何环境变量方法让您的 Node 应用程序可以访问这些。
- 创建一个单独的脚本,专门用于通过 YouTube 数据 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 \n\n${authUrl}\n\nand 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);
将刷新令牌保存在另一个环境变量中,您的主要数据获取脚本可以访问该变量。像这样使用它:
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);
- 最后一个 .map() 函数,标有“根据需要处理文件”评论将接收频道中的每个视频,无论是 public、未列出还是私有。
注意:我还不知道给定的 refresh_token 会持续多久,但假设您将经常需要再次 运行 第一个脚本并更新使用的 refresh_token通过第二个脚本的环境变量。