m3u8及其应用

m3u8与协程

  • HLS
  • 找m3u8
  • AES加、解密
  • 实例

HLS

即HTTP Live Streaming,将流媒体切分为若干TS片段,通过一个M3U8列表文件将TS片段批量下载实时流式播放。

#EXTM3U:第一行tag标识。#EXT-X-VERSION:版本#EXT-X-TARGETDURATION:定义每个TS的【最大】duration(持续时间)#EXT-X-ALLOW-CACHE高速缓存#EXT-X-MEDIA-SEQUENCE定义当前M3U8文件中第一个文件的序列号,每个ts文件在M3U8文件中都有固定唯一的序列号#EXT-X-DISCONTINUITY:播放器重新初始化#EXT-X-KEY加密方式(例如AES-128),URL密钥文件key的地址,IV加密向量(如果没有,就用16个0代替)#EXTINF:指定每个媒体段(ts文件)的持续时间,这个仅对其后面的TS链接有效,每两个媒体段(ts文件)间被这个tag分隔开#EXT-X-ENDLIST文件的结束

找m3u8

F12
F12
浏览器
source选项卡
快捷键查找
点击XHR/提取断点
单步调试
m3u8
  • 下方的{},点击后可提高阅读性

AES加、解密

解密AES,需安装包pycryptodome
pip安装pycryptodome有时会报错,装低一点的版本解决

pip install pycryptodome
from Crypto.Cipher import AES
aes = AES.new(key, IV=b"0000000000000000", mode=AES.MODE_CBC)
decrypt_content = aes.decrypt(content)

实例

链接: link

import requests
from lxml import etree
import re
from urllib import parse
import asyncio
import aiohttp
import aiofiles
import os
#   解密AES,需安装包pycryptodome
from Crypto.Cipher import AESdef get_key(url):return get_page_source(url)
def get_page_source(url):headers = {"Referer": "http://www.wbdy.tv/","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36"}resp = requests.get(url, headers=headers)# print(resp.status_code)return resp.content
async def download_one_ts(save_path, url):# for c in range(10):while True:try:c = 0# print(url)print(save_path)async with aiohttp.ClientSession() as session:async with session.get(url) as res:movie_content = await res.content.read()# 存储文件async with aiofiles.open(save_path, mode="wb") as f:await f.write(movie_content)print("download success,url:",url)# breakreturn ""except:c += 1await asyncio.sleep((c+1)*4)print("下载失败,准备重下,url:",url)return url
async def downloads_ts(save_path, ts_path):tasks = []name = 1with open(ts_path, mode='r', encoding='utf-8') as f:for line in f:if line.startswith('#'):continuetask = asyncio.create_task(download_one_ts(save_path+f"\{name}.ts", line),)tasks.append(task)# 以自然数对ts文件命名name += 1await asyncio.wait(tasks)
async def decrypt_ts(file_path, save_path, key):# 默认iv向量是16个0print(file_path)print('*'*20)print(save_path)async with aiofiles.open(file_path, mode="rb") as fr, aiofiles.open(save_path, mode="wb") as fw:content = await fr.read()aes = AES.new(key, IV=b"0000000000000000", mode=AES.MODE_CBC)decrypt_content = aes.decrypt(content)await fw.write(decrypt_content)print(f"解密成功, 文件被存放在{save_path}")
async def aio_decrypt(file_path_ts,new_file_path, key):ts_nums = len(os.listdir(file_path_ts))ts_lists = os.listdir(file_path_ts)tasks = []now_dir = os.getcwd()for name in ts_lists:file_path = os.path.join(now_dir, file_path_ts, name)new_name_path = os.path.join(now_dir, new_file_path, name)tasks.append(asyncio.create_task(decrypt_ts(file_path, new_name_path, key)))# result = await asyncio.gather(*tasks)# return resultawait asyncio.wait(tasks)
# print(res.encode("utf-8"))
def down_movie():
# 下载ts文件loop = asyncio.get_event_loop()loop.run_until_complete(downloads_ts(os.path.join(now_dir, encrypt_dir), './index.m3u8'))print(key)
# 解码ts
def decrypt_movie():loop = asyncio.get_event_loop()loop.run_until_complete(aio_decrypt('en_teacher3', 'de_teacher3', key))
def merge_ts_mp4(movie_name):current_dir = os.getcwd()ts_list = len(os.listdir('./de_teacher3'))os.chdir('./de_teacher3')lists = []big_list = []list_temp = []big = 0for i in range(ts_list):lists.append(i + 1)for i in range(len(lists)):temp = lists[i]list_temp.append(str(temp))if i != 0 and i % 50 == 0:print(list_temp)big += 1list_temp[-1] = list_temp[-1] + '.ts'name = ".ts + ".join(list_temp)print(name)os.system(f"copy /b {name} big{big}.ts")big_list.append(f"big{big}.ts")# print(f"copy /b {name} big{big}.ts")list_temp = []last_name = "+".join(big_list)os.system(f"copy /b {last_name} {movie_name}.ts")os.chdir(current_dir)
if __name__ == '__main__':# 当前文件目录now_dir = os.getcwd()# 未解密的ts文件存放目录encrypt_dir = 'en_teacher3'if not os.path.exists(encrypt_dir):os.mkdir(encrypt_dir)# 解密的ts文件存放目录decrypt_dir = 'de_teacher3'if not os.path.exists(decrypt_dir):os.mkdir(decrypt_dir)# 加密的keykey_url = 'https://hnzy.bfvvs.com/play/zbqDW1ka/enc.key'key = get_key(key_url)# 下载ts文件# down_movie()# 解码ts# decrypt_movie()# 合并ts成mp4merge_ts_mp4("电影的名字")

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

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

