当前位置:   article > 正文

python 爬取加密视频,爬虫:解决视频遇到m3u8加密

666.0.click.episode

有时候看电影想珍藏下来,但是有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加密和视频媒体流的数据获取,欢迎大家指导,改进!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号