【问题标题】:Youtube api v3 Get list of user's videosYoutube api v3 获取用户视频列表
【发布时间】:2014-05-02 01:48:33
【问题描述】:

使用 Youtube api v2,可以轻松获取视频。只需发送这样的查询:

http://gdata.youtube.com/feeds/mobile/videos?max-results=5&alt=rss&orderby=published&author=OneDirectionVEVO

Youtube api v2 还有一个用于构建查询的交互式演示页面: http://gdata.youtube.com/demo/index.html

用Youtube api v3,不知道对应的方式。请用 api v3 给我指路。

谢谢!

【问题讨论】:

标签: youtube youtube-api youtube-data-api


【解决方案1】:

channels#list 方法将返回一个 JSON,其中包含有关频道的一些信息,包括“上传”播放列表的播放列表 ID:

https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=OneDirectionVEVO&key={YOUR_API_KEY}

使用播放列表 ID,您可以使用 playlistItems#list 方法获取视频:

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=UUbW18JZRgko_mOGm5er8Yzg&key={YOUR_API_KEY}

您可以在文档页面的末尾进行测试。

【讨论】:

【解决方案2】:

应该这样做。此代码只是获取并输出标题,但您可以获得所需的任何详细信息

// Get Uploads Playlist
$.get(
   "https://www.googleapis.com/youtube/v3/channels",{
   part : 'contentDetails', 
   forUsername : 'USER_CHANNEL_NAME',
   key: 'YOUR_API_KEY'},
   function(data) {
      $.each( data.items, function( i, item ) {
          pid = item.contentDetails.relatedPlaylists.uploads;
          getVids(pid);
      });
  }
);

//Get Videos
function getVids(pid){
    $.get(
        "https://www.googleapis.com/youtube/v3/playlistItems",{
        part : 'snippet', 
        maxResults : 20,
        playlistId : pid,
        key: 'YOUR_API_KEY'},
        function(data) {
            var results;
            $.each( data.items, function( i, item ) {
                results = '<li>'+ item.snippet.title +'</li>';
                $('#results').append(results);
            });
        }
    );
}


<!--In your HTML -->
<ul id="results"></ul>

