使用youtube v3 API从youtube播放列表检索所有视频

使用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 v3 API检索播放列表的视频,并获得50个项目,此链接没有任何问题:-

但是视频计数是100,而我只得到50。我怎样才能得到接下来的50个项目? 我尝试了启动索引,但它不适用于V3API。
非常感谢您的帮助。

YouTube数据API v3结果已分页。因此,您需要为其他人获取下一页的结果

基本上就是你的回答

要获得剩余的结果,请执行相同的调用,但要设置您收到的令牌。

有三个托克

  • pageToken
  • 下一站
  • prevPageToken
  • 您还可以使用设置最大页面大小

    maxResults=50{允许值1到50}

    如果您在第1页,您将无法获得
    prevPageToken

    但是你会得到下一个

    将此令牌传递给下一个请求的

    pageToken={nextPageToken从上次请求获取}

    这样,您可以导航到下一页

    编辑 好的,对于其他场景

    如果你在第一页的话

  • pageToken='某些值'
  • nextPageToken=‘某些值’
  • prevPageToken=null
  • 如果你既不在第一页也不在最后一页,那么

  • pageToken='某些值'
  • nextPageToken=‘某些值’
  • prevPageToken='某些值'
  • @你可以在下面找到你的答案

    如果你在最后一页

  • pageToken='某些值'
  • NEXTPGETOKEN=null
  • prevPageToken='Some value'

  • 甚至字段也可能不存在。

    这是一个使用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:&nbsp;<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);
        }