中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python3.6如何根據m3u8下載mp4視頻

發布時間:2021-08-13 09:38:58 來源:億速云 閱讀:167 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“python3.6如何根據m3u8下載mp4視頻”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“python3.6如何根據m3u8下載mp4視頻”這篇文章吧。

注:以下使用的m3u8文件所在的網站是自己搭建用來測試的,鏈接可能會失效。

首先在chrome的network里找到一個m3u8文件的請求,可以通過它下載視頻。

python3.6如何根據m3u8下載mp4視頻

通過Preview可以看到m3u8文件的內容。

python3.6如何根據m3u8下載mp4視頻

這里m3u8文件比較重要的內容有兩個。

一個是URI后面的鏈接,這個是加密和解密的秘鑰,如果m3u8文件里有這個URI,那么這個視頻就是經過了加密的,加密的方法可以看URI前面,這里是AES-128加密算法。

另一個是以ts結尾鏈接,這個是視頻片段,如果是沒進行加密的,可以直接打開這個鏈接下載視頻片段,下載下來的是后綴為ts的文件,一般可以直接播放,不過時間很短。如果是加密過的,下載后播放會提示視頻文件已損壞。

知道這些后,就可以進行下載了,先獲取m3u8文件的內容,然后解析出秘鑰(key)和ts的鏈接,然后下載key對每一個ts進行解密,保存到一個mp4文件里。

下載用的是requests模塊,解析key和ts的鏈接是用的re模塊,解密用的是Crypto模塊。

使用Crypto需要注意三個地方,一個是安裝和導入,第二個是Crypto里AES.new的參數,第三個是decrypt方法的參數。下面先看代碼。

導入模塊:

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"


# 請求頭,不一定需要,看網站更改
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文件內容,并解析出key和ts文件的url。

# 獲取m3u8文件內容
r = requests.get(url)

# 通過正值表達式獲取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有三個參數,
 # 第一個是秘鑰(key)的二進制數據,
 # 第二個使用下面這個就好
 # 第三個IV在m3u8文件里URI后面會給出,如果沒有,可以嘗試把秘鑰(key)賦值給IV
 sprytor = AES.new(key, AES.MODE_CBC, IV=key)

 # 獲取ts文件二進制數據
 ts = requests.get(ts_url).content

 # 密文長度不為16的倍數,則添加二進制"0"直到長度為16的倍數
 while len(ts) % 16 != 0:
 ts += b"0"
 
 # 寫入mp4文件
 with open(name, "ab") as file:
  # decrypt方法的參數需要為16的倍數,如果不是,需要在后面補二進制"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"


# 請求頭,不一定需要,看網站更改
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文件內容
r = requests.get(url)

# 通過正值表達式獲取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的二進制數據
print("正在下載key")
key = requests.get(key_url).content

# 解密并保存ts
for ts_url in ts_urls:

 ts_name = ts_url.split("/")[-1]  # ts文件名

 # 解密,new有三個參數,
 # 第一個是秘鑰(key)的二進制數據,
 # 第二個使用下面這個就好
 # 第三個IV在m3u8文件里URI后面會給出,如果沒有,可以嘗試把秘鑰(key)賦值給IV
 sprytor = AES.new(key, AES.MODE_CBC, IV=key)

 # 獲取ts文件二進制數據
 print("正在下載:" + ts_name)
 ts = requests.get(ts_url).content

 # 密文長度不為16的倍數,則添加b"0"直到長度為16的倍數
 while len(ts) % 16 != 0:
  ts += b"0"

 print("正在解密:" + ts_name)

 # 寫入mp4文件
 with open(name, "ab") as file:
  # # decrypt方法的參數需要為16的倍數,如果不是,需要在后面補二進制"0"
  file.write(sprytor.decrypt(ts))
  print("保存成功:" + ts_name)
print(name, "下載完成")

以上是“python3.6如何根據m3u8下載mp4視頻”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

茂名市| 宝丰县| 绥德县| 深泽县| 黑河市| 衡水市| 云南省| 桐庐县| 来宾市| 鄂托克前旗| 九寨沟县| 岚皋县| 建始县| 社会| 榆树市| 厦门市| 眉山市| 西贡区| 达拉特旗| 黎川县| 金乡县| 洛川县| 黔西| 浦东新区| 邵武市| 涟水县| 出国| 贵南县| 九龙坡区| 栾川县| 丰台区| 潼关县| 兴义市| 凌源市| 工布江达县| 仲巴县| 弋阳县| 双柏县| 勃利县| 龙州县| 聂荣县|