Answers:
有一个非常受欢迎的开源命令行下载器,名为youtube-dl
,可以做到这一点。它从给定的YouTube链接或任何其他流行的网络视频网站(如Vimeo,Yahoo!)中获取实际的视频和音频文件链接。视频,uStream等
要了解操作方法,请查看YouTube提取器。在这里显示太多了。存在其他提取器用于更简单的站点。Steven Penny也为YouTube 提供了一个简单的JavaScript下载器,它更加简单。
但基本上,对于Flash视频播放器,必须通过一些JavaScript对其进行初始化和配置。简而言之,Flash对象的播放器将接收要加载的视频流的URL。
为了找到视频流,您必须解析视频页面的HTML和JS代码以找到相关的初始化代码,然后从那里尝试找到指向实际MP4文件的链接。它可能以纯文本格式存在,但也可以使用某些特定的下载令牌即时生成。通常,JavaScript会变得晦涩难懂,因此很难对其进行重新设计。或者,视频信息可能包含在JS异步加载的XML文件中。
对于HTML5渐进式下载视频,通常会source
在video
标记的子代中直接提及实际的源文件,因此,如果要在页面上搜索mp4
或类似内容。例如,在德国新闻节目Tagesschau 100上,您会找到:
<source src="http://media.tagesschau.de/video/2014/0626/TV-20140626-1649-5801.webl.h264.mp4" type="video/mp4">
对于MPEG DASH或Apple的HTTP Live Streaming(HLS)等更高级的播放技术,您必须解析元信息文件以获取实际的视频流。该元文件(.mpd
例如,在DASH中以及.m3u8
用于HLS的文件)将包含指向视频和音频片段的链接,您稍后必须将其组合以获取可播放的文件。
没有通用的解决方案。它需要仔细检查和调试目标站点。
这就是我用JavaScript做到的方式
从ytplayer.config.args
对象开始。其中包含视频的所有URL。它被分解成
url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts // DASH: contains video or audio stream
每个都是逗号分隔的数组,我称之为“流对象”。每个“流对象”将包含这样的值
url // direct HTTP link to a video
itag // code specifying the quality
s // signature, security measure to counter downloading
每个网址 都会被编码,因此您需要对其进行解码。现在是棘手的部分。
YouTube的视频至少具有3个安全级别
unsecured // as expected, you can download these with just the unencoded URL
s // see below
RTMPE // uses "rtmpe://" protocol, no known method for these
RTMPE视频通常用于官方全长电影,并受SWF验证类型2的保护。此方法自2011年以来一直存在 ,并且尚未进行反向工程。
类型为“ s”的视频是实际上可以下载的最困难的视频。您通常会在VEVO视频等中看到这些内容。他们以诸如
AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5
然后使用这样的函数对签名进行加扰
function mo(a) {
a = a.split("");
a = lo.rw(a, 1);
a = lo.rw(a, 32);
a = lo.IC(a, 1);
a = lo.wS(a, 77);
a = lo.IC(a, 3);
a = lo.wS(a, 77);
a = lo.IC(a, 3);
a = lo.wS(a, 44);
return a.join("")
}
此功能是动态的,通常每天都会更改。为了使该功能更加困难,该函数托管在URL中,例如
http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js
这引入了同源政策的问题
。本质上,您不能从以下位置下载此文件,www.youtube.com
因为它们是不同的域。解决此问题的方法是
CORS。使用CORS,
s.ytimg.com
可以添加此标头
Access-Control-Allow-Origin: http://www.youtube.com
并允许JavaScript从下载www.youtube.com
。当然他们不这样做。此解决方法的一种解决方法是使用CORS代理。这是一个代理,它使用以下标头响应所有请求
Access-Control-Allow-Origin: *
因此,既然您已经代理了JS文件,并使用该函数对签名进行加扰,则可以在查询字符串中使用该签名来下载视频。
s
视频RTMPE
类型和视频类型的例子吗?
我的回答:从2019年1月22日开始,如果您尝试绕过而不链接用户信息的话,使用这些方法也可能会被捕获。
为什么?由于我是该平台的新用户,因此我无法评论@ Daniel-B指定的规则。根据YouTube低于$ 6.1 G $的新ToS(以德语显示,就像我在德国一样;请翻译):
您同意任何自动化系统(包括但不限于任何机器人,蜘蛛或离线阅读器)都可以在网站上使用该自动化系统,以便在YouTube指定的时间内对服务器的更多请求能够合理生成同一时间段内使用公开可用,未经修改的标准网络浏览器的人员;
现在,他们可以找出每个请求的持续时间,并可以跟踪您是否违反。在这种情况下,即使在不将用户详细信息链接到任何服务的情况下使用VPN保护自己的情况下,现在也将可能知道您的外部IP地址。