所有这些“从YouTube保存视频”服务如何工作?


62

我的意思是,它们通常如何工作?他们如何接收到视频流本身的链接(不仅仅是包含Flash播放器的页面)?

我在网络上进行了搜索,但找不到任何有用的信息(所有链接都指向此类服务,但没有一个告诉它们是如何实现的)。

Answers:


51

有一个非常受欢迎的开源命令行下载器,名为youtube-dl,可以做到这一点。它从给定的YouTube链接或任何其他流行的网络视频网站(如Vimeo,Yahoo!)中获取实际的视频和音频文件链接。视频,uStream等

要了解操作方法,请查看YouTube提取器。在这里显示太多了。存在其他提取器用于更简单的站点。Steven Penny也为YouTube 提供了一个简单的JavaScript下载器,它更加简单。

但基本上,对于Flash视频播放器,必须通过一些JavaScript对其进行初始化和配置。简而言之,Flash对象的播放器将接收要加载的视频流的URL。

为了找到视频流,您必须解析视频页面的HTML和JS代码以找到相关的初始化代码,然后从那里尝试找到指向实际MP4文件的链接。它可能以纯文本格式存在,但也可以使用某些特定的下载令牌即时生成。通常,JavaScript会变得晦涩难懂,因此很难对其进行重新设计。或者,视频信息可能包含在JS异步加载的XML文件中。

对于HTML5渐进式下载视频,通常会sourcevideo标记的子代中直接提及实际的源文件,因此,如果要在页面上搜索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的文件)将包含指向视频和音频片段的链接,您稍后必须将其组合以获取可播放的文件。

没有通用的解决方案。它需要仔细检查和调试目标站点。


3
一个问题,Youtube / Google对此有何政策?他们对此表示满意吗?
JMK 2014年

31
§5.1.L中的YouTube 服务条款禁止通过流媒体以外的任何其他方式使用其内容,因此从理论上讲,这是不允许的。实际上,他们将无法执行该操作。任何下载者都可以或多或少地模拟它只是流式传输。
slhck

2
@StevenPenny您是否有任何非缩小版?
TankorSmash 2014年

5
@slhck Flash也可以自己发出HTTP请求。而是使用浏览器的HTTP引擎。如果Flash本身发出了请求,则它们将不会在浏览器中“看到”。当然对广告客户来说会很棒。;)
Daniel B

3
@slhck他们不能强制执行程序,但如果他们得到了他们的律师团队进行,他们可以强制执行其合法
Cruncher 2014年

35

YouTube书签

这就是我用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文件,并使用该函数对签名进行加扰,则可以在查询字符串中使用该签名来下载视频。


1
您是否偶然知道(用于DASH播放)YouTube播放器如何确定要从媒体表示形式请求的字节范围?MPD文件仅列出段。
slhck 2014年

2
不完全是。有一个单独的视频和音频文件,但YouTube按字节范围(分为几个块)请求它们。如果切换到其他质量,它也会更改字节范围。只是想知道玩家如何知道哪一秒对应于哪个字节偏移。
slhck 2014年

1
您能举一个s视频RTMPE类型和视频类型的例子吗?
克洛伊,2016年

@SurajJain这是新页面-我将重写此答案,因为我现在使用其他方法github.com/svnpenn/umber/blob/master/bmklet/youtube/download.js
Steven Penny

该链接给我一个404。您是否已删除该存储库?
darksoulsong

1

我的回答:从2019年1月22日开始,如果您尝试绕过而不链接用户信息的话,使用这些方法也可能会被捕获。

为什么?由于我是该平台的新用户,因此我无法评论@ Daniel-B指定的规则。根据YouTube低于$ 6.1 G $的新ToS(以德语显示,就像我在德国一样;请翻译):

您同意任何自动化系统(包括但不限于任何机器人,蜘蛛或离线阅读器)都可以在网站上使用该自动化系统,以便在YouTube指定的时间内对服务器的更多请求能够合理生成同一时间段内使用公开可用,未经修改的标准网络浏览器的人员;

现在,他们可以找出每个请求的持续时间,并可以跟踪您是否违反。在这种情况下,即使在不将用户详细信息链接到任何服务的情况下使用VPN保护自己的情况下,现在也将可能知道您的外部IP地址。


1
欢迎未来的旅行者...目前尚不清楚这如何回答作者的问题
-Ramhound

如果您想就特定答案警告作者,则应提交评论,并对可能由于法律问题而认为无用的所有答案进行否决。该答案的读物更像是您在论坛上发布的内容,而“超级用户”不是论坛
-Ramhound
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.