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

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

朱天逸
2023-03-14

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

    < li >执行频道/列表调用https://developers.google.com/youtube/v3/docs/channels/list以获取“上传”播放列表。
const channelResult = await html" target="_blank">google.youtube('v3').channels.list({
    auth: youtubeApiKey,
    part: ['snippet', 'contentDetails'],
    id: ["my_channel_id"]
});
const videosResult = await google.youtube('v3').playlistItems.list({
    auth: youtubeApiKey,
    part: ['snippet', 'status'],
    playlistId: "my_uploads_playlsit_id"
});

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

< code >用请求的

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

共有1个答案

苏嘉歆
2023-03-14

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

  1. 通过启用 API 和服务从 Google 开发者控制台启用 YouTube 数据 API v3。
  2. 在 YouTube 数据 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 \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);

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

 类似资料:
  • 我有一个包含 500 个视频的频道,想要一个包含我频道内所有视频 URL 的列表。 我尝试过: https://gdata.youtube.com/feeds/api/users/default/uploads?key=DEVELOPER_KEY 开发者密钥来自:https://code.google.com/apis/youtube/dashboard 我只是得到:需要用户身份验证。错误 401

  • 问题内容: 我想获取特定频道的所有视频网址。我认为带python或java的json是一个不错的选择。我可以使用以下代码获取最新的视频,但是如何获得所有视频链接(> 500)? 问题答案: 将最大结果从1增加到您想要的任何数目,但是请注意,他们不建议一次通话就抓住太多,并且将您限制为50(https://developers.google.com/youtube/2.0/developers_gu

  • 我想获取具有Id的单个频道的所有视频。我只得到频道信息的问题。这是我正在使用的链接: https://g data . YouTube . com/feeds/API/users/UCD CIB _ pnqpr 0m _ kkdg 4d z5 a?v=2

  • 我使用YouTube数据API从一个频道获取视频信息。API响应不包括上传到相应频道的所有视频。 这是频道(现在有6个视频):https://www.youtube.com/channel/UCdSjDEx46aNP0oKPN_J6hOA/videos 视频列表(现在):https://i.ibb.co/K91bJxS/image.png 这是我的API调用:https://www.googlea

  • 我正在尝试使用MediaCodec从视频中检索所有帧,用于图像处理,我正在尝试渲染视频并从outBuffers捕获帧,但我无法从接收到的字节启动位图实例。 我试着将它呈现为一个表面或无(null),因为我注意到当你呈现为null时,outBuffers将获得呈现帧的字节。 这是代码: 任何帮助都是非常有用的

  • 我如何从youtube频道获取持续时间和浏览量都很重要的视频? 我试过这个请求: https://www.googleapis.com/youtube/v3/search?part=snippet, id 但响应不包含持续时间/视图计数。有什么想法吗?谢谢。