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

YouTube API to fetch all videos on a channel

我们需要一个视频列表,按YouTube的频道名称(使用API)。

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

1
https://gdata.youtube.com/feeds/api/channels?v=2&q=tendulkar

下面是频道的直接链接

1
https://www.youtube.com/channel/UCqAEtEr0A0Eo2IVcuWBfB9g

1
WWW.YouTube.com/channel/HC-8jgBP-4rlI

现在,我们需要频道>ucqaeter0aeo2ivcuwbfb9g或hc-8jgbp-4rli的视频。

我们试过了

https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&user=uc7bayrf2k0nziz3s04wudnqhttps://gdata.youtube.com/feeds/api/videos?V=2&uploader=Partner&Q=UC7PayRf2K0Nzizz304Wudnq

但是,这没有帮助。

我们需要在频道上发布所有视频。上传到一个频道的视频可以来自多个用户,因此我认为提供一个用户参数没有帮助…


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

你也可以自己提出要求。以下是从频道检索最新视频的URL示例:

1
https://www.googleapis.com/youtube/v3/search?key={your_key_here}&channelId={channel_id_here}&part=snippet,id&order=date&maxResults=20

之后,您将收到一个带有视频ID和详细信息的JSON,您可以这样构造您的视频URL:

1
http://www.youtube.com/watch?v={video_id_here}


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

https://developers.google.com/youtube/v3/docs/channels/list试试看

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

江户十一〔四〕号

结果,"relatedPlaylists"将包括"likes""uploads"播放列表。抓取"upload"播放列表ID。还要注意,"id"是您的通道ID,以备将来参考。

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

https://developers.google.com/youtube/v3/docs/playlistitems/list试试看

去玩牌吧!

埃多克斯1〔10〕


这是一段来自谷歌开发者的视频,展示了如何在youtube api的v3的一个频道中列出所有视频。

