视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

一、引用的库

这里需要引用的库是:from Crypto.Cipher import AES
有坑哈,python3.0之后直接安装crypto你会发现不管怎么着都会报错。

经过查找资料找到了原因,原来是20年之后crypto已经被pycryptohome替换掉啦,
如果之前安装过crypyo 活pycrypto需要先卸载

pip uninstall crypyo 
pip uninstall pycrypyo 

然后再安装pycryptohome就可以啦

pip install pycryptohome

二、解密的过程

首先我们需要确定m3u8是不是被加密的

打开m3u8文件在这里插入图片描述

看是否存在这一行:#EXT-X-KEY:METHOD=AES-128,URI=

这就代表文件被加密了,这时候你下载下来的.ts文件是无法播放的

那就让我呢吧解读一下这一段:AES-128代表加密方式

后面跟的url='key.key’是key的链接地址,这个很关键,我们解密就需要用到key

接下来的步骤就是我们访问key的链接获取到返回信息,然后调用AES自带的解密方法解密并下载文件

三、解密的方法

首先是需要通过key链接获取返回值

key = requests.get(key_url).content

然后我们就可以对key进行解密

cryptor = AES.new(key, AES.MODE_CBC,key)

最后调用解密结果实现下载

ts.write(cryptor.decrypt(res_ts))

四、实现方式

代码:

import requests
from Crypto.Cipher import AESkey_url = 'https://www.atstudy.com/api/courseMedia/GetKey?edk=CiBnHz2yhhWf9TMN2QQATvr3dtnOPmVYldMtBjyDipZMVRCO08TAChiaoOvUBCokZGVkZmJkYjQtNDdhYy00NDQxLTkxYzMtYWY3NTQ3ZTgzZTZm&fileId=3701925920444339591&keySource=VodBuildInKMS.key'
ts_url = 'https://1400200613.vod2.myqcloud.com/32a2cf22vodtranssh1400200613/496eef453701925920444339591/drm/v.f230.ts'
key = requests.get(key_url).content
res_ts = requests.get(ts_url).content

下载ts文件

with open('D:\\test1\\11.ts','wb') as ts:# 解密cryptor = AES.new(key, AES.MODE_CBC,key)ts.write(cryptor.decrypt(res_ts))print('下载完成')

完整代码

import time
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
import requests
import m3u8headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}def AESDecrypt(cipher_text, key, iv):cipher_text = pad(data_to_pad=cipher_text, block_size=AES.block_size)aes = AES.new(key=key, mode=AES.MODE_CBC, iv=key)cipher_text = aes.decrypt(cipher_text)return cipher_textdef download_m3u8_video(url, save_name):playlist = m3u8.load(uri=url, headers=headers)key = requests.get(playlist.keys[-1].uri, headers=headers).contentn = len(playlist.segments)size = 0start = time.time()for i, seg in enumerate(playlist.segments, 1):r = requests.get(seg.absolute_uri, headers=headers)data = r.contentdata = AESDecrypt(data, key=key, iv=key)size += len(data)with open(save_name, "ab" if i != 1 else "wb") as f:f.write(data)print(f"\r下载进度({i}/{n}),已下载:{size/1024/1024:.2f}MB,下载已耗时:{time.time()-start:.2f}s", end=" ")download_m3u8_video('https://xxx/playlist.m3u8', 'xxxxxx.mp4')

若在运行的时候出现No module named m3u8

python # ImportError: No module named m3u8

在终端执行以下代码进行安装

pip install m3u8

说明:
如果视频无加密,可以去除加密部分的代码,直接遍历请求每个ts链接,然后写入文件,再合并即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外网渗透信息收集漏洞挖掘

外网渗透信息收集&漏洞挖掘 信息收集一、“资产收集”的重要性二、企业信息收集之域名信息收集2.1、通过域名找到公司2.2、通过公司找到域名3.3、收集每个域名的⼦域名 三、企业信息信息收集之移动资产3.1、移动端APP收集3.2、微信⼩程序收集 四、信息收集流程漏洞挖掘一、…

开发框架软件公司:与之携手,共同开启办公流程化之路!

在快节奏的社会里,如何提高企业的办公效率?如何让各部门之间的协作关系更为顺畅?如何把企业内部的数据真正利用起来,成为高层做出经营决策的重要依据?其实,要做到这些,与开发框架软件公司联手合…

用户权限管理是保证企业图文档安全最有效的策略

企业拥有大量的图文档数据,涉及多个部门和员工,因此需要建立有效的用户权限管理策略,以保护图文档的安全。智橙平台将在线图文档管理与BOM系统的融合应用为企业提供了强大的权限管理功能,能够确保只有授权用户能够访问和编辑特定的…

item_get-小红薯-商品详情

