YouTube API可提取频道中的所有视频


197

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

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

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

以下是频道的直接链接

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

要么

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

现在,我们需要频道>> 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

但是,这没有帮助。

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


我可以访问自己的视频文件吗?通过API登录时基本上可以下载我自己的内容!!!
filthy_wizard

Answers:


216

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

您也可以自己提出请求。这是一个示例URL,可从某个频道检索最新视频:

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

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

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

29
这只会返回前maxResults=20(最多50个)视频,而不返回整个频道目录。如果您想获得更多结果,请按此处所述使用pageToken 。
法比奥·佩雷斯

2
Romulus Urakagi Ts'ai:在请求视频时,您要提供的是channelId,这是频道的过滤器。
akshay 2014年

11
值得注意的是,使用下一页标记,您最多只能从一个频道中获取500个视频。
托尼·帕特尼特

3
@TonyPaternite如何获得500多个视频。我目前正面临这个问题。
拉贾

3
这个问题在这里得到很好的解释。code.google.com/p/gdata-issues/issues/detail?id=4282尝试使用不同的日期范围是获得更多视频的一种方法。
Raja

117

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

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

您可以使用forUsername={username}参数指定用户名,也可以指定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

只需放入playlistId!

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


1
在这个崭新的世界中,并不是每个人都有youtube用户名。其中一些仅具有google +用户ID号,无法代替youtube用户名
kristopolous

1
@kristopolous每个YouTube频道都有一个频道ID。如果您通过Google plus进入YouTube页面,它将使用Google plus用户ID作为该频道的链接。如果您是从YouTube视频转到频道的,则它会使用YouTube的频道ID属性。
伊格纳特(Ignat),2016年

19
太棒了。特别是因为它仅花费2个配额点,而不是100个(搜索通话将花费)。
JP de la Torre

1
somteimes可以正常工作(developers.google.com/youtube/v3/docs/playlistItems/list#try-it),有时会为相同的uploadId抛出404,不知道发生了什么。
ishandutta2007 '17

1
playlistItems端点中的@jambrose如何使用某些日期范围参数,例如publishAfter / publishedBefore。我尝试了一下,但是没有用,所以我如何获取频道的所有视频。
严厉的sachdev,

79

这是来自Google Developers的视频,显示了如何列出v3YouTube 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


1
给指定频道的“上载” ID可以更改吗?
ishandutta2007 '17

看来上传在相同的channelID,但非常不一致的API,可一些回答这个stackoverflow.com/questions/43568521/...
ishandutta2007

1
@ ishandutta2007没有上传ID与频道ID不同。
vicke4 '18

@ virtualmic @ Peter完美解决方案专家,谢谢
Aaska Patel

它工作正常。但是我有多个通道ID,所以如何将它们发送到api,我可以使用逗号分隔的通道ID
Onkar Musale

31

获取频道列表:

通过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


如何将多个频道ID发送给api,我可以使用逗号分隔的频道ID
Onkar Musale

如何使用API​​获取最热门的10/50/100个YouTube频道?
Rajeshwar

10

以下是不需要任何特殊软件包的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

这是如何运作的?我使用单引号''将API KEY粘贴到api_key变量中,然后调用传递通道ID的函数,然后运行python程序,但没有任何反应。
乔佛里·巴拉松

@JoffreyBaratheon函数返回一个数组,您需要将其包含到变量中。例如:video_list = get_all_video_in_channel("ABC123EFG456")然后您可以使用print(video_list)
phapha pha

7

这是将返回您频道下所有视频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);

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


1
这绝对是一个行之有效的干净解决方案。目前在生产中使用。
Codex73



6

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

它结合了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.
             }
    });
}

这样就获得了视频的基本列表,包括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.
            }
});

查看完整的代码在这里,并在这里现场版。(编辑:固定github链接)
编辑:依赖关系:jQuery,Papa.parse


1
您确定这可行吗?GitHub页面不见了,然后当我在字段中输入API密钥和通道ID时,出现错误。
乔佛里·巴拉松

@JoffreyBaratheon感谢您指出断开的github链接。我只是运行它..它有效。获取该播放列表ID十分棘手。.请参见:github.com/answerquest/answerquest.github.io/issues/2
Nikhil VJ

不错的工作。与更新的github链接一起很好地工作。您将需要jquery和papaparse.min.js
Bludau Media

@thE_iNviNciblE感谢您提出来。提到了它。
Nikhil VJ

@ nikhil-vj在现实世界中不可用,您不应该向客户端浏览器提供youtube API令牌。但是对于编程教育来说,这是非常不错的工作:-)
Bludau Media

4

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

  1. 安装youtube_dl: sudo pip3 install youtube-dl
  2. 找出您目标频道的频道ID。该ID将以UC开头。将频道的C替换为要上传的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))