有两个步骤:

  • 查询通道获取"上传"ID,如https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
  • 使用此"上载"ID查询播放列表项以获取视频列表。如https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50

  • 要获取频道列表:

    按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 m8a5yxnlfwkgheeajjw&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

    要获取播放列表项:

    按播放列表ID获取播放列表项列表:

    https://www.googleapis.com/youtube/v3/playlistitems?part=snippet,contentdetails&maxresults=25&playlistid=plhflhppjgk70yv3kxqvkdeo5n5tmqia5i&key=

    要获取视频:

    按视频ID获取视频列表:

    https://www.googleapis.com/youtube/v3/videos?部分=代码段、内容详细信息、统计信息&id=yxlcwfaclw&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?部分=代码段,回复&videoid=el***kqak&key=a********k

    按频道ID获取评论列表:

    https://www.googleapis.com/youtube/v3/commentthreads?part=snippet,回复&channelid=u******q&key=ai******k

    按allthreadsrelatedtochannelid获取注释列表:

    https://www.googleapis.com/youtube/v3/commentthreads?part=snippet,repries&allthreadsrelatedtochannelid=uc******ntcq&key=ai******k

    这里所有的API都是GET方法。

    基于频道ID,我们不能直接获取所有视频,这是重要的一点。

    集成https://developers.google.com/youtube/v3/quickstart/ios?Ver=斯威夫特


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    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


    尝试如下操作。这可能对你有帮助。

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

    这里的作者,你可以指定你的频道名和"Q",因为你可以给你的搜索关键字。


    只需三步:

  • 订阅:列表->https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxresults=50&mine=true&access_token=oauth_token_

  • 频道:列表->https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id=频道密钥您的API密钥

  • 播放列表项:列表->https://www.googleapis.com/youtube/v3/playlistitems?part=snippet&playlist id=播放列表&key=您的API密钥


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

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

    这还可以限制一次请求的实际数量,因此可以防止您违反YouTube API规则。共享简短的代码片段,然后链接到完整的代码。通过使用响应中的nextpagetoken值获取接下来的50个结果等,我得到了每个调用的最大50个结果限制。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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.
                 }
        });
    }

    这得到了视频的基本列表,包括ID、标题、发布日期等。但是,为了获得更多关于每一个视频的细节,比如视图计数和喜欢,必须对videos进行API调用。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 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.
                }
    });

    在这里查看完整的代码,在这里查看实时版本。(编辑:固定Github链接)编辑:依赖项:jquery,papa.parse


    因为每个回答这个问题的人都有500个视频限制的问题,这里有一个在python 3中使用youtube-dl的替代解决方案。此外,不需要API密钥。

  • 安装youtube-dl:sudo pip3 install youtube-dl
  • 找出目标频道的频道ID。该ID将从UC开始。将频道的C替换为上载的U(即UU…),这是上载播放列表。
  • 使用YouTube下载列表功能。理想情况下,您不希望下载播放列表中默认的每个视频,而是只下载元数据。
  • 示例(警告--需要几十分钟):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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))


    Here is the code that will return all video ids under your channel

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?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);

    Note: You can get channel id at
    https://www.youtube.com/account_advanced after logged in.


    使用不推荐使用的API版本2,上传的URL(通道ucqater0a0eo2ivcuwbfb9g)是:

    https://gdata.youtube.com/feeds/users/ucqaeter0eo2ivcuwbfb9g/上传

    有一个API版本3。


    python中的示例解决方案。此视频中的帮助:视频和许多其他答案一样,上传ID首先从通道ID中检索。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import urllib.request
    import json

    key ="YOUR_YOUTUBE_API_v3_BROWSER_KEY"

    #List of channels : mention if you are pasting channel id or username -"id" or"forUsername"
    ytids = [["bbcnews","forUsername"],["UCjq4pjKj9X4W9i7UnYShpVg","id"]]

    newstitles = []
    for ytid,ytparam in ytids:
        urld ="https://www.googleapis.com/youtube/v3/channels?part=contentDetails&"+ytparam+"="+ytid+"&key="+key
        with urllib.request.urlopen(urld) as url:
            datad = json.loads(url.read())
        uploadsdet = datad['items']
        #get upload id from channel id
        uploadid = uploadsdet[0]['contentDetails']['relatedPlaylists']['uploads']

        #retrieve list
        urld ="https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId="+uploadid+"&key="+key
        with urllib.request.urlopen(urld) as url:
            datad = json.loads(url.read())

        for data in datad['items']:
            ntitle =  data['snippet']['title']
            nlink = data['contentDetails']['videoId']
            newstitles.append([nlink,ntitle])

    for link,title in newstitles:
        print(link, title)


    最近,我不得不从一个频道检索所有视频,根据YouTube开发者文档:https://developers.google.com/youtube/v3/docs/playlistitems/list

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function playlistItemsListByPlaylistId($service, $part, $params) {
        $params = array_filter($params);
        $response = $service->playlistItems->listPlaylistItems(
            $part,
            $params
        );

        print_r($response);
    }

    playlistItemsListByPlaylistId($service,
        'snippet,contentDetails',
        array('maxResults' => 25, 'playlistId' => 'id of"uploads" playlist'));

    其中$service是你的Google_Service_YouTube对象。

    因此,您必须从频道获取信息以检索"上传"播放列表,该播放列表实际上包含该频道上载的所有视频:https://developers.google.com/youtube/v3/docs/channels/list

    如果这个API是新的,我强烈建议将代码示例从默认代码段转换为完整的示例。

    因此,从一个频道检索所有视频的基本代码可以是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class YouTube
    {
        const       DEV_KEY = 'YOUR_DEVELOPPER_KEY';
        private     $client;
        private     $youtube;
        private     $lastChannel;

        public function __construct()
        {
            $this->client = new Google_Client();
            $this->client->setDeveloperKey(self::DEV_KEY);
            $this->youtube = new Google_Service_YouTube($this->client);
            $this->lastChannel = false;
        }

        public function getChannelInfoFromName($channel_name)
        {
            if ($this->lastChannel && $this->lastChannel['modelData']['items'][0]['snippet']['title'] == $channel_name)
            {
                return $this->lastChannel;
            }
            $this->lastChannel = $this->youtube->channels->listChannels('snippet, contentDetails, statistics', array(
                'forUsername' => $channel_name,
            ));
            return ($this->lastChannel);
        }

        public function getVideosFromChannelName($channel_name, $max_result = 5)
        {
            $this->getChannelInfoFromName($channel_name);
            $params = [
                'playlistId' => $this->lastChannel['modelData']['items'][0]['contentDetails']['relatedPlaylists']['uploads'],
                'maxResults'=> $max_result,
            ];
            return ($this->youtube->playlistItems->listPlaylistItems('snippet,contentDetails', $params));
        }
    }

    $yt = new YouTube();
    echo '[cc]' . print_r($yt->getVideosFromChannelName('CHANNEL_NAME'), true) . '

    [cc]


    由于文档状态(链接),您可以使用频道资源类型和操作列表来获取频道中的所有视频。必须使用参数"channel id"执行此操作。