【问题标题】:Download own videos in the youtube-api在 youtube-api 中下载自己的视频
【发布时间】:2013-12-11 22:22:10
【问题描述】:

yt-api 中有没有办法下载自己上传的视频?我想为视频制作像 pixabay 这样的东西。

托马斯131

【问题讨论】:

    标签: api youtube download youtube-api youtube-javascript-api


    【解决方案1】:

    虽然我还没有找到用于此的 API,但似乎他们的下载系统可以很容易地与脚本一起使用。如果您进入视频工作室,然后进入您的视频,然后将鼠标悬停在 ... 并将鼠标悬停在“下载”上,您将看到如下链接:

    https://www.youtube.com/download_my_video?v=[video_id]&t=[key]

    如果您查看一堆不同的视频,您会发现密钥始终相同。因此,您需要做的就是使用 API 查找所有视频 ID,然后提供该列表和上述密钥,您将能够以编程方式下载所有视频。我应该补充一点,您还需要从当前的浏览会话中劫持一些 cookie,并将其与请求的标头一起发送。这是很多贫民区,但它对我有用:

    import requests
    import csv
    
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "en-US,en;q=0.9",
        "cookie": "[your cookie here]"
    }
    
    key = "[your key here]"
    
    with open("hashes.csv", "r") as hashes:
        hashes_reader = csv.reader(hashes)
        for row in hashes_reader:
            print(row)
            video_id = row[1]
            url = "https://www.youtube.com/download_my_video?v=%s&t=%s" % (video_id, key)
            with requests.get(url, headers=headers, stream=True) as r:          
                r.raise_for_status()
                with open(row[0]+".mp4", "wb") as f:
                    for chunk in r.iter_content(chunk_size=8192):
                        if chunk:
                            f.write(chunk)
    

    【讨论】:

    • 是否有使用 oauth2 barer-token 标头而不是浏览器 cookie 的解决方案?我需要从大约 100 个经过身份验证的频道下载视频,生成令牌比手动登录每个频道更容易。
    • @SamRockett,不,但我相信应该可以构建一个刮板来做到这一点。看看 selenium + chrome 驱动程序。祝你好运。
    【解决方案2】:

    没有用于此的 API。您只能通过 UI 来完成。

    【讨论】:

    • 还是这样吗?是否有任何 API 可以下载我上传的视频?
    • @mukulg 据我所知,截至 2019 年 3 月,但我在下面的回答中提出了解决方法。
    • @mukulg 您可以使用 youtube-dl,这是一个很棒的选择。我最近测试了这个及其按预期工作。它允许您下载最高质量的视频,并且如果您安装了 ffmpeg,它还会自动为您添加音频流。我们实际上是在使用它来下载我们 YT 帐户中的视频。
    【解决方案3】:

    既然你用 youtube-javascript-api 标记了这个,我猜你想使用 Javascript 来构建下载应用程序。

    这里是 Javascript 客户端:https://code.google.com/p/google-api-javascript-client/

    here's the Javascript, HTML and CSS code 可以让你访问“我上传的视频”,也就是你上传的视频。

    Javascript 代码:

    // Some variables to remember state.
    var playlistId, nextPageToken, prevPageToken;
    
    // Once the api loads call a function to get the uploads playlist id.
    function handleAPILoaded() {
      requestUserUploadsPlaylistId();
    }
    
    //Retrieve the uploads playlist id.
    function requestUserUploadsPlaylistId() {
      // https://developers.google.com/youtube/v3/docs/channels/list
      var request = gapi.client.youtube.channels.list({
        mine: true,
        part: 'contentDetails'
      });
      request.execute(function(response) {
        playlistId = response.result.items[0].contentDetails.relatedPlaylists.uploads;
        requestVideoPlaylist(playlistId);
      });
    }
    
    // Retrieve a playist of videos.
    function requestVideoPlaylist(playlistId, pageToken) {
      $('#video-container').html('');
      var requestOptions = {
        playlistId: playlistId,
        part: 'snippet',
        maxResults: 10
      };
      if (pageToken) {
        requestOptions.pageToken = pageToken;
      }
      var request = gapi.client.youtube.playlistItems.list(requestOptions);
      request.execute(function(response) {
        // Only show the page buttons if there's a next or previous page.
        nextPageToken = response.result.nextPageToken;
        var nextVis = nextPageToken ? 'visible' : 'hidden';
        $('#next-button').css('visibility', nextVis);
        prevPageToken = response.result.prevPageToken
        var prevVis = prevPageToken ? 'visible' : 'hidden';
        $('#prev-button').css('visibility', prevVis);
    
        var playlistItems = response.result.items;
        if (playlistItems) {
          $.each(playlistItems, function(index, item) {
            displayResult(item.snippet);
          });
        } else {
          $('#video-container').html('Sorry you have no uploaded videos');
        }
      });
    }
    
    // Create a thumbnail for a video snippet.
    function displayResult(videoSnippet) {
      var title = videoSnippet.title;
      var videoId = videoSnippet.resourceId.videoId;
      $('#video-container').append('<p>' + title + ' - ' + videoId + '</p>');
    }
    
    // Retrieve the next page of videos.
    function nextPage() {
      requestVideoPlaylist(playlistId, nextPageToken);
    }
    
    // Retrieve the previous page of videos.
    function previousPage() {
      requestVideoPlaylist(playlistId, prevPageToken);
    }
    

    页面的 HTML 标记:

    <!doctype html>
    <html>
      <head>
        <title>My Uploads</title>
        <link rel="stylesheet" type="text/css" href="my_uploads.css">
      </head>
      <body>
        <div id="login-container" class="pre-auth">
          This application requires access to your YouTube account.
          Please <a href="#" id="login-link">authorize</a> to continue.
        </div>
        <div id="video-container"></div>
        <div class="button-container">
          <button id="prev-button" class="paging-button" onclick="previousPage();">Previous Page</button>
          <button id="next-button" class="paging-button" onclick="nextPage();">Next Page</button>
        </div>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script type="text/javascript" src="auth.js"></script>
        <script type="text/javascript" src="my_uploads.js"></script>
        <script src="https://apis.google.com/js/client.js?onload=googleApiClientReady"></script>
      </body>
    </html>
    

    CSS:

    .paging-button {
      visibility: hidden;
    }
    
    .button-container {
      clear: both;
    }
    

    来源:https://developers.google.com/youtube/v3/code_samples/javascript#my_uploaded_videos

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 2011-12-26
      • 2017-02-17
      • 2013-05-16
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多