我们需要按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
但是,它没有帮助。
我们需要在频道上发布的所有视频。上传到频道的视频可能来自多个用户,因此我认为提供用户参数不会有帮助......
答案 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
中列出频道中的所有视频。
有两个步骤:
https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
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)
只需三步:
订阅:列表 - > 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= {CHANNEL_ID}&安培;关键= {} YOUR_API_KEY
PlaylistItems:list - > https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {PLAYLIST_ID}&安培;关键= {} YOUR_API_KEY
答案 6 :(得分:6)
获取频道列表:
通过 forUserName 获取频道列表:
通过频道ID 获取频道列表:
获取频道部分:
获取播放列表:
通过频道ID 获取播放列表:
通过带有pageToken 的频道ID获取播放列表:
https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key=&pageToken = CDIQAA
要获取播放列表项:
通过 PlayListId 获取PlaylistItems列表:
要获取视频:
通过视频ID 获取视频列表:
通过多个视频ID 获取视频列表:
获取评论列表
通过视频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.list
,playlistItems
,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,标题,发布日期和类似内容。但要获取每个视频的更多详细信息,例如观看次数和次数,必须对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 here和live version here。 (编辑:修复github链接)
编辑:依赖关系:JQuery,Papa.parse
答案 8 :(得分:3)
由于 500视频限制,所有回答此问题的人都有问题,这是 Python 3 中使用 youtube_dl 的替代解决方案。此外,无需API密钥。
sudo pip3 install 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))
答案 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,则此方法特别有用:
https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
(基于 https://www.youtube.com/watch?v=RjUlmco7v2M)pip3 install --upgrade youtube-dl
或 sudo apt-get install 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'])
长答案:
由于没有其他解决方案,上面提到的模块是我自己创建的。这是我尝试过的:
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'));
$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>';
答案 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'执行此操作。