1
我认为这是最好的答案,因为它不需要API密钥。要使其更加自动化,可以使用@for /f "usebackq tokens=2 delims=: " %a in (`dl-list.py^|findstr information`) do @echo https://www.youtube.com/watch?v=%a。它将打印视频的所有URL。PLAYLIST_ID可以是播放列表或频道ID。
cdlvcdlv

您可以推断出它,但是我忘了说我将代码另存为dl-list.py
cdlvcdlv


2

最近,我不得不从某个频道中检索所有视频,并根据YouTube开发者文档进行操作:https : //developers.google.com/youtube/v3/docs/playlistItems/list

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是新的,我强烈建议将代码示例从默认代码片段转换为完整示例。

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

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 '<pre>' . print_r($yt->getVideosFromChannelName('CHANNEL_NAME'), true) . '</pre>';

这样是否可以获得所有带有标题的视频,视频的URL,标识该视频的图像,喜欢/评论的数量?有关此发布方式的一些信息会有所帮助。谢谢。
霍姆纳兹

1

Python中的示例解决方案。这段视频提供的帮助:视频 与许多其他答案一样,将首先从通道ID中检索上载ID。

导入urllib.request
导入json

键=“ YOUR_YOUTUBE_API_v3_BROWSER_KEY”

#频道列表:提及您要粘贴的频道ID或用户名-“ id”或“ forUsername”
ytids = [[“” bbcnews“,” forUsername“],[” UCjq4pjKj9X4W9i7UnYShpVg“,” id“]]

新闻标题= []
对于ytid,在ytids中的ytparam:
    urld =“ https://www.googleapis.com/youtube/v3/channels?part=contentDetails&"+ytparam+"="+ytid+"&key="+key
    使用urllib.request.urlopen(urld)作为url:
        datad = json.loads(url.read())
    uploadsdet = datad ['items']
    #从频道ID获取上传ID
    uploadid = uploadsdet [0] ['contentDetails'] ['relatedPlaylists'] ['uploads']

    #检索列表
    urld =“ https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId="+uploadid+"&key="+key
    使用urllib.request.urlopen(urld)作为url:
        datad = json.loads(url.read())

    对于datad ['items']中的数据:
        ntitle = data ['snippet'] ['title']
        nlink = data ['contentDetails'] ['videoId']
        newstitles.append([nlink,ntitle])

对于链接,新闻标题中的标题:
    打印(链接,标题)

-2

从youtube频道下载的链接不是保存目录结构。因此,我编写了实现此目标的代码。一旦以上述公认的方式下载视频,请使用此功能。`

def play_vid(channel):
    yset = dict()
    temp = []
    link = channel + '/playlists'
    first = urlopen(link)
    bs = BeautifulSoup(first.read(), 'html.parser')
    for i in bs.find_all('a', {'class':'yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2'}):
        print('Creating list for the playlist: ', i.get_text())
        link = 'https://www.youtube.com'+i.get('href')
#         print(link)
        first = urlopen(link)
        bsp = BeautifulSoup(first.read(), 'html.parser')
        res=bsp.find_all('a',{'class':'pl-video-title-link'})
        for l in res:
            temp.append(l.get_text().replace(" ", "").strip())
        yset[i.get_text()]=temp
        temp=[]
    print("Done!!")
    return yset



checking = play_vid('https://www.youtube.com/user/NinjaTraderLLC')


'''for me /media/shivam/BIG/ninja is the folder where i've previously downloaded all the videos from channel'''    
downloaded = [file for file in os.listdir('/media/shivam/BIG/ninja/') if os.path.isfile('/media/shivam/BIG/ninja/'+file)]

hash_table = dict()
for i in downloaded:
    hash_table[i.replace(" ", "")] = i

for i in scraped.keys():

    if os.path.isdir('/media/shivam/BIG/ninja/'+ i):
        pass
    else:
        os.mkdir('/media/shivam/BIG/ninja/'+ i)
    minn = 1000
    mov = ""

    for j in scraped[i]:
        for k in hash_table.keys():
            if nltk.edit_distance(j, k) < minn:
                minn = nltk.edit_distance(j, k)
                mov = k
        minn = 1000
        print("Moving ",mov, "for  channel: ",j)
        shutil.copy('/media/shivam/BIG/ninja/'+ hash_table[mov], '/media/shivam/BIG/ninja/'+ i +'/'+hash_table[mov])

`


-6

作为文档状态(连接),则可以使用的信道资源类型和操作列表以获得在频道的所有影片。必须使用参数“通道ID”执行此操作。


22
说起来很容易,但是为什么不以一个很好且可行的例子来回答呢?
akshay 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.