YouTube API用于获取频道上的所有视频

Raj*_*ani 166 youtube youtube-api

我们需要按YouTube频道名称的视频列表(使用API​​).

我们可以使用以下API获取频道列表(仅限频道名称):

https://gdata.youtube.com/feeds/api/channels?v=2&q=tendulkar
Run Code Online (Sandbox Code Playgroud)

以下是频道的直接链接

https://www.youtube.com/channel/UCqAEtEr0A0Eo2IVcuWBfB9g
Run Code Online (Sandbox Code Playgroud)

要么

WWW.YouTube.com/channel/HC-8jgBP-4rlI
Run Code Online (Sandbox Code Playgroud)

现在,我们需要频道>> UCqAEtEr0A0Eo2IVcuWBfB9g或HC-8jgBP-4rlI的视频.

我们尝试了

https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&User=UC7Xayrf2k0NZiz3S04WuDNQ https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&q=UC7Xayrf2k0NZiz3S04WuDNQ

但是,它没有帮助.

我们需要在频道上发布的所有视频.上传到频道的视频可能来自多个用户,因此我认为提供用户参数不会有帮助......

aks*_*hay 200

您需要查看YouTube数据API.您将找到有关如何访问API的文档.您还可以找到客户端库.

您也可以自己提出请求.以下是从频道中检索最新视频的示例网址:

https://www.googleapis.com/youtube/v3/search?key={your_key_here}&channelId={channel_id_here}&part=snippet,id&order=date&maxResults=20
Run Code Online (Sandbox Code Playgroud)

之后,您将收到JSON带有视频ID和详细信息的内容,您可以构建视频网址,如下所示:

