使用youtube v3 API从youtube播放列表检索所有视频
我正在使用youtube v3 API检索播放列表的视频,并获得50个项目,此链接没有任何问题:- 但是视频计数是100,而我只得到50。我怎样才能得到接下来的50个项目? 我尝试了启动索引,但它不适用于V3API。使用youtube v3 API从youtube播放列表检索所有视频,youtube,youtube-api,youtube-data-api,Youtube,Youtube Api,Youtube Data Api,我正在使用youtube v3 API检索播放列表的视频,并获得50个项目,此链接没有任何问题:- 但是视频计数是100,而我只得到50。我怎样才能得到接下来的50个项目? 我尝试了启动索引,但它不适用于V3API。 非常感谢您的帮助。YouTube数据API v3结果已分页。因此,您需要为其他人获取下一页的结果 基本上就是你的回答 要获得剩余的结果,请执行相同的调用,但要设置您收到的令牌。有三个托克 pageToken 下一站 prevPageToken 您还可以使用设置最大页面大小 max
非常感谢您的帮助。YouTube数据API v3结果已分页。因此,您需要为其他人获取下一页的结果 基本上就是你的回答 要获得剩余的结果,请执行相同的调用,但要设置您收到的令牌。有三个托克
prevPageToken
但是你会得到下一个
将此令牌传递给下一个请求的
pageToken={nextPageToken从上次请求获取}
这样,您可以导航到下一页
编辑
好的,对于其他场景
如果你在第一页的话
甚至字段也可能不存在。这是一个使用python Youtube客户端库的python小示例 这还借用了youtube API示例中的样板设置
""" Pull All Youtube Videos from a Playlist """
from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser
DEVELOPER_KEY = "YOURKEY HERE"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
def fetch_all_youtube_videos(playlistId):
"""
Fetches a playlist of videos from youtube
We splice the results together in no particular order
Parameters:
parm1 - (string) playlistId
Returns:
playListItem Dict
"""
youtube = build(YOUTUBE_API_SERVICE_NAME,
YOUTUBE_API_VERSION,
developerKey=DEVELOPER_KEY)
res = youtube.playlistItems().list(
part="snippet",
playlistId=playlistId,
maxResults="50"
).execute()
nextPageToken = res.get('nextPageToken')
while ('nextPageToken' in res):
nextPage = youtube.playlistItems().list(
part="snippet",
playlistId=playlistId,
maxResults="50",
pageToken=nextPageToken
).execute()
res['items'] = res['items'] + nextPage['items']
if 'nextPageToken' not in nextPage:
res.pop('nextPageToken', None)
else:
nextPageToken = nextPage['nextPageToken']
return res
if __name__ == '__main__':
# comedy central playlist, has 332 video
# https://www.youtube.com/watch?v=tJDLdxYKh3k&list=PLD7nPL1U-R5rDpeH95XsK0qwJHLTS3tNT
videos = fetch_all_youtube_videos("PLD7nPL1U-R5rDpeH95XsK0qwJHLTS3tNT")
视频将是连接到第一个列表的所有视频的列表。它将继续抓取,直到它有所有的视频,因为分页50。其他语言也可以采用类似的方法
在列表中,将显示youtube data.pageInfo.totalResults发送给我们的JSON数据中的所有单个视频元数据和顺序。几个月或几年后,这个数字可能会因为视频删除、禁止。。。实际上,youtube只提供当前可播放的视频。 因此,我们需要更改代码以获得更好的代码。
我们不应该使用if(sum==data.pageInfo.toTalResults)作为停止条件。 相反,让我们使用标准if(typeof nextpGetOken=='undefined')。
在当前总数小于原始总数的情况下。如果我们使用旧编码,那么最后一个函数调用是使用未定义的nextPageToken进行的。这导致Youtube再次错误地为我们提供了第一个JSON页面。在结果中,我们有一些重复的视频。
请尝试我的新编码(看起来像是user3053204先生给出的编码)
/*新编码。请更换并使用您的api3密钥*/
函数start(){
计数=0;
$('面积1').val('');
getVids();
}
函数getVids(PageToken){
pid=$('#searchtext1').val();
美元(
"https://www.googleapis.com/youtube/v3/playlistItems",{
部分:'代码片段',
最大结果:50,
playlid:pid,
pageToken:pageToken,
关键字:“AIz……zm4”
},
功能(数据){
我的计划(数据);
}
);
}
计数=0;
str='';
功能myPlan(数据){
nextPageToken=data.nextPageToken;
pageLen=data.items.length;
计数+=parseInt(pageLen);
对于(i=0;i
获取项目
测试ID:PLTI6YRVQLYQ9KOU-NHu43uDmKON7Fsjv
PL32C69B40337EF920
使用递归的另一种解决方案:
$.fn.loadYoutubeResource = function(resource_request, resource_type, resource_id, resource_container, pageToken = null, callback = null){
$.ajax({
url: "https://www.googleapis.com/youtube/v3/" + resource_request,
type: 'get',
dataType: 'json',
data: {
part : 'snippet',
[resource_type]: resource_id,
maxResults : 50,
pageToken: pageToken,
key: '< API Key >',
},
success: function(data) {
console.log("New resource " + resource_type + " loaded:");
console.log(data);
for(var index = 0; index < data.items.length; index++){
var url = data.items[index]['snippet'].thumbnails.default.url;
var ytb_id = data.items[index]['id'];
jQuery('#' + resource_container).append('<img class="tube_thumbs" src="' + url + '" id="' + ytb_id
+ '" title="' + data.items[index]['snippet']['title'] + '" >');
}
if ( data.nextPageToken == null)
return callback();
$.fn.loadYoutubeResource(resource_request, resource_type, resource_id, resource_container, data.nextPageToken, callback);
}
});
}
$.fn.LoadYouTuberResource=函数(资源请求、资源类型、资源id、资源容器、pageToken=null、回调=null){
$.ajax({
url:“https://www.googleapis.com/youtube/v3/“+资源请求,
键入:“get”,
数据类型:“json”,
数据:{
部分:'代码片段',
[资源类型]:资源id,
最大结果:50,
pageToken:pageToken,
键:“”,
},
成功:功能(数据){
日志(“新资源”+加载的资源类型+”);
控制台日志(数据);
对于(var index=0;index
然后按如下方式进行命名:
jQuery('body').append('<div id="ytb_container"></div>');
$.fn.loadYoutubeResource('playlistItems', 'playlistId', 'PLmwK57OwOvYVdedKc_vPPfbcsey_R0K8r', 'ytb_container', null, function(){ <callback code>});
jQuery('body').append('');
$.fn.LoadYouTuberSource('PlayItems','PlayId','PLMWK57OWOVYVDEKC_vPPfbcsey_R0K8r','ytb_container',null,function(){});
这是我的递归函数,也许可以帮助一些人:
首先,我为第一次通话创建了一个按钮:
<button id="aux" class="btn btn-danger">Click Me</button>
将视为获取所有视频的最简单方法
DEVELOPER_KEY = "REPLACE_ME" YOUTUBE_API_SERVICE_NAME = "youtube" YOUTUBE_API_VERSION = "v3"
youtube = build("youtube", "v3", developerKey=api_key)
传递播放列表id
items = youtube.playlistItems()
playlist = get_videos_from_playlist(youtube, items, 'PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z')
然后分析列表:
for videoID in playlist:
print(videoID)
此外,您还可以使用页面在多个页面中刮取,例如:
nextPageToken = res.get('nextPageToken')
while ('nextPageToken' in res):
nextPage = youtube.playlistItems().list(
part="snippet",
playlistId=playlistId,
maxResults="50",
pageToken=nextPageToken
).execute()
res['items'] = res['items'] + nextPage['items']
if 'nextPageToken' not in nextPage:
res.pop('nextPageToken', None)
else:
nextPageToken = nextPage['nextPageToken']
另一种方法(不需要知道和拥有api密钥的请求格式):只需使用json-loacated insi
for videoID in playlist:
print(videoID)
nextPageToken = res.get('nextPageToken')
while ('nextPageToken' in res):
nextPage = youtube.playlistItems().list(
part="snippet",
playlistId=playlistId,
maxResults="50",
pageToken=nextPageToken
).execute()
res['items'] = res['items'] + nextPage['items']
if 'nextPageToken' not in nextPage:
res.pop('nextPageToken', None)
else:
nextPageToken = nextPage['nextPageToken']
<meta charset = utf-8>
<body>
<div id="help" style="width:90%">
1- Open youtube.com and search for playlist (http://www.youtube.com/....&list=...)<br>
For example: click <a href="http://www.youtube.com/watch?v=sMyj9e2qOc0&list=PL33196EF7664597D5">paul mauriat playlist</a><br>
You will see in the adress bar: http://www.youtube.com/watch?v=sMyj9e2qOc0&list=PL33196EF7664597D5 <br>
Select all and copy this url.<br>
2- Open any online html source code viewer. For example<br>
<a href="https://www.duplichecker.com/page-snooper.php">
https://www.duplichecker.com/page-snooper.php</a><br>
Paste the url, click "Enter", wait several seconds, scroll down, click "Copy"<br>
3- Return to this page. Paste the code to the below input smal textarea, wait several seconds, click "GET VIDEO IDS".<br>
4- Click the button TEST JAVASCRIPT.
</div><br>
<textarea id = "input">
</textarea><br>
<button onclick="extract()">GET VIDEOS IDS</button><br>
Total: <span id='len'></span>
<br><button onclick="test()">TEST JAVASCRIPT</button><br>
COPY THIS TO CREATE A JAVASCRIPT FILE<br>
<textarea id="area2" style="width:90%;height:400px;font-size:14pt">
</textarea><br>
<script>
function extract(){
str = document.getElementById('input').value;
aa = str.indexOf('{"responseContext');
bb = str.indexOf('{"related', aa);
jsn = str.substring(aa, bb + 24);
obje = JSON.parse(jsn);
alert('Click OK to continue');
make();
}
glStr = '';
function make(){
len = obje.contents.singleColumnWatchNextResults.playlist.playlist.contents.length;
ss = '';
for(i=0; i < len; i++){
try{
ti = obje.contents.singleColumnWatchNextResults.playlist.playlist.contents[i].playlistPanelVideoRenderer.title.runs[0].text;
ti1 = ti.replace(/"/g,'\\"');
ide = obje.contents.singleColumnWatchNextResults.playlist.playlist.contents[i].playlistPanelVideoRenderer.navigationEndpoint.watchEndpoint.videoId;
}catch(e){
ide = obje.contents.singleColumnWatchNextResults.playlist.playlist.contents[i].playlistPanelVideoRenderer.videoId;
ti1 = '[Deleted Video]';
}
ss += '{vid:"' + ide + '",tit:"' + ti1 + '"}';
if(i != (len - 1)){
ss += ',\n';
}
}
glStr = 'obj = \n[' + ss + '\n];\n';
document.getElementById('area2').value = glStr;
document.getElementById('len').innerHTML = len + ' videos';
}
function test(){
var head = document.getElementsByTagName('head').item(0);
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.innerHTML = glStr;
head.appendChild(script);
alert('obj.length = ' + obj.length);
alert('obj[5].vid = ' + obj[5].vid + '\n obj[5].tit = ' + obj[5].tit);
}
</script>
</body>
getSnippets(token): any {
console.log('API_TOKEN:',token);
if(token){
return this.http.get('https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=PLV_aspERmuCKxUPxu8UwUd3I52VLje0ra&maxResults=100&key=[API_KEY]='+token).toPromise();
}else{
return this.http.get('https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=PLV_aspERmuCKxUPxu8UwUd3I52VLje0ra&maxResults=100&key=[API_KEY]').toPromise();
}
}
async getPlayList(){
try{
let pageToken;
this.finalAr = [];
// for(let t = 0; t <= 1; t++) {
const list = await this.service.getSnippets(pageToken);
pageToken = list.nextPageToken;
// let pageInfo = list.pageInfo;
let pageTot = list.pageInfo.totalResults;
let resultsPerPage = list.pageInfo.resultsPerPage;
let loopCnt = pageTot / resultsPerPage;
let finalCnt = Math.abs(Math.ceil(loopCnt)) - 1 ;
if(pageToken != undefined || pageToken != null){
let tempAr = list.items;
for(let i = 0; i < tempAr.length; i++){
this.finalAr.push({"vid_id" : tempAr[i].snippet.resourceId.videoId,
"vid_title": tempAr[i].snippet.title,
"vid_desc" : tempAr[i].snippet.description,
"vid_icon" : 'https://i.ytimg.com/vi/'+tempAr[i].snippet.resourceId.videoId+'/sddefault.jpg'
})
}
console.log('finalAr_1:',this.finalAr);
}
for(let a = 1; a <= finalCnt; a++){
const listF = await this.service.getSnippets(pageToken);
pageToken = listF.nextPageToken;
let tempAr = listF.items;
for(let i = 0; i < tempAr.length; i++){
this.finalAr.push({"vid_id" : tempAr[i].snippet.resourceId.videoId,
"vid_title": tempAr[i].snippet.title,
"vid_desc" : tempAr[i].snippet.description,
"vid_icon" : 'https://i.ytimg.com/vi/'+tempAr[i].snippet.resourceId.videoId+'/sddefault.jpg'
})
}
console.log('finalAr_2:',this.finalAr);
}
}catch (e){
console.log('ER:',e);
}