1.png
⼀般只需要关注EXT-X-KEY:这个有没有,有的话代表加密,后⾯URI对应⼀个⽹络请求,⼀般是根路径+URI;就是获取加密key的;⽽METHOD就是加密⽅式,读取下载好的⽂件然后反正解密⽣成新ts⽂件即可 main_page = , "html.parser")
src = main_page.find("iframe").get("src")
return src
# return "boba.52kuyun/share/xfPs9NPHvYGhNzFp" # 为了测试
def get_first_m3u8_url(url):
resp = (url)
# )
obj = repile(r'var main = "(?P<m3u8_url>.*?)"', re.S)
m3u8_url = obj.).group("m3u8_url")
# print(m3u8_url)
return m3u8_url
def download_m3u8_file(url, name):
resp = (url)
视频文件加密with open(name, mode="wb") as f:
f.t)
async def download_ts(url, name, session):
async (url) as resp:
async with aiofiles.open(f"video2/{name}", mode="wb") as f:
await f.write(t.read()) # 把下载到的内容写⼊到⽂件中
print(f"{name}下载完毕")
async def aio_download(up_url): # boba.52kuyun/20170906/Moh2l9zV/hls/
tasks = []
async with aiohttp.ClientSession() as session: # 提前准备好session
async with aiofiles.open("越狱第⼀季第⼀集_", mode="r", encoding='utf-8') as f: async for line in f:
if line.startswith("#"):
continue
# line就是xxxxx.ts
line = line.strip() # 去掉没⽤的空格和换⾏
# 拼接真正的ts路径
ts_url = up_url + line
task = ate_task(download_ts(ts_url, line, session)) # 创建任务 tasks.append(task)
await asyncio.wait(tasks) # 等待任务结束
def get_key(url):
resp = (url)
# 解密
async def dec_ts(name, key):
# 此处IV=b"0000000000000000"中0的个数对应key的字符串长度
aes = w(key=key, IV=b"0000000000000000", mode=AES.MODE_CBC)
async with aiofiles.open(f"video2/{name}", mode="rb") as f1,\
aiofiles.open(f"video2/temp_{name}", mode="wb") as f2:
bs = ad() # 从源⽂件读取内容
await f2.write(aes.decrypt(bs)) # 把解密好的内容写⼊⽂件
print(f"{name}处理完毕")
async def aio_dec(key):
# 解密
tasks = []
async with aiofiles.open("越狱第⼀季第⼀集_", mode="r", encoding="utf-8") as f: async for line in f:
if line.startswith("#"):
continue
line = line.strip()
# 开始创建异步任务
task = ate_task(dec_ts(line, key))
tasks.append(task)
await asyncio.wait(tasks)