有時候看電影想珍藏下來柒昏,但是有ts文件下載下來播放不了嫂侍,那么恭喜你遇到視頻加密了
很多網(wǎng)站直接返回一個個ts文件,通過ajax請求挨個返回委造。有些ts文件是有規(guī)律可循的,有些是沒有規(guī)律可循的搏屑,不過一般沒有規(guī)律的ts文件名争涌,都是在一個叫m3u8這個文件里面的。
比如這樣:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:0
//這里是注釋辣恋,真實文件里不會有的亮垫,
//看看你的m3u8文件里有沒有這一行,如果有的話伟骨,那么恭喜你這個m3u8文件是加密的饮潦,請繼續(xù)往下看
//如果沒有這行的話,特別是沒有這個#EXT-X-KEY携狭,那么同樣恭喜你继蜡,這個m3u8沒有加密,你直接就可以下載合并
#EXT-X-KEY:METHOD=AES-128,URI="http://www.example.com/20210125/key.key"
#EXTINF:12.5,
//下面的這個其實才是視頻真正的地址,你放在瀏覽器地址欄上直接回車是可以直接下載的
//這里還可能出現(xiàn)GBDYO3576000.ts這種情況稀并,其實是把前面的路徑省略了仅颇,可根據(jù)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
通過上面的文件內(nèi)容第五行的紅色字體,我們可以看到加密方式是AES-128碘举,而key就是解密鑰匙,在里面我們也可以看到該url忘瓦,如果在里面只有EXT-X-KEY:METHOD=AES-128 ,而即使沒有URI引颈,我們也可以在相應(yīng)中看到一個叫key.key的文件耕皮。
# 獲取key ,二進制流格式
key=requests.get('http://www.example.com/20210125/key.key').content
好了蝙场,我們已經(jīng)拿到了key值凌停,接下來就是解密邏輯,也很簡單:
# iv是一個二進制字符串售滤,沒有明確說明就按照這個寫即可罚拟,注意位數(shù)
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的地址具體網(wǎng)站自己看
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) # 寫入解密后的內(nèi)容
except:
pass