- 进QQ群:点我
调试了一圈下来,
直接上代码。
首先是python下载代码:分段下载并合并,ffmpeg请自己百度下载并修改成自己的路径
#coding:utf-8
import os
import datetime
import subprocess
from Crypto.Cipher import AES
import requests
import math
def download(url,url_s,headers):
count = 0
download_path = os.getcwd() + "\download"
if not os.path.exists(download_path):
os.mkdir(download_path)
download_path = os.path.join(download_path, datetime.datetime.now().strftime('%Y%m%d_%H%M%S'))
os.mkdir(download_path)
all_content = requests.get(url, headers=headers).text
if "#EXTM3U" not in all_content:
raise BaseException("非M3U8的链接")
all_content = requests.get(url,headers=headers).text
file_line = all_content.split("\n")
unknow = True
key = ""
dst_file = open(os.path.join(download_path,'list.txt'), 'w',encoding='utf-8')
for index, line in enumerate(file_line): # 第二层
if "#EXT-X-KEY" in line: # 找解密Key
method_pos = line.find("METHOD")
comma_pos = line.find(",")
method = line[method_pos:comma_pos].split('=')[1]
print("Decode Method:", method)
uri_pos = line.find("URI")
quotation_mark_pos = line.rfind('"')
key_url = line[uri_pos:quotation_mark_pos].split('"')[1]
key = requests.get(key_url,headers=headers,timeout=3).content
iv = line.split(",IV=")[-1]
if "EXTINF" in line: # 找ts地址并下载
durion = line.split(":")[-1][:-1]
print(durion)
durion = math.ceil(float(durion))
unknow = False
pd_url = url_s+file_line[index + 1] # 拼出ts片段的URL
res = requests.get(pd_url,headers)
if len(key): # AES 解密
if not isinstance(key,bytes):
key = key.encode()
ci = AES.new(key, AES.MODE_CBC, bytes.fromhex(iv.split('0x')[1]))
with open(os.path.join(download_path, str(count) + ".ts"), 'ab') as f:
f.write(ci.decrypt(res.content))
dst_file.write("file '%s'%s" % (os.path.join(download_path, str(count) + ".ts"),'\n'))
count+=1
#是否延时瞎下载
# time.sleep(durion)
else:
with open(os.path.join(download_path, str(count)), 'ab') as f:
f.write(res.content)
f.flush()
count+=1
if unknow:
raise BaseException("未找到对应的下载链接")
else:
print("下载完成")
dst_file.close()
merge_file(download_path)
def merge_file(f_n):
mp4_file =os.path.join(f_n,'0.mp4')
cmd = r'D:\软件\ffmpeg2\ffmpeg\bin\ffmpeg.exe'
exec_result = subprocess.call([cmd, '-f', 'concat', '-safe', '0', '-i', os.path.join(f_n,'list.txt'), '-c', 'copy', mp4_file])
if __name__ == '__main__':
headers = {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Origin': 'https://apprlg8mqk34060.h5.xiaoeknow.com',
'Referer': 'https://apprlg8mqk34060.h5.xiaoeknow.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36',
'sec-ch-ua': '"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
}
url = 'https://encrypt-k-vod.xet.tech/529d8d60vodtransbj1252524126/db501ff2387702305075417729/drm/v.f421220.m3u8?sign=bda6111a4cf0e61cadbd3f9acec6a166&t=63126eb2&us=muabJHrOmT'
url_s = 'https://encrypt-k-vod.xet.tech/529d8d60vodtransbj1252524126/db501ff2387702305075417729/drm/'
download(url=url,url_s=url_s,headers=headers)
比较简单.
其次是js 解密m3u8链接的代码,默认返回的url是一串这种,
看了看源码可以直接拿js调用
web.js
下载地址
链接:https://pan.baidu.com/s/1S2vGse6C5Wp3h2ywtdMJnw?pwd=dsq4
提取码:dsq4
–来自百度网盘超级会员V6的分享
把上述代码 复制进自己创建的文件web.js里面
执行python程序:
import execjs
res = "W$siZGVmaW5pdGlvbl9uYW@lIjoiXHU5YWQ%XHU#ZTA@IiwiZGVmaW5pdGlvbl9wIjoiNzIwUCIsInVybCI6Imh0dHBzOlwvXC9lbmNyeXB0LWstdm9kLnhldC50ZWNoXC8@MjlkOGQ#MHZvZHRyYW5zYmoxMjUyNTI0MTI#XC9kYjUwMWZmMjM%NzcwMjMwNTA$NTQxNzcyOVwvZHJtXC9#LmY0MjEyMjAubTN@OD9zaWduPWYxZWIzYTIzODllYmRkN#Y$MzI0ZGEzZjEzNmIxODEzJnQ9NjMxMjY@YzgmdXM9WHFnVmJETGpJWCIsImlzX$N@cHBvcnQiOmZhbHNlLCJleHQiOnsiaG9zdCI6Imh0dHBzOlwvXC9lbmNyeXB0LWstdm9kLnhldC50ZWNoIiwicGF0aCI6IjUyOWQ%ZDYwdm9kdHJhbnNiajEyNTI@MjQxMjZcL#RiNTAxZmYyMzg$NzAyMzA@MDc@NDE$NzI5XC9kcm0iLCJwYXJhbSI6InNpZ#%9ZjFlYjNhMjM%OWViZGQ$ZjczMjRkYTNmMTM#YjE%MTMmdD0#MzEyNjVjOCZ@cz@YcWdWYkRMaklYIn@9XQ==__ba"
Passwd = execjs.compile(open(r"web.js", 'r', encoding='gb2312').read()).call('W', res)
print(Passwd)
返回:
[{'definition_name': '楂樻竻', 'definition_p': '720P', 'url': 'https://encrypt-k-vod.xet.tech/529d8d60vodtransbj1252524126/db501ff2387702305075417729/drm/v.f421220.m3u8?sign=f1eb3a2389ebdd7f7324da3f136b1813&t=631265c8&us=XqgVbDLjIX', 'is_support': False, 'ext': {'host': 'https://encrypt-k-vod.xet.tech', 'path': '529d8d60vodtransbj1252524126/db501ff2387702305075417729/drm', 'param': 'sign=f1eb3a2389ebdd7f7324da3f136b1813&t=631265c8&us=XqgVbDLjIX'}}]
得到了真实链接
替换下载代码中的url,和url_s,就可以下载了
url是视频链接
url_s是用来拼接片段链接的schemes前缀
headers记得带上不然下载出错,
写的比较简单,可以自己修改
- 进QQ群:点我