YouTube Data v3 API - 如何请求一个频道的所有视频?

YouTube Data v3 API - How to request all videos from a channel?

我正在编写一个 Node.js 脚本,它将在 Lambda 中 运行 定期请求我组织的一个频道的每个视频(public、不公开或私人)的列表通过 YouTube 数据 v3 API。为此,似乎有两个步骤:

  1. 正在执行 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"]
});
  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"
});

这只会作为脚本执行 运行在云中;没有用户界面或浏览器组件。当我将单独的视频设置为 public 时,这一切似乎都在我的测试频道中起作用。但是如果我将它设置为私有,我会得到:

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

我需要做什么才能继续访问我频道的上传播放列表并显示私人视频?谢谢!

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

  1. 通过启用 API 和服务从 Google 开发者控制台启用 YouTube 数据 API v3。
  2. 在 YouTube 数据 API v3 的“凭据”窗格和 select 桌面应用程序下创建一个新的 OAuth 客户端 ID。
  3. 保存 client_id 和 client_secret。通过您喜欢的任何环境变量方法让您的 Node 应用程序可以访问这些。
  4. 创建一个单独的脚本,专门用于通过 YouTube 数据 API v3 OAuth
  5. 获取 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);
  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() 函数,标有“根据需要处理文件”评论将接收频道中的每个视频,无论是 public、未列出还是私有。

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