推广网站怎么建设,网站建设费用价格明细表,wordpress 竞价页,网络营销与直播电商主要学什么m3u8与协程 HLS找m3u8AES加、解密实例 HLS
即HTTP Live Streaming#xff0c;将流媒体切分为若干TS片段#xff0c;通过一个M3U8列表文件将TS片段批量下载实时流式播放。
#EXTM3U:第一行tag标识。#EXT-X-VERSION:版本#EXT-X-TARGETDURATION:定义每个TS的【最大】duration将流媒体切分为若干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-128URL密钥文件key的地址IV加密向量(如果没有就用16个0代替)#EXTINF:指定每个媒体段(ts文件)的持续时间这个仅对其后面的TS链接有效每两个媒体段(ts文件)间被这个tag分隔开#EXT-X-ENDLIST文件的结束找m3u8 #mermaid-svg-gSXvLgbUN1zTFBoW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gSXvLgbUN1zTFBoW .error-icon{fill:#552222;}#mermaid-svg-gSXvLgbUN1zTFBoW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gSXvLgbUN1zTFBoW .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-gSXvLgbUN1zTFBoW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gSXvLgbUN1zTFBoW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gSXvLgbUN1zTFBoW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gSXvLgbUN1zTFBoW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gSXvLgbUN1zTFBoW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gSXvLgbUN1zTFBoW .marker.cross{stroke:#333333;}#mermaid-svg-gSXvLgbUN1zTFBoW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gSXvLgbUN1zTFBoW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gSXvLgbUN1zTFBoW .cluster-label text{fill:#333;}#mermaid-svg-gSXvLgbUN1zTFBoW .cluster-label span{color:#333;}#mermaid-svg-gSXvLgbUN1zTFBoW .label text,#mermaid-svg-gSXvLgbUN1zTFBoW span{fill:#333;color:#333;}#mermaid-svg-gSXvLgbUN1zTFBoW .node rect,#mermaid-svg-gSXvLgbUN1zTFBoW .node circle,#mermaid-svg-gSXvLgbUN1zTFBoW .node ellipse,#mermaid-svg-gSXvLgbUN1zTFBoW .node polygon,#mermaid-svg-gSXvLgbUN1zTFBoW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gSXvLgbUN1zTFBoW .node .label{text-align:center;}#mermaid-svg-gSXvLgbUN1zTFBoW .node.clickable{cursor:pointer;}#mermaid-svg-gSXvLgbUN1zTFBoW .arrowheadPath{fill:#333333;}#mermaid-svg-gSXvLgbUN1zTFBoW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gSXvLgbUN1zTFBoW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gSXvLgbUN1zTFBoW .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-gSXvLgbUN1zTFBoW .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-gSXvLgbUN1zTFBoW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gSXvLgbUN1zTFBoW .cluster text{fill:#333;}#mermaid-svg-gSXvLgbUN1zTFBoW .cluster span{color:#333;}#mermaid-svg-gSXvLgbUN1zTFBoW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gSXvLgbUN1zTFBoW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} F12 F12 浏览器 source选项卡 快捷键查找 点击XHR/提取断点 单步调试 m3u8 下方的{}点击后可提高阅读性
AES加、解密
解密AES,需安装包pycryptodome pip安装pycryptodome有时会报错装低一点的版本解决
pip install pycryptodome
from Crypto.Cipher import AES
aes AES.new(key, IVb0000000000000000, modeAES.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, headersheaders)# 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, modewb) as f:await f.write(movie_content)print(download success,url:,url)# breakreturn except:c 1await asyncio.sleep((c1)*4)print(下载失败准备重下,url:,url)return url
async def downloads_ts(save_path, ts_path):tasks []name 1with open(ts_path, moder, encodingutf-8) as f:for line in f:if line.startswith(#):continuetask asyncio.create_task(download_one_ts(save_pathf\{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, moderb) as fr, aiofiles.open(save_path, modewb) as fw:content await fr.read()aes AES.new(key, IVb0000000000000000, modeAES.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] .tsname .ts .join(list_temp)print(name)os.system(fcopy /b {name} big{big}.ts)big_list.append(fbig{big}.ts)# print(fcopy /b {name} big{big}.ts)list_temp []last_name .join(big_list)os.system(fcopy /b {last_name} {movie_name}.ts)os.chdir(current_dir)
if __name__ __main__:# 当前文件目录now_dir os.getcwd()# 未解密的ts文件存放目录encrypt_dir en_teacher3if not os.path.exists(encrypt_dir):os.mkdir(encrypt_dir)# 解密的ts文件存放目录decrypt_dir de_teacher3if not os.path.exists(decrypt_dir):os.mkdir(decrypt_dir)# 加密的keykey_url https://hnzy.bfvvs.com/play/zbqDW1ka/enc.keykey get_key(key_url)# 下载ts文件# down_movie()# 解码ts# decrypt_movie()# 合并ts成mp4merge_ts_mp4(电影的名字)