• 进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是一串这种,

49f44be9fe73430d95bbe4c5da5fda95

看了看源码可以直接拿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记得带上不然下载出错,

写的比较简单,可以自己修改