视频爬虫:解析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、微信⼩程序收集 四、信息收集流程漏洞挖掘一、…

rust里如何判断字符串是否相等呢?

在 Rust 中,有几种方法可以判断字符串是否相等。下面是其中几种常见的方法: 使用 运算符:可以直接使用 运算符比较两个字符串是否相等。例如: fn main() {let str1 "hello";let str2 "world";if str1 …

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

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

SQL面试题:一个优化案例

问题描述 假如存在以下两个表: CREATE TABLE customer ( C_CUSTKEY int NOT NULL, C_NAME varchar(25) NOT NULL, C_ADDRESS varchar(40) NOT NULL, C_NATIONKEY int NOT NULL, C_PHONE char(15) NOT NULL, C_ACCTBAL decimal(15,2) NOT NULL, C_MKTSEGMENT char(…

获取光标,并且移动至最后

准备一个元素 <div id"sendMessageInput" contenteditable"true" spellcheck"false"></div>调用获取光标方法&#xff0c;传入元素 this.keepLastIndex(document.getElementById(sendMessageInput))keepLastIndex(obj) {if (wind…

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

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

item_get-小红薯-商品详情

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

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

解决方案&#xff1a; 进去带这个目录&#xff0c;然后切换成root用户&#xff0c;将它删除

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

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

一篇文章带你彻底搞懂Java接口的基本概念、使用方式、特点、应用场景等

一篇文章带你彻底搞懂Java接口的基本概念、使用方式、特点、应用场景等 基本概念&#xff1a; ​ 接口&#xff08;interface&#xff09;在Java中是一个抽象类型的抽象方法集合。 一个类通过继承接口的方式&#xff0c;从而来继承接口的抽象方法。&#xff08;继承的关键词…

mq 面试

老生常谈 顺序发送 只用一个消费者去消费该队列 为了吞吐量的话&#xff0c;有多个消费者去消费怎么办 &#xff1f; 保证入队有序就行&#xff0c;出队以后的顺序交给消费者自己去保证&#xff0c;没有固定套路 通过一定算法&#xff0c;将一组顺序消息发送到…

《长安的荔枝》阅读笔记

《长安的荔枝》阅读笔记 2023年6月9号在杭州的小屋读完&#xff0c;作者以“一骑红尘妃子笑”的典故&#xff0c;想象拓展出来的荔枝使李善德&#xff0c;为了皇帝要求在贵妃寿辰&#xff0c;六月一号那天要吃到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年生的&#xff0c;快18了&#xff0c; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、介绍 本人已经17了&#xff0c;在这17年过的很悲惨&#xff0c;也…

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…

跨域情况下,vue如何下载后台接口提供的application/octet-stream文件流Excel文件

前言 由于跨域&#xff0c;所以无法直接通过window.location.href或者a标签直接下载&#xff0c;直接拼后台接口地址又暴露了后台地址&#xff0c;不可行。 所以在这种跨域情况下&#xff0c;本章讲一下vue如何下载后台接口提供的application/octet-stream文件流Excel文件。 …

Day11-Webpack前端工程化开发

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

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

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

iOS 后台运行

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

NFS服务器

目录 1.nfs简介 2.nfs安装与配置简述 安装包&#xff1a; 配置文件&#xff1a; /etc/exports配置文件的写法 权限&#xff1a;&#xff08;客户端对共享目录的权限&#xff0c;但是最主要的还是目录本身的权限&#xff09; 3.nfs配置 服务端 客户端 4.autofs自动挂载…