爬取某利威加密ts视频流

最近看到一个系列视频,感觉蛮好准备下载下来,通过开发者工具发现,该视频用的第三方的服务,基于ts流,且加密的,下面简单记录下大概的解密流程。

找到对应的m3u8文件,内容大概如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-KEY:METHOD=AES-128,URI="xxx/d1977c4d68/a/d1977c4d687280d70e14b650c5e4067a_3.key",IV=0xa3f178af1c3dfe77812baf7057c0f0eb
#EXT-X-TARGETDURATION:19
#EXTINF:5.040000,
xxx/d1977c4d68/14/1565171907000/a/e4/06/7a_3/d1977c4d687280d70e14b650c5e4067a_3_0.ts?pid=1696823152736X1sdfsfs861508&device=desktop
#EXTINF:5.000000,
xxx/d1977c4d68/14/1565171907000/a/e4/06/7a_3/d1977c4d687280d70e14b650c5e4067a_3_1.ts?pid=1696823152736X1sdfsfs861508&device=desktop
#EXTINF:10.000000,
xxx/d1977c4d68/14/1565171907000/a/e4/06/7a_3/d1977c4d687280d70e14b650c5e4067a_3_2.ts?pid=1696823152736X1sdfsfs861508&device=desktop
#EXTINF:10.000000,

如果该视频是未加密的,直接请求下面一系列的ts文件是可以直接播放的,组合在一起即可,但是上面的ts文件明显是加密的,下载下来也无法播放。

所以要解密该视频就要找到解密的key,另外文件中还用到了偏移量iv(注意,如果没用到偏移量直接补32个0即可)。

有的同学说了,key文件不是给出了嘛,直接下载下来就行了,然而这个key文件访问也是要经过认证的,既然是该网站调用了这个服务,肯定有对应服务的认证秘钥,通过对其他请求分析,我找到了这个认证token,所以下载这个key文件我们只需要拼接上token即可

xxx/d1977c4d68/a/d1977c4d687280d70e14b650c5e4067a_3.key?token=*******

获取key以后我们就能解密ts文件了。

使用openssl解密视频

该方式就是为了让你清晰的看到解密过程,单个解密ts文件,然后视频拼在一起即可

1
$ openssl aes-128-cbc -d -in d1977c4d687280d70e14b650c5e4067a_3_0.ts -out aaa.ts -iv 0xa3f178af1c3dfe77812baf7057c0f0eb -K 1AC0C3F85BB5F5DD8F239E53EDA54DDD

命令如上,我这里依次解释下,m3u8文件里我们看到加密方式是AES-128,

-in为输入文件,即要解密的ts文件

-out为输出文件,解密后的ts文件

-iv为偏移量,文件内包含,没有则32个0

-K就是我们下载的.key文件内容(可食用HxD打开)

image-20231009154621580

将结果中对应的选中内容中间空格去掉即为key

执行完上述命令即可看到解密后的aaa.ts文件,直接用播放器就打开了,所以其他ts文件也依次这样解密就行了。

如果你觉得繁琐可以采用ffmpeg帮我们批量解密及组合视频

使用ffmpeg解密视频

这个软件不用我们多说了,没听过自己百度去,功能很强大哦,没必要全看,找自己用的部分就可以了。

先上命令:

1
ffmpeg -protocol_whitelist "file,http,https,tcp,tls,crypto" -i d1977c4d680e79ccf674190031b4d09d_3.m3u8 -c copy xxx.mp4

-protocol_whitelist这些必须的,照着抄就行

-i 输入的m3u8文件

xxx.MP4为输出的解密且拼接好的视频,这样是不是特别简单了

如果你直接执行这个命令那就等着看到一堆报错吧,原因是.m3u8文件里虽然有key的地址了,但是拿不到key啊,key是要token来获取的

所以你得把之前获取的的token拼接到key后面,类似如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-KEY:METHOD=AES-128,URI="xxx/d1977c4d68/a/d1977c4d687280d70e14b650c5e4067a_3.key?token=***",IV=0xa3f178af1c3dfe77812baf7057c0f0eb
#EXT-X-TARGETDURATION:19
#EXTINF:5.040000,
xxx/d1977c4d68/14/1565171907000/a/e4/06/7a_3/d1977c4d687280d70e14b650c5e4067a_3_0.ts?pid=1696823152736X1sdfsfs861508&device=desktop
#EXTINF:5.000000,
xxx/d1977c4d68/14/1565171907000/a/e4/06/7a_3/d1977c4d687280d70e14b650c5e4067a_3_1.ts?pid=1696823152736X1sdfsfs861508&device=desktop
#EXTINF:10.000000,
xxx/d1977c4d68/14/1565171907000/a/e4/06/7a_3/d1977c4d687280d70e14b650c5e4067a_3_2.ts?pid=1696823152736X1sdfsfs861508&device=desktop
#EXTINF:10.000000,

再次执行命令,看视频是不是解密且组合成功了

总结:有的同学又说了,我这个系列这么多视频呢,一个一个获取token再下载视频也好麻烦,我想说你都看到这儿了,我能认为你肯定是一个程序员吗,随便用你擅长的开发语言搞个循环调用这个ffmpeg不就行了,嫌慢管你用进程线程还是协程的,达到自己要求就好了