如何获取YouTube视频下载网址就像KeepVid(2017)一样?

时间:2017-07-21 21:17:13

标签: javascript video download youtube

我正在编写一个YouTube视频下载器。我们以此视频为例:

https://www.youtube.com/watch?v=_UbDeqPdUek

在研究如何抓取YouTube视频的网址时,我在stackoverflow上遇到了一段代码:

(function() {
    return ytplayer.config.args.adaptive_fmts
        .split(',')
        .map(item => item
            .split('&')
            .reduce((prev, curr) => (curr = curr.split('='),
                Object.assign(prev, { [curr[0]]: decodeURIComponent(curr[1]) })
            ), {})
        )
        .reduce((prev, curr) => Object.assign(prev, {
            [curr.quality_label || curr.type]: curr
        }), {});
})();

在上面的youtube网址上的chrome dev控制台中执行此操作,您将看到它将使用包含视频网址的信息发出一个对象。

' url'在&#;; 720p'财产,如下:

https://r2---sn-5hne6nlk.googlevideo.com/videoplayback?mn=sn-5hne6nlk&ip=92.111.133.132&mm=31&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Ckeepalive%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csource%2Cexpire&itag=247&mime=video%2Fwebm&dur=250.800&id=o-AEgCrHyMCCJXgH39WmxsSwNs01bFa3BDVFEIzgAyrthL&mv=m&pl=18&mt=1500667926&requiressl=yes&ms=au&expire=1500689653&initcwndbps=1997500&keepalive=yes&key=yt6&ei=lWByWcWwI4Th1gKa2aDoCg&signature=596BF2603202A1BC60493C8263928FB365A14B2A.92D082149A543786BA5C29A547A8F78DE9346F95&source=youtube&clen=47937010&gir=yes&ipbits=0&lmt=1449652247373936

当我将此网址粘贴到Chrome标签页时,它会在准系统窗口中开始播放视频。您可以使用此链接下载视频。问题是,视频没有声音!

当我使用keepvid下载视频时,它会在720p下载按钮上显示以下网址:

https://r17---sn-o097znll.googlevideo.com/videoplayback?lmt=1470986968011625&mt=1500670510&dur=250.891&itag=22&ipbits=0&ms=au&sparams=dur%2Cei%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&ei=pWpyWZ75BZyf1gLf6rXQCA&id=o-AMPIR2-sd--NM8eDZyPKMqOu1B5qqSkBd1brw-H44ARx&pl=24&mn=sn-o097znll&mm=31&source=youtube&signature=6F5B6D2EFCF5CD600D9B12C984A19DBA58AC6A7E.CC2EE5E63809D4C9A07BB2C194328C7825015976&ratebypass=yes&mv=m&mime=video%2Fmp4&ip=159.253.144.86&requiressl=yes&key=yt6&expire=1500692229&title=Cubs+Meet+Adult+Tiger+For+The+First+Time+-+Tigers+About+The+House+-+BBC

两个网址(和查询参数)之间的差异很小。但事实是,keepvid的网址比我的更好:

  1. 它会将文件作为下载文件发出,而不是在浏览器中播放。
  2. 它有声音。
  3. 为方便您使用,以下是这些网址的网址解码格式版本,其中的参数按字母顺序排列。

    我从上面的js片段获取的网址,声音无效:

    https://r2---sn-5hne6nlk.googlevideo.com/videoplayback
    clen=47937010
    dur=250.800
    ei=lWByWcWwI4Th1gKa2aDoCg
    expire=1500689653
    gir=yes
    id=o-AEgCrHyMCCJXgH39WmxsSwNs01bFa3BDVFEIzgAyrthL
    initcwndbps=1997500
    ip=92.111.133.132
    ipbits=0
    itag=247
    keepalive=yes
    key=yt6
    lmt=1449652247373936
    mime=video/webm
    mm=31
    mn=sn-5hne6nlk
    ms=au
    mt=1500667926
    mv=m
    pl=18
    requiressl=yes
    signature=596BF2603202A1BC60493C8263928FB365A14B2A.92D082149A543786BA5C29A547A8F78DE9346F95
    source=youtube
    sparams=clen,dur,ei,gir,id,initcwndbps,ip,ipbits,itag,keepalive,lmt,mime,mm,mn,ms,mv,pl,requiressl,source,expire
    

    我从keepvid获得的网址,声音正常:

    https://r17---sn-o097znll.googlevideo.com/videoplayback
    dur=250.891
    ei=pWpyWZ75BZyf1gLf6rXQCA
    expire=1500692229
    id=o-AMPIR2-sd--NM8eDZyPKMqOu1B5qqSkBd1brw-H44ARx
    ip=159.253.144.86
    ipbits=0
    itag=22
    key=yt6
    lmt=1470986968011625
    mime=video/mp4
    mm=31
    mn=sn-o097znll
    ms=au
    mt=1500670510
    mv=m
    pl=24
    ratebypass=yes
    requiressl=yes
    signature=6F5B6D2EFCF5CD600D9B12C984A19DBA58AC6A7E.CC2EE5E63809D4C9A07BB2C194328C7825015976
    source=youtube
    sparams=dur,ei,id,ip,ipbits,itag,lmt,mime,mm,mn,ms,mv,pl,ratebypass,requiressl,source,expire
    title=Cubs Meet Adult Tiger For The First Time - Tigers About The House - BBC
    

    如您所见,网址/参数非常相似。但是keepvid如何设法生成一个声音有效的文件网址,而我的js片段却在没有音频的情况下向我疯狂?

    网址有一个签名作为参数。这可能是(某些)查询参数本身的签名。在参数中更改小内容(删除它或更改其值)会导致URL被拒绝访问。这使得很难对其进行试验。

    js片段只是访问在线变量并从中挖掘视频信息。但遗漏的片段是什么导致其网址引用无声视频?

    任何人都可以帮助我以编程方式获取一个url,就像keepvid一样,这会导致下载的文件带有工作音频吗?

    [更新]

    我刚刚知道你可以抓住这样的视频信息:

    http://youtube.com/get_video_info?video_id=_UbDeqPdUek
    

    它会生成一个包含大量信息的大文件,但我还没有弄清楚如何解析。

    我必须走正确的道路,因为这就是youtube-dl正在做的事情。而且该计划完美无瑕。

    我想我可以简单地逆向工程youtube-dl(花费时间)。或者甚至使用Process从我的C#程序中调用它(让我依赖它)。

    但是,如果没有任何帮助,这仍然让我想到一个人如何自己解决这个问题?

1 个答案:

答案 0 :(得分:2)

Youtube有两种类型的流 - 多路复用和自适应。第一个有视频和声音,第二个只有两个。由于它们被逐步淘汰,多路复用流的质量通常比其自适应流的质量低得多。 KeepVideo的功能是为您提供旧的多路复用格式。

除此之外,在大部分视频中,Youtube使用签名加密,这为检索流URL增加了另一个相当大的步骤。我不建议你自己这样做。

您可以查看YoutubeExplode这是一个可以查询和下载视频的库。您还可以查看使用YoutubeExplode和ffmpeg下载和多路复用视频的sample project

  

但是,如果没有任何帮助,这仍然让我想到一个人如何自己解决这个问题?

打开Chrome开发者控制台并继续检查“网络”标签,直到您开始注意到模式。