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 < / p >

但是,这并没有帮助。

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

335996 次浏览

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

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

有一个API版本3。

你必须得到你想要得到数据的视频的channel_id

为了使用video_id获取channel_id,你可以使用YouTube数据API的视频:列表端点-在Id参数中添加video_id例子

然后,使用channel_id,将第二个字符改为"U":

这个修改后的id是上传播放列表说YouTube频道。

通过这个Uploads playlist_id,你可以使用YouTube Data API的Playlistitem:列表端点从频道中检索所有上传的视频。

在部分参数中添加“id,snippet,contentDetails,status”; 并在playlistID中添加修改后的通道ID。 然后执行。

你需要看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

之后,你会收到一个包含视频id和详细信息的JSON,你可以像这样构造你的视频URL:

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

试着像下面这样做。它可能对你有帮助。

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

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

首先,你需要从用户/频道获取代表上传的播放列表的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,前缀是UU而不是UC

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

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. 订阅:list -> https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=50&mine=true&access_token= {oauth_token} < / p > < /李>

  2. 通道:list -> https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id= {channel_id},关键= {YOUR_API_KEY} < / p > < /李>

  3. PlaylistItems: list -> https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {playlist_id},关键= {YOUR_API_KEY} < / p > < /李>

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

有两个步骤:

  1. 查询Channels以获得“uploads”Id。如https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails

  2. 使用这个“uploads”Id查询PlaylistItems以获得视频列表。如https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50

下面是返回频道下所有视频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
最近,我不得不从一个频道检索所有的视频,根据YouTube开发者文档: https://developers.google.com/youtube/v3/docs/playlistItems/list < / p >
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对象。

所以你必须从频道中获取信息来检索“uploads”播放列表,该列表实际上包含了该频道上传的所有视频: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>';

由于每个回答这个问题的人都有由于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))

下面是一个不需要任何特殊包的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

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

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

这也可以限制一次发出的请求的实际数量,从而防止您违反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.
}
});

参见完整代码在这里现场版. c。(编辑:固定的github链接)
编辑:依赖:JQuery, Papa.parse

获取频道列表:

通过forUserName获取通道列表:

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

通过通道标识获取频道列表:

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=

获取播放列表:

通过通道标识获取播放列表:

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&关键= ********** k

通过通道标识获取注释列表:

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

通过allThreadsRelatedToChannelId获取注释列表:

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

这里所有的api都是得到方法。

基于频道id,我们不能直接得到所有的视频,这是这里的重点。

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

示例解决方案在Python中。视频 与许多其他答案一样,上传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)

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

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

  1. 获取一个Youtube API v3密钥(参见https://stackoverflow.com/a/65440324/2585501)
  2. 获取频道的Youtube Channel 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. 下载upload播放列表使用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)

简短的回答:

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

pip install scrapetube

import scrapetube


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


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

长一点的回答:

上面提到的模块是由我创建的,因为没有任何其他解决方案。以下是我的尝试:

  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来获得所有的视频。

在最初的问题被问到之后很久才发布,但我做了一个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)
这是我的Python解决方案,使用谷歌API。 观察:< / p >
  • 创建一个.env文件来存储API开发密钥,并将其放入.gitignore文件中
  • 参数“forusername”;应设置Youtube频道的名称(用户名)。或者,您也可以使用通道id,为用户名设置参数“"id"”,而不是“"”。
  • 对象“播放列表”;让您访问每个视频。我只展示了它的标题,但还有很多其他属性。
import os
import googleapiclient.discovery
from decouple import config
def main():
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"


api_service_name = "youtube"
api_version = "v3"
DEVELOPER_KEY = config('API_KEY')


youtube = googleapiclient.discovery.build(
api_service_name, api_version, developerKey = DEVELOPER_KEY)


request = youtube.channels().list(
part="contentDetails",
forUsername="username",
# id="oiwuereru8987",
)


response = request.execute()
for item in response['items']:
playlistId = item['contentDetails']['relatedPlaylists']['uploads']
nextPageToken = ''
while (nextPageToken != None):
playlistResponse = youtube.playlistItems().list(
part='snippet',
playlistId=playlistId,
maxResults=25,
pageToken=nextPageToken
)
playlistResponse = playlistResponse.execute()
print(playlistResponse.keys())
for idx, playlistItem in enumerate(playlistResponse['items']):
print(idx, playlistItem['snippet']['title'])
if 'nextPageToken' in playlistResponse.keys():
nextPageToken = playlistResponse['nextPageToken']
else:
nextPageToken = None


if __name__ == "__main__":
main()

示例:.env文件

API_KEY=<Key_Here>

使用gapi JavaScript API,你可以做到这一点

<script src="https://apis.google.com/js/api.js"></script>
const start = () => {
gapi.client
.init({
apiKey: "your_youtubeApiKey",
discoveryDocs: ["https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest"],
scope: "https://www.googleapis.com/auth/youtube.readonly",
})
.then(() => {
console.log("gapi.client initiated");
})
.then(() =>
gapi.client.youtube.channels.list({
part: "snippet,contentDetails,statistics",
id: "youtube_channelId",
// forUsername: 'Bankless',
})
)
.then(
(res) =>
// get the youtube related playlist id
res.result.items[0].contentDetails.relatedPlaylists.uploads
)
.then((playlistId) =>
gapi.client.youtube.playlistItems.list({
part: "snippet",
playlistId,
maxResults: 50,
})
)
.then((res) =>
// get youtube videos snippets
res.result.items.map((item) => item.snippet)
)
.then((snippets) =>
snippets.map((snippet) => {
const { title, description, resourceId } = snippet;
const { videoId } = resourceId;
return { title, description, videoId };
})
)
.then((videos) => {
console.log(videos);
})
.catch((err) => console.error(err));
};
gapi.load("client", start);

文档: