今天有位群友想下载某网课的视频,我告诉他用Chrome浏览器的猫抓插件即可。
结果他说试了不行,于是我开始了研究。
首先我测试使用猫抓,可以抓到m3u8以及视频的切片ts文件:
(一些专业名词我就不解释了,想了解的自行搜索资料)
下载了一个ts文件,发现是无法播放的:
用十六进制打开ts文件,发现是乱的,没有ts流文件的格式。
ts标准流文件格式如图:
猜想是ts文件被加密了。
于是打开m3u8文件看看,这里可以看到是用了AES-128加密。
我查了下资料,得知用ffmpeg的命令即可下载,解密和合并。
为了大家操作方便,我找到一个带界面的M3U8下载器,这个下载器原理就是调用的ffmpeg,我们试试看:
提示key下载失败,于是我手动试了试key文件确实是无法访问的。
我们在浏览器F12抓取看看:
https://hls.xxx.net/playsafe/9b52ce99c4/a/9b52ce99c43541a16a9d55f089b3321a_2.key?token=0599667a-60c5-4983-afcd-d5864e1241a6-v2156928
是可以抓到一个key文件的,这个key文件后面带了token参数,经过测试带上这个参数就可以访问了,且这个token是有时效性的。
我们把这个带参数的key的地址替换掉m3u8里原来的,再用M3U8下载器试试:
这次提示的是KEY无效了:
我们看看这个key文件的内容:
长度有32个字节,内容是乱码,猜想是js中对这个key文件做了处理。
我们来看看网页播放器的js中是怎么处理这个key文件的:
搜索.key,可以找到以下代码:
这个代码太复杂就不细看了,我们直接下断点找他解密后的数据即可。
在调试界面选择视频播放的这个窗口的线程,点击F8暂停。
展开t.data.decryptdata即可看到解密后的key了:
这里是十进制的数组[95, 203, 167, 94, 66, 45, 127, 1, 174, 33, 43, 114, 219, 43, 105, 153]
转换为十六进制文件:
再把这个key文件放到本地服务器,然后修改m3u8的URI为本地的key文件的地址:
保存,然后用M3U8下载器即可成功下载:
下载完成:
看看效果:
视频是可以正常播放的,到此就算解密成功了。
最后总结下:
对于这个网站,在想要下载视频播放界面按F12打开开发者工具,切换到Sources选项卡,选择网课视频播放的线程:
再按F8暂停:
Scope中展开t.data.decryptdata,这里的baseuri就是m3u8的地址。
把m3u8下载下来,然后把key保存为十六进制文件,替换掉m3u8里的uri即可使用下载器下载。
M3U8下载器在公众号内回复M3U8获取。