【讨论】:

    【解决方案3】:

    如果考虑配额成本,遵循这个简单的算法可能会有所帮助。

    首先从https://www.youtube.com/feeds/videos.xml?channel_id= 获取数据...这是一个简单的 XML 提要,它会为您提供视频 ID,但您不能指定更多的“部分”(统计信息等)。

    使用该列表中的视频 ID,在 /videos API 端点上进行查询,该端点允许使用逗号分隔的视频 ID 列表,这应该只会导致 1 个配额成本,加上任何其他部分参数的 0-2 .正如@chrismacp 指出的那样,使用 /search 端点更简单,但配额成本为 100,可以快速加起来。

    在您进行第二次调用时,此处需要考虑资源(cpu、内存等),但我相信在许多情况下这可能是一种有用的方法。

    【讨论】:

    • XML 提要仅包含该频道最近上传的 15 条内容,这对于许多用途来说是不够的。
    • @timothymh 这是真的,感谢您提出这一重要观点。无论如何,如果 15 足以满足您的需求,就像我的需求一样,那么希望其他人可能会发现这个替代方案很有用。
    • 绝对正确。我实际上有机会自己使用这种方法! :)
    【解决方案4】:

    在 API 的 V3 中发生了很大变化。这是video,它会引导您完成获取在给定频道中上传的视频列表所需的 v3 API 调用,并使用 API Explorer 进行现场演示。

    YouTube 开发者直播:在 v3 中获取频道的上传内容 - https://www.youtube.com/watch?v=RjUlmco7v2M

    【讨论】:

      【解决方案5】:

      如果它对这里的任何人有帮助,这就是我发现的,到目前为止似乎对我来说效果很好。在发出此请求之前,我正在通过 OAuth 2.0 对成员进行身份验证,这将为我提供经过身份验证的成员视频。与往常一样,您的个人里程可能会有所不同:D

      curl https://www.googleapis.com/youtube/v3/search -G \
      -d part=snippet \
      -d forMine=true \
      -d type=video \
      -d order=date \
      -d access_token={AUTHENTICATED_ACCESS_TOKEN}
      

      【讨论】:

      • 这也是我一直在做的,但我意识到它包括已删除视频的结果,这非常烦人。
      【解决方案6】:

      相当于您发布的请求实际上是 3.0 api 中的搜索,而不是播放列表请求。这样做也更容易。不过,您确实需要将用户名换成频道 ID。

      例如。获取https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=UUGhCVGZ0ZSpe5hJHWyiLwHA&key={YOUR_API_KEY}

      【讨论】:

      • search.list 的配额成本为 100。channel.list + playlistItems.list 组合的配额为 4。请记住。
      【解决方案7】:

      这是一些使用官方 Google API 节点库 (https://github.com/google/google-api-nodejs-client) 的代码

      const readJson = require("r-json");
      const google = require('googleapis');
      const Youtube = google.youtube('v3');
      
      // DONT store your credentials in version control
      const CREDENTIALS = readJson("/some/directory/credentials.json");
      
      let user = "<youruser>";
      let numberItems = 10; 
      
      let channelConfig = {
        key: CREDENTIALS.youtube.API_KEY,
        part: "contentDetails",
        forUsername: user
      };
      
      Youtube.channels.list(channelConfig, function (error, data) {
      
        if (error) {
          console.log("Error fetching YouTube user video list", error);
          return;
        }
      
        // Get the uploads playlist Id
        let uploadsPlaylistId = data.items[0].contentDetails.relatedPlaylists.uploads;
      
        let playlistConfig = {
          part : 'snippet',
          maxResults : size,
          playlistId : uploadsPlaylistId,
          key: CREDENTIALS.youtube.API_KEY
        };
      
        // Fetch items from upload playlist
        Youtube.playlistItems.list(playlistConfig, function (error, data) {
      
          if (error) {
            console.log("Error fetching YouTube user video list", error);
          }
      
          doSomethingWithYourData(data.items);
        });
      });
      

      【讨论】:

        【解决方案8】:

        另一种方法可能是通过以下方式获取当前经过 oauth 身份验证的用户的播放列表:property mine=true

        在身份验证后检索 oauth access_token 的位置: https://developers.google.com/youtube/v3/guides/authentication

        https://www.googleapis.com/youtube/v3/playlists?part=id&mine=true&access_token=ya29.0gC7xyzxyzxyz
        

        【讨论】:

          【解决方案9】:

          如果您想获取超过 300 个视频的播放列表的视频,请不要使用 playlistitems.list。您可以在“试用”部分的 google 链接“https://developers.google.com/youtube/v3/docs/playlistItems/list”中实时试用。它返回未定义。

          我也在我的项目中使用过。它只返回未定义。

          【讨论】:

            【解决方案10】:

            在 PHP 中: 我使用 pageToken 属性转到播放列表的所有页面。希望它可以帮助你。

            //step 1: get playlist id
            
             $response = file_get_contents("https://www.googleapis.com/youtube/v3/channels?key={$api_key}&forUsername={$channelName}&part=contentDetails");
             $searchResponse = json_decode($response,true);
             $data = $searchResponse['items'];
             $pid =  $data[0]['contentDetails']['relatedPlaylists']['uploads'];
            
            //step 2: get all videos in playlist
            
             $nextPageToken = '';
             while(!is_null($nextPageToken)) {
                 $request = "https://www.googleapis.com/youtube/v3/playlistItems?key={$api_key}&playlistId={$pid}&part=snippet&maxResults=50&pageToken=$nextPageToken";
            
                $response = file_get_contents($request);
                $videos = json_decode($response,true);
            
                //get info each video here...
            
               //go next page
                $nextPageToken = $videos['nextPageToken'];
            }
            

            【讨论】:

              【解决方案11】:

              在node.js中,可以通过以下代码实现。

              需要authKey 和channelId 作为options 对象参数。

              获取数据后调用cb回调。

              async function fetchChannelInfo(options) {
                const channelUrl = `https://www.googleapis.com/youtube/v3/channels?part=contentDetails,statistics&id=${
                  options.channelId
                }&key=${options.authKey}`;
                const channelData = await axios.get(channelUrl);
              
                return channelData.data.items[0];
              }
              function fetch(options, cb) {
                fetchChannelInfo(options).then((channelData) => {
                  options.playlistId = channelData.contentDetails.relatedPlaylists.uploads;
                  const paylistUrl = `https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=${
                    options.playlistId
                  }&key=${options.authKey}`;
              
                  axios
                    .get(paylistUrl)
                    .then((response) => {
                      const payloadData = ;
              
                      const videoList = [];
                      response.data.items.forEach((video) => {
                        videoList.push({
                          publishedAt: video.snippet.publishedAt,
                          title: video.snippet.title,
                          thumbnails: thumbnails,
                          videoId: video.snippet.resourceId.videoId,
                        });
                      });
              
                      cb(null, videoList);
                    })
                    .catch((err) => {
                      cb(err, null);
                    });
                });
              }
              

              注意:axios 用于 RESTful 请求。安装

              npm install axios
              

              【讨论】:

                【解决方案12】:
                $.get(
                    "https://www.googleapis.com/youtube/v3/channels",{
                      part: 'snippet,contentDetails,statistics,brandingSettings',
                      id: viewid,
                      key: api},
                      function(data){
                
                        $.each(data.items, function(i, item){
                
                
                          channelId = item.id;
                          pvideo = item.contentDetails.relatedPlaylists.uploads;
                          uploads(pvideo);
                });
                
                      });
                

                上传功能可以

                function uploads(pvideo){
                
                
                       $.get(
                        "https://www.googleapis.com/youtube/v3/playlistItems",{
                          part: 'snippet',
                          maxResults:12,
                          playlistId:pvideo,
                          key: api},
                          function(data){
                
                
                            $.each(data.items, function(i, item){
                
                                 videoTitle = item.snippet.title;
                             videoId = item.id;
                            description = item.snippet.description;
                            thumb = item.snippet.thumbnails.high.url;
                            channelTitle = item.snippet.channelTitle;
                            videoDate = item.snippet.publishedAt;
                            Catagoryid = item.snippet.categoryId;
                            cID = item.snippet.channelId;
                
                            })
                          }
                        );
                     }
                

                【讨论】:

                  【解决方案13】:

                  function tplawesome(e,t){res=e;for(var n=0;n<t.length;n++){res=res.replace(/\{\{(.*?)\}\}/g,function(e,r){return t[n][r]})}return res}
                  
                  
                  
                  $(function() {
                  
                  
                      $(".form-control").click(function(e) {
                  
                  
                         e.preventDefault();
                  
                  
                         // prepare the request
                  
                  
                         var request = gapi.client.youtube.search.list({
                  
                  
                              part: "snippet",
                  
                  
                              type: "video",
                  
                  
                              q: encodeURIComponent($("#search").val()).replace(/%20/g, "+"),
                  
                  
                              maxResults: 20,
                  
                  
                              order: "viewCount",
                  
                  
                              publishedAfter: "2017-01-01T00:00:00Z"
                  
                  
                         }); 
                  
                  
                         // execute the request
                  
                  
                         request.execute(function(response) {
                  
                  
                            var results = response.result;
                  
                  
                            $("#results").html("");
                  
                  
                            $.each(results.items, function(index, item) {
                  
                  
                              $.get("tpl/item.html", function(data) {
                  
                  
                                  $("#results").append(tplawesome(data, [{"title":item.snippet.title, "videoid":item.id.videoId ,"descrip":item.snippet.description ,"date":item.snippet.publishedAt ,"channel":item.snippet.channelTitle ,"kind":item.id.kind ,"lan":item.id.etag}]));
                  
                  
                              });
                  
                  
                              
                  
                  
                            });
                  
                  
                            resetVideoHeight();
                  
                  
                         });
                  
                  
                      });
                  
                  
                      
                  
                  
                      $(window).on("resize", resetVideoHeight);
                  
                  
                  });
                  
                  
                  
                  function resetVideoHeight() {
                  
                  
                      $(".video").css("height", $("#results").width() * 9/16);
                  
                  
                  }
                  
                  
                  
                  function init() {
                  
                  
                      gapi.client.setApiKey("YOUR API KEY .... USE YOUR KEY");
                  
                  
                      gapi.client.load("youtube", "v3", function() {
                  
                  
                          // yt api is ready
                  
                  
                      });
                  
                  
                  }

                  在此处查看完整代码https://thecodingshow.blogspot.com/2018/12/youtube-search-api-website.html

                  【讨论】:

                    猜你喜欢
                    • 2014-01-26
                    • 2014-06-05
                    • 2016-01-17
                    • 2015-08-29
                    • 2015-06-27
                    • 2015-03-11
                    • 2015-01-14
                    • 2018-06-28
                    • 2014-10-22
                    相关资源
                    最近更新 更多