免责公告:
仅仅交流学习,读者产生的行为后者自负、
知识星球:https://articles.zsxq.com/id_81zgktftbn60.html(新球,前20人进入者,加作者微信进行退款)
视频链接:
aHR0cHM6Ly9lZHUuY3Nkbi5uZXQvbGVhcm4vMzkzNTMvNjM5NTk4P3NwbT0zMDAxLjQxNDM=
一:
点开f12,点开视频,向下拉,点击网络(net)找到位置
发现视频是m3u8流式视频(ts文件),即视频是由多个ts组合而成的,我们在左侧搜索m3u8,发现有很多js文件,只有info里面的playUrl有所以视频(ts)的数据
我们只需要请求每个m3m8里面的视频,并把他拼到一起即可
至此第一步完成
二:
我们对playUrl进行请求,结果如下
发现他是AES加密,其中加密的密钥内容是url,iv是初始化向量
请求里面的url,用iv进行AES解密,在利用解密的东西请求ts,并拼接即可完成
代码
import re
from Crypto.Cipher import AES
import requests
headers = {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"origin": "https://edu.csdn.net",
"pragma": "no-cache",
"priority": "u=1, i",
"referer": "https://edu.csdn.net/learn/39353/638733?spm=1002.2001.3001.4157",
"sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"x-ca-key": "203866374",
"x-ca-nonce": "1d181c04-0fec-47b9-a5e2-006371e0f85e",
"x-ca-signature": "yYvN0QQSpcLcX7zjoo6zKB4ptNmKbAOl5zsh53inVpQ=",
"x-ca-signature-headers": "x-ca-key,x-ca-nonce"
}
url = "https://bizapi.csdn.net/edu-academy-web/v1/material/info"
params = {
"materialId": "638733",
"courseId": "39353",
"cId": "39353",
"playerVersion": "2",
"isFree": "2",
"isMember": "2"
}
response = requests.get(url, headers=headers, params=params)
data =response.json()
title = data["data"]["title"]
m3u8 = data["data"]["info"]['playUrl']
m3u8_res = requests.get(m3u8, headers=headers)
m3u8_text = m3u8_res.text
key_url = re.findall('URI="(.*?)"', m3u8_text)[0]
key = requests.get(key_url).content
iv = re.findall('IV=(.*)', m3u8_text)[0][2:]
IV = bytes.fromhex(iv)
ic = AES.new(key, AES.MODE_CBC, IV)
ts_list = re.findall(',\n(.*?)\n#', m3u8_text)
for ts in ts_list:
ts_url = 'https://course.csdnimg.cn/asset/ed9e92517b1a25cd1c1d228e0ca37d0a/play_video/{}'.format(ts)
ts_content = requests.get(ts_url, headers=headers).content
content =ic.decrypt(ts_content)
with open('video\\'+title+'.mp4', mode='ab') as f:
f.write(content)
print(ts_url)
print(data)
print(m3u8_text)
解释
这段代码是一个用于下载并解密 m3u8 视频的 Python 脚本。以下是对代码的简要逐行解释:
1-2. 导入所需的模块:re
用于正则表达式,Crypto.Cipher.AES
用于 AES 解密,requests
用于发送网络请求。
3-22. 定义请求头 headers
,这些头信息用于模拟浏览器行为,以适应目标网站的反爬虫机制。
23-24. 定义 API 接口 url
和请求参数 params
,这些参数用于获取视频的相关信息。
-
发送 GET 请求到
url
,获取视频信息,并解析 JSON 响应数据。 -
从响应数据中提取视频标题
title
。 -
从响应数据中提取 m3u8 播放地址
m3u8
。 -
发送 GET 请求到 m3u8 地址,获取 m3u8 文件内容。
29-30. 使用正则表达式从 m3u8 文本中提取加密密钥的 URL key_url
和初始化向量 iv
。
-
发送 GET 请求到
key_url
获取加密的密钥内容。 -
将字符串形式的
iv
转换为字节序列。 -
创建一个 AES 解密上下文
ic
,使用获取的密钥和初始化向量。 -
使用正则表达式从 m3u8 文本中提取所有的 ts 文件片段 URL,并存储在列表
ts_list
中。
35-44. 遍历 ts_list
,对于每个 ts 文件片段:
- 构造 ts 文件的 URL。
- 发送 GET 请求获取 ts 文件内容。
- 使用
ic
对象的decrypt
方法解密 ts 文件内容。 - 将解密后的内容写入到本地文件中,构建完整的视频文件。
45-46. 打印出 API 响应和 m3u8 文件内容,用于调试。
这段代码的目的是下载加密的 m3u8 视频,并将其解密为一个完整的视频文件。代码中的关键步骤包括:
- 发送网络请求获取视频信息和 m3u8 文件。
- 使用正则表达式解析 m3u8 文件,提取加密密钥和 ts 文件片段 URL。
- 使用 AES 解密算法解密 ts 文件片段。
- 将解密后的视频数据写入到本地文件。
请注意,这段代码可能需要根据目标网站的具体实现进行调整,例如请求头、API 接口和参数等。此外,下载和使用加密视频可能涉及版权问题,请确保合法合规使用。
效果呈现:
5.35 DuF:/ P@K.WZ 07/20 效果 https://v.douyin.com/i65ktMex/ 复制此链接,打开Dou音搜索,直接观看视频!