http://www.youtube.com/watch?v={video_id_here}
Run Code Online (Sandbox Code Playgroud)

  • 这只会返回第一个`maxResults = 20`(最多50个)视频,但不会返回整个频道目录.如果您想获得更多结果,请使用[此处](https://developers.google.com/youtube/v3/docs/search/list)中所述的pageToken. (27认同)
  • 值得注意的是,您只能使用下一页令牌从频道中获取最多500个视频. (8认同)
  • 小心使用搜索,因为它的报价成本为 100! (4认同)
  • @TonyPaternite如何获得超过500个视频.我目前正面临这个问题. (3认同)
  • 这里解释的问题很好.https://code.google.com/p/gdata-issues/issues/detail?id=4282尝试使用不同的日期范围是获得更多视频的一种方法. (3认同)
  • Romulus Urakagi Ts'ai:在请求视频时你正在给channelId,这是频道的过滤器. (2认同)
  • @hello_there_andy :您需要一个 Google 帐户才能访问 Google Developers Console、请求 API 密钥和注册您的应用程序。有关更多信息,请查看:https://developers.google.com/youtube/v3/getting-started (2认同)
  • 请注意:与 [jambrose](/sf/answers/1951057111/) 建议的操作相比,“搜索”操作非常昂贵(100 个配额)(3 + 5 配额)(截至 2020 年 3 月) )。请参阅[配额计算器](https://developers.google.com/youtube/v3/define_quota_cost)。 (2认同)

jam*_*ose 90

首先,您需要从用户/频道获取代表上传的播放列表的ID:

https://developers.google.com/youtube/v3/docs/channels/list#try-it

您可以使用forUsername={username}param 指定用户名,或指定mine=true获取自己的用户名(您需要先进行身份验证).包括part=contentDetails查看播放列表.

GET https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=jambrose42&key={YOUR_API_KEY}

在结果中,"relatedPlaylists"将包括"likes""uploads"播放列表.获取该"upload"播放列表ID.另请注意,这"id"是您的channelID以供将来参考.

接下来,获取该播放列表中的视频列表:

https://developers.google.com/youtube/v3/docs/playlistItems/list#try-it

只需放入播放列表即可!

GET https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId=UUpRmvjdu3ixew5ahydZ67uA&key={YOUR_API_KEY}

  • 另外,我注意到的一件事是(据我所知),上传播放列表 ID 与频道 ID 相同,左侧第二个字符替换为 U。例如,频道 ID 的上传播放列表` “UC-lHJZR3Gqxm24_Vd_AJ5Yw”将是“UU-lHJZR3Gqxm24_Vd_AJ5Yw”。有道理,我认为它代表“用户频道”和“用户上传”。因此,如果您需要一些额外的配额点,我想这可能是一个解决方案。 (15认同)
  • 太棒了.特别是因为它只花费2个配额点而不是100个(*search*call会花费). (9认同)
  • 如果您想将配额再减少 2 个单位,请仅设置 part=snippet。contentDetails (videoId, videoPublishedAt) 可以在片段节点内找到,因此它是多余的。 (3认同)
  • 您可以首先使用通道 ID 来获取此信息,只需指定“id”参数而不是“forUsername”。如果您像我一样尝试一次获取多个频道的上传播放列表,则可以使用逗号或多次使用“id”参数指定多个 ID。 (3认同)
  • 有时它(https://developers.google.com/youtube/v3/docs/playlistItems/list#try-it)有效,有时它会为相同的uploadId抛出404,不知道发生了什么。 (2认同)

vir*_*mic 58

以下是来自Google Developers的视频,其中展示了如何v3在YouTube API中列出频道中的所有视频.

有两个步骤:

  1. 查询频道以获取"上传"ID.例如https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
  2. 使用此"上传"ID可查询PlaylistItems以获取视频列表.例如https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50

  • @MattBooth 说得很对。看起来模式是 Channel ID = UC + { User ID }, Upload Playlist ID = UU + { User ID } 。我猜它是在创建时为每个频道自动生成的(或者对于旧频道,当从 YT 的 API 切换到 Google 的 API 时)。目前还找不到任何消息来源证实这一点,但通过测试数百个渠道,他们都遵循这种模式。UC 可以表示用户频道,而 UU 可以表示用户上传。 (2认同)

iOS*_*iOS 19

获取频道列表:

通过forUserName获取频道列表:

https://www.googleapis.com/youtube/v3/channels?part=snippet,contentDetails,statistics&forUsername=Apple&key=

频道ID获取频道列表:

https://www.googleapis.com/youtube/v3/channels/?part=snippet,contentDetails,statistics&id=UCE_M8A5yxnLfW0KghEeajjw&key=

获取频道部分:

https://www.googleapis.com/youtube/v3/channelSections?part=snippet,contentDetails&channelId=UCE_M8A5yxnLfW0KghEeajjw&key=

获取播放列表:

频道ID获取播放列表:

https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key=

通过带有pageToken频道ID获取播放列表

https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key=&pageToken = CDIQAA

要获得PlaylistItems:

通过PlayListId获取PlaylistItems列表:

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails&maxResults=25&playlistId=PLHFlHpPjgk70Yv3kxQvkDEO5n5tMQia5I&key=

要获取视频:

视频ID获取视频列表:

https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=YxLCwfA1cLw&key=

通过多个视频ID获取视频列表:

https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=YxLCwfA1cLw,Qgy6LaO3SB0,7yPJXGO2Dcw&key=

获取评论列表

通过视频ID获取评论列表:

https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&videoId=el **** kQak&key = A ********** k

通过频道ID获取评论列表:

https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&channelId=U ***** Q&key = AI ******** k

通过allThreadsRelatedToChannelId获取评论列表:

https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&allThreadsRelatedToChannelId=UC ***** ntcQ&key = AI ***** k

这里所有的api都是Get方法。

根据频道ID,我们不能直接获取所有视频,这很重要。

集成https://developers.google.com/youtube/v3/quickstart/ios?ver=swift


der*_*mid 10

简短回答:

这是一个名为scrapetube 的库,可以帮助解决这个问题。

pip install scrapetube

import scrapetube
import simplejson as json

videos = scrapetube.get_channel("UC9-y-6csu5WGm29I7JiwpnA")

for video in videos:
    print(video['videoId'])
    print(video['title']['runs'][0]['text'])
    print(video['publishedTimeText']['simpleText'])
    print('\r\n')
    # DEBUG: print(json.dumps(video))
Run Code Online (Sandbox Code Playgroud)

长答案:

由于缺乏任何其他解决方案,上述模块是我创建的。这是我尝试过的:

  1. 硒。它有效,但有三大缺点: 1. 它需要安装网络浏览器和驱动程序。2.对CPU和内存要求较高。3.无法处理大通道。
  2. 使用 youtube-dl。像这样:
import youtube_dl
    youtube_dl_options = {
        'skip_download': True,
        'ignoreerrors': True
    }
    with youtube_dl.YoutubeDL(youtube_dl_options) as ydl:
        videos = ydl.extract_info(f'https://www.youtube.com/channel/{channel_id}/videos')
Run Code Online (Sandbox Code Playgroud)

这也适用于小型频道,但对于较大的频道,我会因为在如此短的时间内发出如此多的请求而被 youtube 阻止(因为 youtube-dl 会为频道中的每个视频下载更多信息)。

scrapetube所以我制作了一个使用 Web API 来获取所有视频的库。


xjc*_*jcl 8

由于每个回答这个问题的人都因500 个视频限制而遇到问题,因此这里有一个使用Python 3中的youtube_dl的替代解决方案。此外,不需要 API 密钥

  1. 安装 youtube_dl:sudo pip3 install youtube-dl
  2. 找出您的目标频道的频道 id。ID 将以 UC 开头。将代表 Channel 的 C 替换为代表 Upload 的 U(即 UU...),这是上传播放列表
  3. 使用youtube-dl 的播放列表下载器功能。理想情况下,您不想下载默认播放列表中的每个视频,而只想下载元数据。

示例(警告 - 需要数十分钟):

import youtube_dl, pickle

             # UCVTyTA7-g9nopHeHbeuvpRA is the channel id (1517+ videos)
PLAYLIST_ID = 'UUVTyTA7-g9nopHeHbeuvpRA'  # Late Night with Seth Meyers

with youtube_dl.YoutubeDL({'ignoreerrors': True}) as ydl:

    playd = ydl.extract_info(PLAYLIST_ID, download=False)

    with open('playlist.pickle', 'wb') as f:
        pickle.dump(playd, f, pickle.HIGHEST_PROTOCOL)

    vids = [vid for vid in playd['entries'] if 'A Closer Look' in vid['title']]
    print(sum('Trump' in vid['title'] for vid in vids), '/', len(vids))
Run Code Online (Sandbox Code Playgroud)


小智 7

尝试使用以下内容.它可能会帮助你.

https://gdata.youtube.com/feeds/api/videos?author=cnn&v=2&orderby=updated&alt=jsonc&q=news

在此作者,您可以指定频道名称和"q",因为您可以提供搜索关键字.


Sti*_*ian 7

下面是一个Python替代品,不需要任何特殊包.通过提供频道ID,它返回该频道的视频链接列表.请注意,您需要一个API密钥才能工作.

import urllib
import json

def get_all_video_in_channel(channel_id):
    api_key = YOUR API KEY

    base_video_url = 'https://www.youtube.com/watch?v='
    base_search_url = 'https://www.googleapis.com/youtube/v3/search?'

    first_url = base_search_url+'key={}&channelId={}&part=snippet,id&order=date&maxResults=25'.format(api_key, channel_id)

    video_links = []
    url = first_url
    while True:
        inp = urllib.urlopen(url)
        resp = json.load(inp)

        for i in resp['items']:
            if i['id']['kind'] == "youtube#video":
                video_links.append(base_video_url + i['id']['videoId'])

        try:
            next_page_token = resp['nextPageToken']
            url = first_url + '&pageToken={}'.format(next_page_token)
        except:
            break
    return video_links
Run Code Online (Sandbox Code Playgroud)


sac*_*red 6

仅需三个步骤:

  1. 订阅:列表-> https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=50&mine=true&access_token= {oauth_token}

  2. 频道:列表-> https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id= {channel_id}&key = {YOUR_API_KEY}

  3. PlaylistItems:列表-> https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {playlist_id}&key = {YOUR_API_KEY}


Mih*_*att 5

这是将返回您频道下所有视频ID的代码

<?php 
    $baseUrl = 'https://www.googleapis.com/youtube/v3/';
    // https://developers.google.com/youtube/v3/getting-started
    $apiKey = 'API_KEY';
    // If you don't know the channel ID see below
    $channelId = 'CHANNEL_ID';

    $params = [
        'id'=> $channelId,
        'part'=> 'contentDetails',
        'key'=> $apiKey
    ];
    $url = $baseUrl . 'channels?' . http_build_query($params);
    $json = json_decode(file_get_contents($url), true);

    $playlist = $json['items'][0]['contentDetails']['relatedPlaylists']['uploads'];

    $params = [
        'part'=> 'snippet',
        'playlistId' => $playlist,
        'maxResults'=> '50',
        'key'=> $apiKey
    ];
    $url = $baseUrl . 'playlistItems?' . http_build_query($params);
    $json = json_decode(file_get_contents($url), true);

    $videos = [];
    foreach($json['items'] as $video)
        $videos[] = $video['snippet']['resourceId']['videoId'];

    while(isset($json['nextPageToken'])){
        $nextUrl = $url . '&pageToken=' . $json['nextPageToken'];
        $json = json_decode(file_get_contents($nextUrl), true);
        foreach($json['items'] as $video)
            $videos[] = $video['snippet']['resourceId']['videoId'];
    }
    print_r($videos);
Run Code Online (Sandbox Code Playgroud)

注意:登录后,您可以在https://www.youtube.com/account_advanced上获取频道ID 。


Nik*_* VJ 5

由于在这里和其他地方共享了这些参考,我制作了一个在线脚本/工具,可以用来获取频道的所有视频。

它结合了API调用youtube.channels.listplaylistItemsvideos。它使用递归函数使异步回调在获得有效响应后运行下一次迭代。

这还可以限制一次发出的实际请求数,从而使您避免违反YouTube API规则。共享缩短的片段,然后共享完整代码。通过使用响应中包含的nextPageToken值来获取下一个50个结果,我每次调用限制得到的最大结果数为50个左右。

function getVideos(nextPageToken, vidsDone, params) {
    $.getJSON("https://www.googleapis.com/youtube/v3/playlistItems", {
        key: params.accessKey,
        part: "snippet",
        maxResults: 50,
        playlistId: params.playlistId,
        fields: "items(snippet(publishedAt, resourceId/videoId, title)), nextPageToken",
        pageToken: ( nextPageToken || '')
        },
        function(data) {
            // commands to process JSON variable, extract the 50 videos info

            if ( vidsDone < params.vidslimit) {

                // Recursive: the function is calling itself if
                // all videos haven't been loaded yet
                getVideos( data.nextPageToken, vidsDone, params);

            }
             else {
                 // Closing actions to do once we have listed the videos needed.
             }
    });
}
Run Code Online (Sandbox Code Playgroud)

这样就获得了视频的基本列表,包括ID,标题,发布日期等。但是要获得每个视频的更多细节(例如观看次数和喜欢),必须对进行API调用videos

// Looping through an array of video id's
function fetchViddetails(i) {
    $.getJSON("https://www.googleapis.com/youtube/v3/videos", {
        key: document.getElementById("accesskey").value,
        part: "snippet,statistics",
        id: vidsList[i]
        }, function(data) {

            // Commands to process JSON variable, extract the video
            // information and push it to a global array
            if (i < vidsList.length - 1) {
                fetchViddetails(i+1) // Recursive: calls itself if the
                                     //            list isn't over.
            }
});
Run Code Online (Sandbox Code Playgroud)

此处查看完整代码,并在此处查看实时版本。(编辑:固定github链接)
编辑:依赖关系:jQuery,Papa.parse


Als*_*Als 2

使用已弃用的 API 版本 2,上传(通道 UCqAEtEr0A0Eo2IVcuWBfB9g)的 URL 为:

https://gdata.youtube.com/feeds/users/UCqAEtEr0A0Eo2IVcuWBfB9g/uploads

有一个 API 版本 3。

  • 链接已失效。 (12认同)