一、接口参数说明: item_get-获得小红薯商品详情,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 名称类型必须描述keyString是调用key(http://o0b.cn/iimiya)secretString是调用密钥api_nameS…

Couldn‘t lock the file :/tmp/bbc-filesystem-base_syscache_service

解决方案: 进去带这个目录,然后切换成root用户,将它删除

spider-flow可视化爬虫界面从入门到放弃

目录 下载编译部署官网地址编译部署启动 简单使用输出文件方式可以正常执行的任务 自定义任务获取小说名 总结 下载编译部署 官网地址 修改端口、数据库、存放地址、执行文件等配置(前后端不分离,配置文件端口即页面登录端口) spider-flow-w…

《长安的荔枝》阅读笔记

《长安的荔枝》阅读笔记 2023年6月9号在杭州的小屋读完,作者以“一骑红尘妃子笑”的典故,想象拓展出来的荔枝使李善德,为了皇帝要求在贵妃寿辰,六月一号那天要吃到10斤的荔枝。需要从广州运送到长安即如今的西安。本来以为这个差事…

【javaSE】 实现图书管理系统

目录 整体思路 Book包 Book类 BookList类 user包 User类 NormalUser类 AdminUser管理员类 testmain包 opera包 IOPeration接口 普通用户 ExitOperation类 FindOperation类 BrrowOperation类 ReturnOperation类 管理员 AddOperation类 DelOperation类 ShowOp…

聊聊我的故事-悲惨的童年

目录 前言一、介绍二、17年回顾1.出生2.上幼儿园3.上小学4.上初中 高中总结 前言 本人是06年生的,快18了, 提示:以下是本篇文章正文内容,下面案例可供参考 一、介绍 本人已经17了,在这17年过的很悲惨,也…

python中数据可视化

1.掷一个D6和一个D10 50000次的结果 die.py from random import randintclass Die:def __init__(self, num_sides6):self.num_sides num_sidesdef roll(self):return randint(1, self.num_sides) die_visual.py from die import Die from plotly.graph_objs import Bar, L…

Day11-Webpack前端工程化开发

Webpack 一 webpack基本概念 遇到问题 开发中希望将文件分开来编写,比如CSS代码,可以分为头部尾部内容,公共的样式。 JS代码也希望拆分为多个文件,分别引入,以后代码比较好维护。 本地图片,希望可以实现小图片不用访问后端,保存在前端代码中就可以了 运行程序时我…

软件测试面试总结——http协议相关面试题

前言 在PC浏览器的地址栏输入一串URL,然后按Enter键这个页面渲染出来,这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点,不知道背后的逻辑,是无法发现隐藏的bug,只能找一…

iOS 后台运行

iOS后台行,一般有两种方式: 1.UIBackgroundTaskIdentifier后台任务标记时, 2.设置后台运行模式,需要有voip,location功能的才行。不然app上线审核肯定是过不了的。 下面是我学习后台运行的尝试过程。 一.首先创建一个项目功程…

第20节 R语言医学分析:某保险医疗事故赔偿因素分析

文章目录 某保险医疗事故赔偿因素分析源码源文件下载某保险医疗事故赔偿因素分析 我们分析数据集“诉讼”的第一个方法是确定样本数量、变量类型、缩放/编码约定(如果有)用于验证数据清理。 接下来,数据集看起来很干净,没有缺失值,并且对于分类变量,将编码约定替换为实际…

1.Kubernetes

文章目录 KubernetesK8S概述作用为什么使用K8S主要功能Kubernetes 集群架构与组件总结: 核心组件Master组件Kube-apiserverKube-controller-managerKube-scheduler工作 配置存储中心etcd Node组件KubeletKube-Proxydocker 或 containerd 总结: 工作流程K…

组合模式(Composite)

组合模式是一种结构型设计模式,主要用来将多个对象组织成树形结构以表示“部分-整体”的层次结构,因此该模式也称为“部分-整体”模式。简言之,组合模式就是用来将一组对象组合成树状结构,并且能像使用独立对象一样使用它们。 Co…

PHP语言基础知识(超详细)

文章目录 前言第一章 PHP语言学习介绍 1.1 PHP部署安装环境1.2 PHP代码工具选择 第二章 PHP代码基本语法 2.1 PHP函数知识介绍2.2 PHP常量变量介绍 2.2.1 PHP变量知识:2.2.2 PHP常量知识: 2.3 PHP注释信息介绍2.4 PHP数据类型介绍 2.4.1 整形数据类型2.4…

Linux安装部署并使用Redis(包含Redis Desktop Manager界面化工具)

文章目录 前言一、Redis的简介二、redis的安装与配置(Linux环境)三、redis的使用(Redis Desktop Manager界面化)四、基本命令**String基本命令:****hash基本命令:****List基本命令:****set基本命…

C++ STL快速应用

STL 容器 STL容器有共同的操作接口,包括初始化操作、判空、查看大小、比较元素、销毁、交换,这些操作都是一样的接口。 对于访问遍历元素(增删改查),都可以使用迭代器(正向)进行操作&#xff0c…

1分钟解决github push/pull报错443

1.打开https://www.ipaddress.com/ 2.复制如图IP地址 3.文件夹打开C:\Windows\System32\drivers\etc,复制hosts文件,粘贴到桌面 4.在桌面用记事本打开复制过来的hosts 5.在末尾加上一行,IP写刚才复制的 6.复制桌面的hosts,粘贴回C:\Window…