相关文章

【知网稳定检索】2024年应用经济学,管理科学与社会发展国际学术会议(AEMSS 2024)

2024年应用经济学,管理科学与社会发展国际学术会议(AEMSS 2024) 2024 International Conference on Applied Economics, Management Science and Social Development 2024年应用经济学,管理科学与社会发展国际学术会议&#xff…

C++ 协程

经典协程辅助入门代码: typedef cotask::task my_task_t; int main() { // create a task using factory function [with lambda expression] my_task_t::ptr_t task my_task_t::create([]() { //创建协程 std::cout ()->get_id() cotask::this_task::get…

uniapp在H5端实现PDF和视频的上传、预览、下载

上传 上传页面 <u-form-item :label"(form.ququ3 1 ? 参培 : form.ququ3 2 ? 授课 : ) 证明材料" prop"ququ6" required><u-button click"upload" slot"right" type"primary" icon"arrow-upward" t…

流媒体播放器EasyPlayer播放H.265与H.264时进度条样式异常该如何解决?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

网易云音乐7天黑胶VIP会员免费领取入口怎么领取网易云音乐黑胶VIP7天会员?

网易云音乐7天黑胶VIP会员免费领取入口怎么领取网易云音乐黑胶VIP7天会员&#xff1f; 1、百度搜索「词令」&#xff0c;在搜索框内输入词令「vip163」关键词直达口令&#xff0c;进入网易云音乐7天黑胶VIP会员免费领取入口&#xff1b; 2、输入网易云音乐黑胶VIP7天会员领取词…

AJAX技术-04-- 跨域说明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1 同源策略同源策略介绍规定要求 请求协议://域名:端口号 关于同源策略练习关于同源策略总结 2.JSONPJSONP原理说明关于JSONP优化 3.CORS介绍介绍不允许跨域说明跨域…

Cascader 级联选择器动态加载数据的回显

如果后端没有只返回第三级的id,而是同时把第三级的名字一起返回了&#xff0c;那么就可以通过下面的方法来实现 1.在级联选择器里面加上这句代码 placeholder"请选择" 2.注册一个字符串 pleasett:"" 3.赋值 如过后端返回的有第三级的选项名 直接进行赋…

itBuilder支持AI对话方式设计表结构啦

更新提示 在老版的AI中不能对话&#xff0c;当AI对需求理解的不准确、不全面时&#xff0c;本次带来的更新针对这个缺陷&#xff0c;提供了再次和AI交互的功能&#xff0c;可以基于之前的设计结果进行修正&#xff0c;详情请点击视频查看。 vedio

【WP】Geek Challenge 2023 web 部分wp

官方出的题很好 学到很多东西 前面几道入门提就不写了 klf_ssti 目录扫描扫到一个robots.txt 打开存在hack路径&#xff0c;查看源码存在klf 传参,结合题目 就是ssti注入了&#xff0c;然后使用tplmap工具发现是盲注&#xff0c;我们这里直接用脚本找popen&#xff1a; im…

深度学习之十一(扩散模型--Diffusion Variational Autoencoder,DVAE)

概念 扩散模型DVAE(Diffusion Variational Autoencoder)是一种结合了变分自动编码器(VAE)和扩散过程的生成模型。它结合了时间连续的扩散过程和变分自编码器的概念,用于建模和生成具有时间序列结构的数据,例如视频、时间序列等。 主要概念: 变分自编码器(VAE): VAE…

一键修复0xc000007b错误代码,科普关于0xc000007b错误的原因

最近很多用户都有遇到过0xc000007b错误的问题&#xff0c;出现这样的问题想必大家都会手足无措吧&#xff0c;其实解决这样的问题也有很简单的解决方法&#xff0c;这篇文章就来教大家如何一键修复0xc000007b&#xff0c;同时给大家科普一下关于0xc000007b错误的原因&#xff0…

禁止编辑的PPT幻灯片,如何有效保护文件安全?

【幻灯片解密、去除密码、找回密码指南】 具体步骤如下&#xff1a;第一步百度搜索【密码帝官网】&#xff0c;第二步在用户中心上传需要解密的文件即可。 你是否有遇到过打开一个PPT文件却发现它被去除了密码无法编辑的情况&#xff1f;别担心&#xff0c;将为您提供最简单的解…

演员及作品-合并单元格

演员作品发行年份 赵丽颖 幸福到万家2022有翡2020知否知否应是绿肥红瘦2017花千骨2015刘亦菲花木兰2020第三种爱情2015四大名捕2012

Redis多机数据库

文章目录 Redis多机数据库一、主从复制1、旧版复制功能的实现a、同步b、命令传播 2、旧版复制功能的缺陷3、新版复制功能的实现a、部分同步功能b、复制实现步骤 4、心跳检测 二、哨兵1、Sentinel概念2、Sentinel初始化流程3、故障转移过程 三、集群1、几个概念2、集群创建流程a…

逆袭之战,线下门店如何在“?”萧条的情况下实现爆发增长?

未来几年&#xff0c;商业走势将受到全球经济形势、科技进步和消费者需求变化等多种因素的影响。随着经济复苏和消费者信心提高&#xff0c;消费市场将继续保持增长&#xff0c;品质化、个性化、智能化等将成为消费趋势。同时&#xff0c;线上购物将继续保持快速增长&#xff0…

Spring Data Redis切换底层Jedis 和 Lettuce实现

1 简介 Spring Data Redis是 Spring Data 系列的一部分&#xff0c;它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象&#xff0c;还支持Jedis和Lettuce两种连接方式。 可通过简单的配置就能连接Redis&#xff0c;并且可以切换Jedis和Lett…

springboot+vue实现websocket通信实例,进入页面建立连接

springbootvue实现websocket通信实例 进入页面建立连接 前端代码&#xff1a; <template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true" v-show&qu…

HarmonyOS应用开发者高级认证【题库答案】

HarmonyOS应用开发者基础认证【题库答案】 一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09;在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xf…

NFTScan | 11.20~11.26 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.11.20~ 2023.11.26 NFT Hot News 01/ OKX Ordinals 市场 API 完成升级 11 月 21 日&#xff0c;OKX Ordinals 市场 API 现已完成升级&#xff0c;新增支持按币种单价查询、排序&…

【Python游戏开发】使用Python编写拼图益智游戏教程

使用Python编写拼图益智游戏 大家一般都玩过拼图益智游戏&#xff0c;或者类似的游戏。今天&#xff0c;就给大家使用pygame库在Python中构建一个拼图益智小游戏。这个拼图小游戏是构建一个围绕着将1-15个数字排列在16个方块的网格中的游戏。 现在&#xff0c;让我们从今天的惊…