网址链接:aHR0cHM6Ly93d3cuY2Jwb3J0YWwub3JnL2N1cGZveHBsYXkvODUyNzctMS0xLw==
打开一个视频,打开开发者工具,刷新,搜索m3u8,找到这个含有所有ts连接的包
预览一下:
这与平常的m3u8有所不同,如果有下面的代码,说明ts返回的数据有加密
#EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x00000000000000000000000000000000
这是一个 HLS(HTTP Live Streaming)中的媒体加密标签,用于指定媒体流的加密方法和密钥信息。
在这个标签中:
METHOD=AES-128
:指定加密方法为 AES-128,表示使用 AES 算法进行加密。URI="enc.key"
:指定密钥文件的 URI,即密钥文件的路径或链接地址。在这个例子中,密钥文件的路径为 "enc.key"。IV=0x00000000000000000000000000000000
:指定初始化向量(Initialization Vector,IV)。IV 是在加密过程中用于增加安全性的参数。在这个例子中,IV 的值为全 0。
总体上,这个标签指定了使用 AES-128 加密方法,密钥文件的路径为 "enc.key",初始化向量为全 0。
而且加密是AES,告诉了密钥的链接,和向量。
对于这种的处理方法
1.访问密钥的链接,获取二进制密钥,可以直接搜索找到密钥链接
import requests
# 密钥链接
key_url = 'https://hd.ijycnd.com/play/zbqqp2Rb/enc.key'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
key = requests.get(url=key_url,headers=headers).content
2.制作解码器,传入密钥,加密方式,和IV
key = requests.get(url=key_url,headers=headers).content
from Crypto.Cipher import AES
# 将 IV 和密钥转换为字节串
IV = bytes.fromhex('00000000000000000000000000000000') # IV 字节串
ci = AES.new(key,AES.MODE_CBC,IV=IV)
一般填充方式都为CBC
3.访问m3u8链接,提取出所有ts的链接。
import requests
import re
m3u8_url = 'https://hd.ijycnd.com/play/zbqqp2Rb/index.m3u8'
response = requests.get(url=m3u8_url,headers=headers).text
ts_list = re.sub('#E.*','',response).split()
for ts in ts_list:print(ts)
4.开始保存
number = 0
for ts in ts_list:number += 1print(f'正在保存第{number}个ts文件')ts_content = requests.get(url=ts,headers=headers).contentcontent = ci.decrypt(ts_content)with open('视频.mp4',mode='ab') as f:f.write(content)
5.完整代码
import requests
from Crypto.Cipher import AES
import re
# 密钥链接
key_url = 'https://hd.ijycnd.com/play/zbqqp2Rb/enc.key'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}key = requests.get(url=key_url,headers=headers).content# 将 IV 和密钥转换为字节串
IV = bytes.fromhex('00000000000000000000000000000000') # IV 字节串
ci = AES.new(key,AES.MODE_CBC,IV=IV)
m3u8_url = 'https://hd.ijycnd.com/play/zbqqp2Rb/index.m3u8'
response = requests.get(url=m3u8_url,headers=headers).text
ts_list = re.sub('#E.*','',response).split()
number = 0
for ts in ts_list:number += 1print(f'正在保存第{number}个ts文件')ts_content = requests.get(url=ts,headers=headers).contentcontent = ci.decrypt(ts_content)with open('视频.mp4',mode='ab') as f:f.write(content)
结果展现: