十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要為大家展示了“python3.6如何根據(jù)m3u8下載mp4視頻”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“python3.6如何根據(jù)m3u8下載mp4視頻”這篇文章吧。
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),市中網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:市中等地區(qū)。市中做網(wǎng)站價(jià)格咨詢:028-86922220注:以下使用的m3u8文件所在的網(wǎng)站是自己搭建用來(lái)測(cè)試的,鏈接可能會(huì)失效。
首先在chrome的network里找到一個(gè)m3u8文件的請(qǐng)求,可以通過(guò)它下載視頻。
通過(guò)Preview可以看到m3u8文件的內(nèi)容。
這里m3u8文件比較重要的內(nèi)容有兩個(gè)。
一個(gè)是URI后面的鏈接,這個(gè)是加密和解密的秘鑰,如果m3u8文件里有這個(gè)URI,那么這個(gè)視頻就是經(jīng)過(guò)了加密的,加密的方法可以看URI前面,這里是AES-128加密算法。
另一個(gè)是以ts結(jié)尾鏈接,這個(gè)是視頻片段,如果是沒(méi)進(jìn)行加密的,可以直接打開這個(gè)鏈接下載視頻片段,下載下來(lái)的是后綴為ts的文件,一般可以直接播放,不過(guò)時(shí)間很短。如果是加密過(guò)的,下載后播放會(huì)提示視頻文件已損壞。
知道這些后,就可以進(jìn)行下載了,先獲取m3u8文件的內(nèi)容,然后解析出秘鑰(key)和ts的鏈接,然后下載key對(duì)每一個(gè)ts進(jìn)行解密,保存到一個(gè)mp4文件里。
下載用的是requests模塊,解析key和ts的鏈接是用的re模塊,解密用的是Crypto模塊。
使用Crypto需要注意三個(gè)地方,一個(gè)是安裝和導(dǎo)入,第二個(gè)是Crypto里AES.new的參數(shù),第三個(gè)是decrypt方法的參數(shù)。下面先看代碼。
導(dǎo)入模塊:
import re import requests from Crypto.Cipher import AES
初始設(shè)置:
# 保存的mp4文件名 name = "dream_it_possible.mp4" # m3u8文件的url url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8" # 請(qǐng)求頭,不一定需要,看網(wǎng)站更改 headers = { "Referer": "http://www.jiuyi.info/video/dream_it_possible", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", }
獲取m3u8文件內(nèi)容,并解析出key和ts文件的url。
# 獲取m3u8文件內(nèi)容 r = requests.get(url) # 通過(guò)正值表達(dá)式獲取key和ts的url k = re.compile(r"http://.*?\.key") # key的正則匹配 t = re.compile(r"http://.*?\.ts") # ts的正則匹配 key_url = k.findall(r.text)[0] # key的url ts_urls = t.findall(r.text) # ts的url列表
下載并解密ts文件,保存為mp4文件。
# 下載key key = requests.get(key_url).content # 解密并保存ts for ts_url in ts_urls: ts_name = ts_url.split("/")[-1] # ts文件名 # 解密,new有三個(gè)參數(shù), # 第一個(gè)是秘鑰(key)的二進(jìn)制數(shù)據(jù), # 第二個(gè)使用下面這個(gè)就好 # 第三個(gè)IV在m3u8文件里URI后面會(huì)給出,如果沒(méi)有,可以嘗試把秘鑰(key)賦值給IV sprytor = AES.new(key, AES.MODE_CBC, IV=key) # 獲取ts文件二進(jìn)制數(shù)據(jù) ts = requests.get(ts_url).content # 密文長(zhǎng)度不為16的倍數(shù),則添加二進(jìn)制"0"直到長(zhǎng)度為16的倍數(shù) while len(ts) % 16 != 0: ts += b"0" # 寫入mp4文件 with open(name, "ab") as file: # decrypt方法的參數(shù)需要為16的倍數(shù),如果不是,需要在后面補(bǔ)二進(jìn)制"0" file.write(sprytor.decrypt(ts)) print(name, "下載完成")
到這里就下載完成了。
完整代碼:
import re import requests from Crypto.Cipher import AES # 保存的mp4文件名 name = "dream_it_possible.mp4" # m3u8文件的url url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8" # 請(qǐng)求頭,不一定需要,看網(wǎng)站更改 headers = { "Referer": "http://www.jiuyi.info/video/dream_it_possible", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", } print("正在解析:" + url.split("/")[-1]) # 獲取m3u8文件內(nèi)容 r = requests.get(url) # 通過(guò)正值表達(dá)式獲取key和ts的鏈接 k = re.compile(r"http://.*?\.key") # key的正則匹配 t = re.compile(r"http://.*?\.ts") # ts的正則匹配 key_url = k.findall(r.text)[0] # key的url ts_urls = t.findall(r.text) # ts的url列表 # 下載key的二進(jìn)制數(shù)據(jù) print("正在下載key") key = requests.get(key_url).content # 解密并保存ts for ts_url in ts_urls: ts_name = ts_url.split("/")[-1] # ts文件名 # 解密,new有三個(gè)參數(shù), # 第一個(gè)是秘鑰(key)的二進(jìn)制數(shù)據(jù), # 第二個(gè)使用下面這個(gè)就好 # 第三個(gè)IV在m3u8文件里URI后面會(huì)給出,如果沒(méi)有,可以嘗試把秘鑰(key)賦值給IV sprytor = AES.new(key, AES.MODE_CBC, IV=key) # 獲取ts文件二進(jìn)制數(shù)據(jù) print("正在下載:" + ts_name) ts = requests.get(ts_url).content # 密文長(zhǎng)度不為16的倍數(shù),則添加b"0"直到長(zhǎng)度為16的倍數(shù) while len(ts) % 16 != 0: ts += b"0" print("正在解密:" + ts_name) # 寫入mp4文件 with open(name, "ab") as file: # # decrypt方法的參數(shù)需要為16的倍數(shù),如果不是,需要在后面補(bǔ)二進(jìn)制"0" file.write(sprytor.decrypt(ts)) print("保存成功:" + ts_name) print(name, "下載完成")
以上是“python3.6如何根據(jù)m3u8下載mp4視頻”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!