当前位置: 首页 > news >正文

【Python脚本系列】PyCryptodome库解决网盘内.m3u8视频文件无法播放的问题(三)

网盘内的.m3u8视频无法播放,这时可以利用python脚本下载video.json文件中的视频流文件,然后利用PyCryptodome解密,最后合成一个outvideo.mp4文件。

PyCryptodome是 Python 的一个加密库,功能类似 PyCrypto,但是更现代、维护更活跃、支持更多加密算法。它提供对 AES、RSA、SHA、HMAC 等加密算法的实现,可以进行加密、解密、哈希、签名等操作。

安装方式(在 Windows 或 Linux 上):

pip install pycryptodome

在代码里使用时通常写成:

from Crypto.Cipher import AES

“Cryptodome” 这个单词可以拆开理解成两个部分:

  1. Crypto → 来自 cryptography(密码学),表示与加密、加密技术相关。

  2. Dome → 英文中是“圆顶、穹顶”,在这里更像是一个象征,表示“加密的保护层”或“安全的外壳”。

合起来,“Cryptodome” 可以理解为 “加密的穹顶/保护层”,也就是提供安全加密功能的库的意思。

1.现有如下m3u8的video.json文件,代码如下:

{"m3u8": "http://123.net/123/0/123_1.m3u8","m3u8BaseUri": "http://123.net/123/0/","updateTime": "2022-09-06T19:54:19.1641875+08:00","m3u8Info": {"originalCount": 39,"count": 39,"vod": true,"targetDuration": 26,"totalDuration": 953.90000000000009,"segments": [[{"index": 0,"method": "AES-128","key": "3ovxbGvr123soUt4V123xA==","iv": "0x9c12362db50c148d1234f08b759d4123","duration": 25.2,"segUri": "http://hw-mts.videocc.net/4ffae39b72/0/1234567890123/0/ff/b6/80_1/123_1_0.ts"},{"index": 1,"method": "AES-128","key": "3ovxbGvr123soUt4V123xA==","iv": "0x9c12362db50c148d1234f08b759d4123","duration": 25.0,"segUri": "http://hw-mts.videocc.net/4ffae39b72/0/1234567890123/0/ff/b6/80_1/123_1_1.ts"},{"index": 2,"method": "AES-128","key": "3ovxbGvr123soUt4V123xA==","iv": "0x9c12362db50c148d1234f08b759d4123","duration": 25.0,"segUri": "http://hw-mts.videocc.net/4ffae39b72/0/1234567890123/0/ff/b6/80_1/123_1_2.ts"}]]}
}

2.编写一段python脚本,该脚本通过读取m3u8视频的video.json文件,下载分段的ts文件,然后利用PyCryptodome库(from Crypto.Cipher import AES)解密ts文件,最后合并成output.mp4,然后就可以观看视频了。其中解密时会用到video.json里的 两个参数:

 "key": "3ovxbGvr123soUt4V123xA==",
"iv": "0x9c12362db50c148d1234f08b759d4123"

具体python脚本如下:

import os
import json
import base64
import requests
from Crypto.Cipher import AES# =========================
# 配置
# =========================
json_file = "video.json"      # JSON 文件路径
output_file = "output.mp4"    # 最终视频输出文件
ts_dir = "ts_files"           # TS 文件临时保存目录# 创建 TS 保存目录
os.makedirs(ts_dir, exist_ok=True)# =========================
# 读取 JSON
# =========================
with open(json_file, "r", encoding="utf-8") as f:data = json.load(f)# 新 JSON 格式
ts_list = data["m3u8Info"]["segments"][0]# =========================
# 下载并解密 TS
# =========================
decrypted_files = []for index, ts_item in enumerate(ts_list):ts_url = ts_item["segUri"]ts_name = os.path.join(ts_dir, f"{index}.ts")decrypted_name = os.path.join(ts_dir, f"{index}_dec.ts")# 下载 TSprint(f"Downloading {ts_url} ...")r = requests.get(ts_url, stream=True)with open(ts_name, "wb") as f:for chunk in r.iter_content(1024 * 1024):f.write(chunk)# AES Keykey = base64.b64decode(ts_item["key"])# IViv_hex = ts_item.get("iv", "").replace("0x", "")iv = bytes.fromhex(iv_hex) if iv_hex else index.to_bytes(16, byteorder='big')# 解密 TScipher = AES.new(key, AES.MODE_CBC, iv)with open(ts_name, "rb") as f_in, open(decrypted_name, "wb") as f_out:encrypted_data = f_in.read()decrypted_data = cipher.decrypt(encrypted_data)# 去掉 PKCS7 填充pad_len = decrypted_data[-1]if 1 <= pad_len <= 16:decrypted_data = decrypted_data[:-pad_len]f_out.write(decrypted_data)decrypted_files.append(decrypted_name)# =========================
# 合并 TS 文件
# =========================
with open(output_file, "wb") as f_out:for file in decrypted_files:with open(file, "rb") as f_in:f_out.write(f_in.read())print(f"Video saved as {output_file}")

