tslilove
V1
2022/12/01阅读:92主题:山吹
cctv视频下载神器
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
需求分析:
需要下载cctv的视频,打开链接发现右键并不能下载

F12打开控制台,查看视频源码,看看视频链接,发现视频是经过加密的为m3u8类型

按照这种思路,首先是复制链接去下载,利用文本文件打开,看看内容,如图所示,给了4中不同分辨率的视频格式的m3u8链接

接着就是去就是去拼接rootURL,然后再下载,利用文本打开,发现是按顺序排列的ts,每个ts有10秒的播放时长

我们复制一个去网页打开(拼接的url可在网络中查找)

我们发现并不能播放

利用python下载
import requests
headers = {
"authority": "dh5.cntv.myalicdn.com",
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5",
"origin": "https://tv.cctv.com",
"referer": "https://tv.cctv.com/",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"
}
url = "https://dh5.cntv.myalicdn.com/asp/h5e/hls/1200/0303000a/3/default/67074f48b9a14d2e858514f57ee13d12/0.ts"
response = requests.get(url, headers=headers)
with open('0.ts','wb') as f:
f.write(response.content)
发现播放出现花屏,猜测是经过再次加密的

那么怎么办呢?
该怎么办就怎么办,本次花屏解决方案不在本篇文章描述,后面有时间会进行研究。
不过官方还是是良心,我们在网络中,点击XHR,找到如下图所示的接口,在video节点中返回了4中不同分辨率的视频列表
实战:
利用python下载,这里暂且下载3个
在视频的当前目录下,进入dos命令行,输入如图命令,进行视频原生无损合并

这个时候,我们就发现,在当前目录下,多了一个cctv.mp4的视频文件,就合并成功了

合并视频文件需要下载FFmPeg工具
工具下载链接:https://ffmpeg.org/download.html
下载解压以后,需要将bin所在路径添加环境变量
到这里就结束了!
文本分享整源码:
import requests
from tqdm import tqdm
class CCTV:
def __init__(self):
self.headers = {
"authority": "vdn.apps.cntv.cn",
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5",
"cache-control": "no-cache",
"origin": "https://tv.cctv.com",
"referer": "https://tv.cctv.com/",
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 Edg/107.0.1418.52"
}
def download_video(self,url,name):
resq = requests.get(url)
with open(f'./mp4_old/{name}','wb') as f:
f.write(resq.content)
def get_video_link(self):
url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do"
params = {
"pid": "67074f48b9a14d2e858514f57ee13d12",
"client": "flash",
"im": "0",
"tsp": "1669015591",
"vn": "2049",
"vc": "8D82BEA7636CA5F064ECE87362977A88",
"uid": "B0CB37D9BEC8F5731581070DD3FB4F6E",
"wlan": ""
}
response = requests.get(url, headers=self.headers, params=params)
chapter4 = response.json()["video"]["chapters4"]
for i in tqdm(range(len(chapter4)),desc="【正在下载中】"):
# print(i)
url = chapter4[i].get('url')
name = url.split('-')[-1]
if i == 0:
tqdm.write(f"\n下载当前视频{name},{url}")
else:
tqdm.write(f"下载当前视频{name},{url}")
# print(name, url)
self.download_video(url,name)
tqdm.write(f"\n{name}下载完成")
self.set_ffmpeg_file(name)
def set_ffmpeg_file(self,name):
with open('./mp4_old/videoList.txt','a',encoding='utf-8') as f:
f.write("file "+name+'\n')
if __name__ == '__main__':
c = CCTV()
c.get_video_link()

作者介绍
tslilove
V1