python实战:分析网站的m3u8文件下载ts文件并解密
2023-06-13 09:18:16 时间
前言
这个文章默认读者已了解m3u8的相关知识,包括如何在浏览器中查找m3u8文件的url和ts文件的下载地址;
代码实战
使用到的模块有:
os,requests, re,Crypto
主要模块Crypto在安装时执行命令如下:
pip install pycryptodome
实现逻辑:
- 在浏览器里找到m3u8文件的额url
- 解析m3u8文件,获取ts下载地址和解密所需的key > 在m3u8文件中,key所在的行一般以EXT-X-KEY标识,记录加密方法METHOD和key,iv等信息;IV值一般不需要;
- 获取的ts是多个,需要单个下载,并解密 > 根据获取的ts下载地址直接下载下来的文件,如果无法播放,那基本上就是加密了;需要通过获取的key来解密;
- 下载的文件命名需要有规律,方便后续合成的需求;
实现代码如下:
'''
目标网站:
根据m3u8文件下载ts并解密
'''
import os,requests,re
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
dest_folder = 'F:\kecom'
def d_ts_decrypt(key_url,ts_urls,folder='1'):
'''
下载ts并解密存储
'''
#先创建文件夹
ts_dir = os.path.join(dest_folder,folder)
if not os.path.exists(ts_dir):
os.makedirs(ts_dir)
key = requests.get(key_url).content # 请求 key
cryptor = AES.new(key, AES.MODE_CBC) # 创建一个解密器
start = 0
for ts_url in ts_urls:
start = start + 1
print(ts_url)
content = requests.get(ts_url).content #获取ts
decrypt_content = cryptor.decrypt(content) #解密
# 写入文件
ts_file = os.path.join(ts_dir,str(start).zfill(4) + '.ts')
with open(ts_file,'ab') as f:
f.write(decrypt_content)
#处理m3u8文件地址,解析出key和ts_url
def deal(m3u8_file_url,index='0'):
mf_text = requests.get(m3u8_file_url).text
#print(mf_text)
ts = mf_text.split("\n")
for l in ts:
if 'URI' in l:
keyUrl = re.findall(r'URI=".*?"',l)[0]
break
origin_url = m3u8_file_url[0:m3u8_file_url.index('voddrm')]
#获取完整的url
keyUrl = keyUrl.replace('URI=','').replace('"','')
#print(keyUrl)
ts_lines = [origin_url + line.replace('\n','') for line in ts if 'start=' in line]
#print(len(ts_lines),ts_lines[0])
d_ts_decrypt(key_url=keyUrl,ts_urls=ts_lines,folder = index)
#return keyUrl,ts_lines
m3u8_files = [
J2h0dHBzOi8vMTI1ODcxMjE2Ny52b2QyLm15cWNsb3VkLmNvbS8yNTEyMWE2YXZvZHRyYW5zYmoxMjU4NzEyMTY3L2U4ZWE1MDA5Mzg3NzAyMzA2NDkzMTIwMDY3L2RybS92b2Rkcm0udG9rZW4uZFdsdVBURTBOREV4TlRNM09UTXpNRFl4TlRjM09UdGxlSFE5TWpGaVpHRTRZamhsWlRSaU9EazNaalE0TnpOaU5XRmpZbVUwTldNd01qTXpaV1UyTlRJNVpqa3dObUl5T1dZelpUTTNaakUxTkRnMlltVTJNRFF6TVRKalptRTBOemxpT1RVM09UazBORFV4WldWaU0yUTJPV1UzTVRneVlqWXlOR0l3Wm1Sa05XWTVaR1k1WkdVeU0yWmpaVGhoTlRBeFpHVTJNbUZrTXpSalpqRTFNVEJrTWpFellqRTJNMlpoTzNWcFpGOTBlWEJsUFRJN2RXbGtYMjl5YVdkcGJsOTFhV1JmZEhsd1pUMHlPM1ZwWkY5dmNtbG5hVzVmWVhWMGFGOTBlWEJsUFRJN2RXbGtYMkZ3Y0dsa1BURTBNREF3TURBd01EZzdZMmxrUFRVNE9USTJPRGs3ZEdWeWJWOXBaRDB4TURZeE1EazVOekU3ZG05a1gzUjVjR1U5TUR0d2JHRjBabTl5YlQwei52LmYzMDc0Mi5tM3U4P2V4cGVyPTAmc2lnbj00MjA1NGZmMTk5MzliYzE1ZDEzNTY2NDYyZDg2MzNmMiZ0PTY0MkJDQjdEJnVzPTYxNTE3Mzg0OTMyNjIyNjI0MDEnLA
]
i = 0
for mf in m3u8_files:
''''''
i = i + 1
deal(mf,str(i))
#break
上面代码下载的文件,应该可以播放了;但是文件很碎,如果需要合成,建议使用ffmpeg命令;
首先需要将所有文件索引放到一个文件中;
通过以下批处理命令实现:
(for %i in ( *.ts ) do @echo file '%i') > list.txt
通过FFMPEG的合并视频的命令生成一个完整的视频;
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
相关文章
- 快速入门Python机器学习(28)
- Python 打开文件对话框「建议收藏」
- python运行代码不成功_Python | PyCharm无法直接运行(Run)脚本
- python中pygame怎么安_Python中pygame安装方法图文详解
- Python入门系列(十)一篇学会python文件处理
- python 生成EXE文件 并执行
- java和python哪个值得学-学java好还是Python好?
- Python编程 whl文件安装库
- 【说站】python查询键值对是否在字典的三个方法
- h5 Python_python做h5网站
- python读取pkl_Python读取文件的一段内容
- Python搭建http共享文件
- Python学习之文件操作【基本操作,JSON文件操作】
- python从linux下载文件_python gzip
- Python安装失败_python第三方库安装失败
- 如何利用Python批量重命名PDF文件
- 这里有11种方法,供你用python下载文件
- Python指定文件备份工具详解编程语言
- 三种Python下载url并保存文件的代码详解编程语言
- python从网络下载文件并获得文件大小、文件类型详解编程语言
- python下载文件时显示下载进度的代码详解编程语言
- Linux创建Python文件的步骤(linux新建python文件)
- MySQL与Python搭配,实现数据库操作。(mysql-python)
- 如何在Linux上将Python脚本设置为后台运行?(linux后台运行python)
- Python如何连接MySQL数据库(python怎么连接mysql数据库)
- 在Linux上安装Python学习快乐(linux下载python)
- Linux下Python编程:从入门到精通(linux下python编程)
- python从远程服务器下载日志文件的程序