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()

分类:

后端

标签:

Python

作者介绍

tslilove
V1