xx课堂m3u8加密视频下载
1、各大视频类网站的核心资产和竞争力莫过于视频本身了,所以很多网站想尽一切办法都要保护自己的视频内容不会被爬取和盗用;最常见的保护办法莫过于加密了:服务端把视频数据加密,再把密文发给客户端(这里一般都是浏览器或app),客户端再根据事先约定好的加密方案和密钥解密数据,得到明文,然后再播放!所以理论上讲:既然客户端能播放,说明客户端一定有明文,那么爬虫肯定也能解密得到明文!那么现在需要解决的两个问题:
- 加密算法是啥?
- 密钥是啥?
本文以xx课堂为例,详细展示破解加密算法后下载完整可播放视频的方法;
2、先登陆xx课堂,按F12键,选择network分页,然后随便打开一个视频观看,下面马上列举出了浏览器请求的所有接口,这里目测有上百个;要想破解加密视频,需要找到这么几个要素:
- 视频文件的链接,换句话说浏览器是在哪个接口下载视频文件的?
- 加密方法
- 密钥
xx课堂采用的m3u8格式编码视频文件,关于这种格式的详细介绍请见参考1,这里不在赘述;m3u8编码方案的一大特点:将一个大的媒体文件进行分片,将该分片文件资源路径记录于 m3u8 文件(即 playlist)内,其中附带一些额外描述(比如该资源的多带宽信息···)用于提供给客户端;客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。简单点理解:服务器会把一个大文件切分成N多个小文件,小文件的路径记录在playlist内。浏览器根据播放进度向服务器请求playlist的小文件,然后解密小文件得到明文;小文件的后缀名是.ts,所以可以根据这个先选几个ts文件看看,如下:
这个接口(本质上是服务端的一个文件)后缀是ts,是不是ts文件了?先不管这些了,复制这个链接到浏览器,成功下载了ts文件,然后尝试用windows自带的media player打开,结果报错如下:
直接说不支持该文件类型!根据经验判断,肯定被加密了,遂用010Editor打开一看,果然文件头信息已经被改地面目全非!(windwos下各种文件都有头信息,来标注这是哪种类型的文件。比如最常见的PE头,还有jpg等文件的头部都有标注。)这里没有任何文件头信息,播放器能识别才怪了!到这里已经明确了两点:
- 视频文件都在ts
- ts被加密了
现在又面临上面提到的那3个问题了:ts文件列表在哪? 哪中加密方式?密钥是啥?
3、(1)m3u8格式的一个特点:将一个大的媒体文件进行分片,将该分片文件资源路径记录于 m3u8 文件(即 playlist)内,其中附带一些额外描述(比如该资源的多带宽信息···)用于提供给客户端;所以现在要先找到playlist!既然是m3u8格式,那么先根据关键词搜一下,看看都有哪些接口。搜索结果如下,一共有3个接口有m3u8关键词;先看第一个接口:接口名里面居然后playlist_m3u8,这个是不是传说中的playlist了?
马上看看这个接口的返回,如下:返回了3种不同的分辨率(清晰度),每种清晰度后面紧跟着一个接口,也是m3u8;这个request URL(注意:这里是header里面的URL,不是response的URL)应该就是m3u8接口了,这个很重要,后续会根据这个接口下载视频数据;
其中一种清晰度的内容:
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=232176,RESOLUTION=474x270 voddrm.token.dWluPTE0NDExNTIxNDY1ODI5Nzc5ODt2b2RfdHlwZT0wO2NpZD0yMjc3MzI7dGVybV9pZD0xMDAyNjg3NTY7ZXh0PTkxNzliODBiZTNjYTIxMzA5OTQ4OGJmYTgzZTVlMjBhNzBkN2M1MDVkNTkzOTlhNWE4OTRlMmQ3YzQ5MGY2YTE5ZWQzMTQ3N2VjNjA0N2U4ZGYxYTdkZTU2NzBlOTJlYTVjMGZkMmFmZDRmMzUxNzEyOTVjMzIwZWVjNDk5NTM4YzM3YWE1MzMyZGQ5NzBhNg==.v.f30739.m3u8?exper=0&sign=382269b9e17d37f914942ef7b14894d9&t=60949ee4&us=1981982863631918869
(2)m3u8的playlist找到了,接着的问题是找到加密的方法和密钥了;继续看第二个接口的response,如下:
这里从字面看也很明显了:METHOD=AES-128:这是加密方法;接着是一大串的URI,这是啥了?暂时不知道,先复制URI到浏览器,下载下来再说,得到get_dk文件,从名字看,貌似是descypt_key、解密文件?
继续向后看,还能看到IV,这里就实锤了AES-CBC的加密方法了!这里吐槽一下:我也不知道xx课堂的开发人员是咋想的,所有ts的密钥设置成一样就算了,居然还把IV设置成0,这就有点匪夷所思了........
这里response的格式也容易理解:第一行是加密的方法、密钥(需要通过接口去服务器取,不是直接暴露的),第三行是ts文件的地址,也就是说:第三行这个ts文件解密的信息都放在第一行了!
#EXT-X-KEY:METHOD=AES-128,URI="https://xxxx/cgi-bin/xxxx/get_dk?edk=CiDDCouW%2B5LTc3PK5i4SUfJ%2B1tEX%2BJb2GENRUeTo21edBBCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890788170463121&keySource=VodBuildInKMS&token=dWluPTE0NDExNTIxNDY1ODI5Nzc5ODt2b2RfdHlwZT0wO2NpZD0yMjc3MzI7dGVybV9pZD0xMDAyNjg3NTY7ZXh0PTkxNzliODBiZTNjYTIxMzA5OTQ4OGJmYTgzZTVlMjBhNzBkN2M1MDVkNTkzOTlhNWE4OTRlMmQ3YzQ5MGY2YTE5ZWQzMTQ3N2VjNjA0N2U4ZGYxYTdkZTU2NzBlOTJlYTVjMGZkMmFmZDRmMzUxNzEyOTVjMzIwZWVjNDk5NTM4YzM3YWE1MzMyZGQ5NzBhNg%3D%3D",IV=0x00000000000000000000000000000000 #EXTINF:10.000000, v.f30741.ts?start=0&end=351007&type=mpegts&exper=0&sign=382269b9e17d37f914942ef7b14894d9&t=60949ee4&us=1981982863631918869
加密方法和IV都有了,密钥了?刚才下载了get_dk文件,用010Editor打开,发现了一串16byte的数字,而16byte=128bit,刚好是METHOD=AES-128,所以这个是密钥实锤了!
这里强调几句:从浏览器接口加载的顺序看,是先请求了这3个接口,再请求ts文件的。逻辑也很简单:通过请求m3u8接口,得到包含所有ts文件的playlist,和解密的方法、密钥,然后请求ts文件,再在客户端本地解密后播放!
(3)m3u8的接口找到,意味着所有ts文件的playlist找到了;加密方案和密钥都找到了,接下来开始解密!先把密钥复制成base64格式,010Editor的操作方法如下:Edit->Copy as->Copy as Base64;
然后用到下面的这个软件(下载地址见文章末尾的参考3):把m3u8链接(注意是那个request URL)、密钥的base64格式和IV输入,点击go即可;
下载进度:
完成后在download目录下能看到完整的mp4文件和接口信息:
mp4文件能用播放器正常播放!
这是所有原始的ts文件,都是解密后、可以正常播放的:
随便找个ts文件,用010Editor打开,这次能看到文件头信息了:是FFmpeg格式的,所以播放器能正常播放!
参考:
1、https://www.jianshu.com/p/e97f6555a070 m3u8文件格式详解
2、https://www.bilibili.com/video/BV1Lv411a7CP 快速爬取xx课堂
3、https://github.com/nilaoda/N_m3u8DL-CLI m3u8下载器