一,利用網站瀏覽器F12鍵,利用谷歌瀏覽器插件找到視頻的.m3u8文件,並打開。
二,打開m3u8文件后,里面有很多.ts的鏈接,和key的鏈接。
三,保存為html文件,下載ts文件,代碼如下:可加多線程,可能需要用代理。
1 # 爬蟲 123.html就是打開m3u8文件右鍵保存為html格式。 2 htmlf=open('./123.html','r',encoding="utf-8") 3 htmlcont=htmlf.read() 4 # print(htmlcont) 5 import requests 6 from lxml import etree 7 tree = etree.HTML(htmlcont) 8 href = tree.xpath("//a//@href") 9 # print(href) 10 ts = href[2273:] 11 print(len(ts)) 12 # print(ts) 13 for i in ts: 14 a = i.split("/")[-1] 15 # print(a) 16 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"} 17 try: 18 rest = requests.get(i,headers=headers) 19 if rest.status_code == 200: 20 with open(a,"wb") as fp: 21 fp.write(rest.content) 22 fp.close() 23 except Exception as e: 24 print(e)
四,方法參考1:
參考鏈接:https://gist.github.com/larvata/95df619df7109d8b74d2b965a3266354#ffmpeg-cheatsheet
首先 先下載 key 和 m3u8
然后修改 m3u8 中 key 的路徑
最后 用 ffmpeg 下載
ffmpeg -i <source.m3u8> -c copy <target.ts>
四,方法參考2:
關於m3u8文件, ts文件解密, hls 解密. 一些記錄
openssl aes-128-cbc -d -in 原.ts -out 解密后.ts -nosalt -iv 偏移量 -K key16進制
其中 iv 偏移量和 key 一般都會在 m3u8
中。 key要按地址下載下來, iv偏移量是可選的,如果m3u8里沒有iv,iv可以隨便設置為0。還可以直接使用 ffmpeg 直接合並文件。
五,對於加密的m3u8文件:
m3u8視頻另一種下載方式
如上圖中用ts鏈接直接下載下來的ts視頻文件是加密的(為什么要下加密的?雖然加密但是下載速度快啊)。
#EXT-X-KEY 字段已經寫明了加密方式是AES-128,key通過URI獲取,IV也有。
那怎么解密呢?
1.復制URI地址到網頁,你將秒速自動下載得到一個16字節文件
2.打開終端,打開該文件查看16進制:
六,獲取key值:
下載m3u8里的key文件,下載winhex.exe應用程序,安裝之后,把key文件拖入winhex里,自動生成16進制。
七,合成下載好的.ts文件:
左下角點擊運行:cmd
copy /b 文件所在盤:\子文件\*.ts 儲存的文件夾:\子文件\new.ts
把上邊的漢字換成盤符和文件所在的文件夾。
注意:合並ts文件時,如果ts文件超過1000,排序就會有問題,會出現,121,1210,1211.。。。。。122,1220,1221,1222.。。。。。
這里分為幾個部分,按批次合並。
八,合成一個ts文件之后還不能打開,因為ts是加密的。
這里,沒有iv值,用0代替。這樣解密之后的ts文件即可播放。
九,注:ts文件的順序必須是有序的,不可缺少的。
參考網址:簡書:https://www.jianshu.com/p/1b0adcc7b426
所有的ts轉MP4,新建文本文檔,ren *.mp4 *.ts,修改后綴.bat,運行即可。
key值文件下載如下圖:(需轉16進制數)
十,關於報錯
hex string is too short, padding with zero bytes to length
bad decrypt
25916:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:crypto\evp\evp_enc.c:559:
解決方法:
# 遍歷文件夾進行解密(執行cmd命令,一定查看當前路徑問題) import os for root, dirs, files in os.walk("E://BaiduNetdiskDownload//123//1",topdown=False): print(len(files)) os.system("cd 1") os.system("cd") for f in files: print(f) # os.system("openssl aes-128-cbc -d -in 7udG3475000.ts -out ./11/7udG3475000.ts -iv 00000000000000000000000000000000 -K 65323739393530323866636362626661"%(f,f)) os.system("openssl aes-128-cbc -d -in ./1/%s -out ./1/11/%s -iv 00000000000000000000000000000000 -K 65323739393530323866636362626661"%(f,f))
先解密,再合並為一個文件。先把一個個小的ts文件解密,之后再進行合並為大的ts,最后再改格式為MP4,這種比較好,視頻播放不會出現卡頓,如果是先合並再解密,斷點播放會出現卡頓現象。
文件夾如圖:
1234文件夾里每個ts都經過解密,然后合並為111222333444四個文件。在進行合並改格式即可。
報錯問題函待解決:
用 openssl 進行解密,知道是 AES-128-CBC 解密,有 key 文件( 16 字節),用 hexdump 查看密鑰發現是 32 字節的,用命令 openssl aes-128-cbc -d -in in_file.ts -out out_file.ts -nosalt -iv 00000000000000000000000000000001 -K XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 進行解密,解密到最后提示 error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:528: 查閱過資料出現 EVP_DecryptFinal_ex 函數錯誤這提示有可能是還有沒解密完的數據塊,一般情況是密文不正確、不是塊大小的整數倍才會出現沒解密完的數據塊,但是我嘗試下載解密其他碼率的 m3u8 文件(如 500K,1000K,2000K )用的都是同個密鑰,都能成功解密,唯獨這個 3000K 的解密出現問題,之后以為是文件下載不完全,后來又下載下載了一直想不通哪里出問題,是因為視頻容量太大導致嗎?還是我解密的方法有問題。