赞
踩
有时候看电影想珍藏下来,但是有ts文件下载下来播放不了,那么恭喜你遇到视频加密了
很多网站直接返回一个个ts文件,通过ajax请求挨个返回。有些ts文件是有规律可循的,有些是没有规律可循的,不过一般没有规律的ts文件名,都是在一个叫m3u8这个文件里面的。
比如这样:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:0
//这里是注释,真实文件里不会有的,
//看看你的m3u8文件里有没有这一行,如果有的话,那么恭喜你这个m3u8文件是加密的,请继续往下看
//如果没有这行的话,特别是没有这个#EXT-X-KEY,那么同样恭喜你,这个m3u8没有加密,你直接就可以下载合并
#EXT-X-KEY:METHOD=AES-128,URI="http://www.example.com/20210125/key.key"
#EXTINF:12.5,
//下面的这个其实才是视频真正的地址,你放在浏览器地址栏上直接回车是可以直接下载的
//这里还可能出现GBDYO3576000.ts这种情况,其实是把前面的路径省略了,可根据m3u8文件的路径自行加上
http://www.example.com/20180125/GBDYO3576000.ts
#EXTINF:12.5,
http://www.example.com/20180125/GBDYO3576001.ts
#EXTINF:12.5,
http://www.example.com/20180125/GBDYO3576002.ts
通过上面的文件内容第五行的红色字体,我们可以看到加密方式是AES-128,而key就是解密钥匙,在里面我们也可以看到该url,如果在里面只有EXT-X-KEY:METHOD=AES-128 ,而即使没有URI,我们也可以在相应中看到一个叫key.key的文件。
# 获取key ,二进制流格式
key=requests.get('http://www.example.com/20210125/key.key').content
好了,我们已经拿到了key值,接下来就是解密逻辑,也很简单:
# iv是一个二进制字符串,没有明确说明就按照这个写即可,注意位数
iv=b'0000000000000000'
# 获取aes对象,key已获取
cipher = AES.new(key, AES.MODE_CBC, iv)
# 进行解密,res1就是媒体流(二进制)字符串
plain_data = cipher.decrypt(res1)
然后接下来我们就开始下载,合并文件即可。
# AES解密
import requests
from Cryptodome.Cipher import AES
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.53'
}
# 获取key ,二进制流格式,key的地址具体网站自己看
key=requests.get('http://www.example.com/20210125/key.key').content
# res就是我获取的ts的url组成的列表,直接请求文件地址,使用正则匹配或者其他方式获取都可以
for i in res:
try:
res1 = requests.get(i,timeout=5).content
iv=b'0000000000000000'
# 获取aes对象
cipher = AES.new(key, AES.MODE_CBC, iv)
# 进行解密
plain_data = cipher.decrypt(res1)
with open('合并.ts','ab+') as w:
w.write(plain_data) # 写入解密后的内容
except:
pass
上述代码还是有问题的,一个是太慢,另一个是采用追加的方式写入二进制流数据,容易内存溢出。因为不是工作需要,所以就不完善了,仅用来记录AES加密和视频媒体流的数据获取,欢迎大家指导,改进!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。