262

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

但是,它没有帮助。

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

4

17 回答 17

263

您需要查看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}
于 2013-12-27T06:00:00.547 回答
176

首先,您需要获取代表来自用户/频道的上传的播放列表的 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"是您的频道 ID,以供将来参考。

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

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}
于 2015-01-10T02:27:01.743 回答
123

这是来自 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

于 2016-04-03T15:33:57.417 回答
42

获取频道列表:

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

于 2019-03-19T12:50:24.713 回答
12

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

<?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.

于 2017-01-18T09:42:36.810 回答
11

下面是一个不需要任何特殊包的 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
于 2017-11-14T16:32:08.027 回答
7

尝试如下。它可能会帮助你。

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

这里作者可以指定您的频道名称和“q”,您可以指定搜索关键字。

于 2014-01-27T11:12:05.180 回答
7

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

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

这也有助于限制一次发出的实际请求数,从而确保您不会违反 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

于 2017-12-13T18:52:38.033 回答
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. 播放列表项:列表 -> https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {playlist_id}&key={YOUR_API_KEY}

于 2015-07-28T15:19:59.847 回答
5

由于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))
于 2017-06-14T00:00:54.070 回答
4

简短的回答:

这是一个可以提供帮助的库。

pip install scrapetube

import scrapetube

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

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

长答案:

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

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

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

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

于 2021-07-28T10:06:12.503 回答
2

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

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

有一个 API 版本 3。

于 2013-10-10T16:11:57.663 回答
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>';
于 2017-05-23T08:17:40.150 回答
1

在提出原始问题很久之后发布,但我制作了一个 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)
于 2021-09-08T06:39:00.673 回答
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:
        数据 = 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:
        数据 = json.loads(url.read())

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

对于链接,新闻标题中的标题:
    打印(链接,标题)
于 2019-04-14T08:55:05.890 回答
1

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

如果 a) 频道有超过 50 个视频,或者 b) 希望 youtube 视频 id 格式为平面 txt 列表,则此方法特别有用:

  1. 获取 Youtube API v3 密钥(参见https://stackoverflow.com/a/65440324/2585501
  2. 获取频道的Youtube频道ID(见https://stackoverflow.com/a/16326307/2585501
  3. 获取频道的 Uploads Playlist 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
于 2020-12-24T15:51:56.523 回答
-6

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

于 2013-10-10T16:46:13.917 回答