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

时间:2013-09-23 07:07:07

标签: youtube youtube-api

我们需要按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

但是,它没有帮助。

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

18 个答案:

答案 0 :(得分:186)

您需要查看YouTube Data API。您将找到有关如何访问API的文档。您还可以找到client libraries

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

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

之后,您会收到一个包含视频ID和详细信息的JSON,您可以按照以下方式构建视频网址:

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

答案 1 :(得分:83)

首先,您需要从用户/频道获取代表上传的播放列表的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}

答案 2 :(得分:49)

Here is来自Google Developers的视频展示了如何在YouTube API的v3中列出频道中的所有视频。

有两个步骤:

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

答案 3 :(得分:7)

尝试使用以下内容。它可能对你有帮助。

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

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

答案 4 :(得分:7)

以下是Python替代方案,不需要任何特殊包。通过提供频道ID,它返回该频道的视频链接列表。请注意,您需要API Key才能使用。

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

答案 5 :(得分: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}&安培;关键= {} YOUR_API_KEY

  3. PlaylistItems:list - > https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {PLAYLIST_ID}&安培;关键= {} YOUR_API_KEY

答案 6 :(得分:6)

获取频道列表:

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

要获取播放列表项:

通过 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都是获取方法。

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

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

答案 7 :(得分: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.
             }
    });
}

这是视频的基本列表,包括ID,标题,发布日期和类似内容。但要获取每个视频的更多详细信息,例如观看次数和次数,必须对videos进行API调用。

// 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.
            }
});

请参阅full code herelive version here。 (编辑:修复github链接)
编辑:依赖关系:JQuery,Papa.parse

答案 8 :(得分:3)

由于 500视频限制,所有回答此问题的人都有问题,这是 Python 3 中使用 youtube_dl 的替代解决方案。此外,无需API密钥

  1. 安装youtube_dl:sudo pip3 install youtube-dl
  2. Find out your target channel's channel id。该ID将从UC开始。将广告的C替换为U用于上传(即UU ...),这是上传播放列表
  3. 使用youtube-dl中的播放列表下载功能。理想情况下,您不希望下载默认播放列表中的每个视频,而只下载元数据。
  4. 示例(警告 - 需要几十分钟):

    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))
    

答案 9 :(得分:2)

使用不推荐使用的API版本2,上传的网址(通道UCqAEtEr0A0Eo2IVcuWBfB9g)为:

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

有一个API版本3.

答案 10 :(得分:2)

  

以下代码将返回您频道下的所有视频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);
  

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

答案 11 :(得分:2)

来自https://stackoverflow.com/a/65440501/2585501

如果 a) 频道有 50 个以上的视频,或者 b) 想要在平面 txt 列表中格式化的 youtube 视频 ID,则此方法特别有用:

  1. 获取 Youtube API v3 密钥(请参阅 https://stackoverflow.com/a/65440324/2585501
  2. 获取频道的 Youtube 频道 ID(参见https://stackoverflow.com/a/16326307/2585501
  3. 获取频道的上传播放列表 ID:https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails(基于 https://www.youtube.com/watch?v=RjUlmco7v2M
  4. 安装 youtube-dl(例如 pip3 install --upgrade youtube-dlsudo apt-get install youtube-dl
  5. 使用 youtube-dl 下载上传播放列表:youtube-dl -j --flat-playlist "https://<yourYoutubePlaylist>" | jq -r '.id' | sed 's_^_https://youtu.be/_' > videoList.txt(参见 https://superuser.com/questions/1341684/youtube-dl-how-download-only-the-playlist-not-the-files-therein

答案 12 :(得分:1)

简答:

这里有一个可以帮助解决这个问题的库。

pip install scrapetube

import scrapetube

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

for video in videos:
    print(video['videoId'])

长答案:

由于没有其他解决方案,上面提到的模块是我自己创建的。这是我尝试过的:

  1. 硒。它有效,但有三大缺点: 1. 它需要安装 Web 浏览器和驱动程序。 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')

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

所以我制作了库 scrapetube,它使用 Web API 来获取所有视频。

答案 13 :(得分:1)

示例解决方案(使用Python)。这段视频提供的帮助:video 像许多其他答案一样,首先要从频道ID中检索上传ID。

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)

答案 14 :(得分:0)

从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])

`

答案 15 :(得分:0)

最近,我必须从频道中检索所有视频,并根据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'));

$serviceGoogle_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>';

答案 16 :(得分:0)

在提出原始问题后很久发布,但我制作了一个 python 包,它使用一个非常简单的 API 来做到这一点。它获取上传到频道的所有视频,但我不确定这部分(包含在原始问题中):

<块引用>

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

也许 YouTube 在这个问题发布后的 8 年里发生了变化,但如果没有发生,我制作的包可能无法涵盖这种情况。

使用 API:

pip3 install -U yt-videos-list # macOS
pip  install -U yt-videos-list # Windows

# if that doesn't work, try
python3 -m pip install -U yt-videos-list # macOS
python  -m pip install -U yt-videos-list # Windows

然后打开一个python解释器

python3   # macOS
python    # Windows

并运行程序:

from yt_videos_list import ListCreator
lc = ListCreator()

help(lc) # display API information - shows available parameters and functions

my_url = 'https://www.youtube.com/user/1veritasium'

lc.create_list_for(url=my_url)

答案 17 :(得分:-6)

如文档所述(link),您可以使用频道资源类型和操作列表来获取频道中的所有视频。必须使用参数'channel id'执行此操作。