以上python代码适用于网盘里无法直接观看的m3u8视频,通常有两个文件,一个是video.json,另一个是raw.m3u8,直接下载raw.m3u8得到的是video.json,所以直接对video.json里的.ts视频文件进行下载然后解密。


文章转载自:

http://y0D7ZSyB.mktms.cn
http://BuettWxN.mktms.cn
http://gzzm3h1B.mktms.cn
http://6xRwnU9b.mktms.cn
http://XUNzFGXd.mktms.cn
http://BVJxNImL.mktms.cn
http://m86qB0Fz.mktms.cn
http://oAqZknaO.mktms.cn
http://MoDvhfUK.mktms.cn
http://p9YKd0F9.mktms.cn
http://eK7VP6CI.mktms.cn
http://zdCh4IPW.mktms.cn
http://BP5Fe0Qt.mktms.cn
http://utKYVvLW.mktms.cn
http://NQPAF3v8.mktms.cn
http://VoExJ4hQ.mktms.cn
http://nJtajsc1.mktms.cn
http://6AzFIzLS.mktms.cn
http://TzBdjOKn.mktms.cn
http://0i6EP4ly.mktms.cn
http://SEsVfOCr.mktms.cn
http://3ZpK5z0Z.mktms.cn
http://FtpowtBl.mktms.cn
http://0crVR7Kc.mktms.cn
http://Tm0Qi5bK.mktms.cn
http://ZxTF2h9H.mktms.cn
http://G8tYzhK4.mktms.cn
http://4j25jDXw.mktms.cn
http://JCjmD9s1.mktms.cn
http://U9kC18CC.mktms.cn
http://www.dtcms.com/a/372238.html

相关文章:

  • DuckDB 1.4新增功能提前知道
  • Wi-Fi技术——传播与损耗
  • 管道的优缺点
  • 训练+评估流程
  • 【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架
  • PHP云课堂在线网课系统 多功能网校系统 在线教育系统源码
  • redis的高可用(哨兵)
  • Redis之分布式锁与缓存设计
  • pip常用指令小结
  • Python中进行时区转换和处理
  • CTFshow系列——PHP特性Web97-100
  • Python快速入门专业版(九):字符串进阶:常用方法(查找、替换、分割、大小写转换)
  • MySQL 8.0+ 内核剖析:架构、事务与数据管理
  • 11.2.1.项目整体架构和技术选型及部署
  • [C++刷怪笼]:set/map--优质且易操作的容器
  • zotero扩容
  • 20250907_梳理异地备份每日自动巡检py脚本逻辑流程+安装Python+PyCharm+配置自动运行
  • UserManagement.vue和Profile.vue详细解释
  • Python进阶编程:文件操作、系统命令与函数设计完全指南
  • 【redis 基础】redis 的常用数据结构及其核心操作
  • 美团大模型“龙猫”登场,能否重塑本地生活新战局?
  • nats消息队列处理
  • k8s镜像推送到阿里云,使用ctr推送镜像到阿里云
  • Ubuntu Qt x64平台搭建 arm64 编译套件
  • IO性能篇(一):文件系统是怎么工作的
  • SQL Server——基本操作
  • nginx详解
  • 硬件开发1-51单片机4-DS18B20
  • 【LLIE专题】LYT-Net:一种轻量级 YUV Transformer 低光图像增强网络
  • 数据库造神计划第二天---数据库基础操作