视频下载算法分析

import random
import re
import time
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from m3u8download_hecoter import m3u8download

def get_cKey_python(vid,tm,appVer,guid,platform):
    def get_qn(Vn):
        Jn = 0
        for Mr in range(len(Vn)):
            Xn = ord(Vn[Mr])
            Jn = (Jn << 5) - Jn + Xn
            Jn &= 0xFFFFFFFF
        return Jn

    Kn = bytes.fromhex("4E2918885FD98109869D14E0231A0BF4") # 固定
    Wn = bytes.fromhex("16B17E519DDD0CE5B79D7A63A4DD801C") # 固定

    sr = "mg3c3b04ba" #固定
    Nn = "https://w.yangshipin.cn/"
    Fn = f"|{vid}|{tm}|{sr}|{appVer}|{guid}|{platform}|{Nn}|mozilla/5.0 (windows nt ||Mozilla|Netscape|Win32|"
    qn = get_qn(Fn)
    Yn = f"|{qn}" + Fn
    # print(Yn)
    cryptor = AES.new(key=Kn,mode=AES.MODE_CBC,iv=Wn)
    cKey = '--01' + cryptor.encrypt(pad(Yn.encode(),16)).hex().upper()

    return cKey

def get_flowid():
    """flowid = `${(new Date).getTime().toString(36)}_${Math.random().toString(36).replace(/^0./, "")}`"""
    def baseN(num, b):
        return ((num == 0) and "0") or \
               (baseN(num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])
    flowid = baseN(int(time.time()*1000),36) + '_' + baseN(int(str(random.random()).replace('0.','')), 36)
    return flowid

def get_signs(url):
    headers = {
        'user-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44",
        'referer':'https://w.yangshipin.cn/'
    }

    guid = 'l29u6mj9_e5kopm32to5'
    platform = '4330701' # 视频平台 web: 4330701 app:4330303
    vid = re.findall('vid=(.+)',url)[0].split('&')[0]
    defn = 'fhd' # 清晰度
    charge = '0'
    defaultfmt = 'auto'
    otype = 'json'
    defnpayver = '1'  # app:defnpayver=5
    appVer = '0.2.0' # app:V8.7.1034.4247
    sphttps = '1' # app:0
    sphls = '1'# app:2
    spwm = '4' # app:2
    dtype = '3'
    defsrc = '2' # app:3
    encryptVer = '8.1' # app:4.2
    sdtfrom = '4330701' # app:v5028
    tm = str(int(time.time()))# 1650635739
    cKey = get_cKey_python(vid=vid,tm=tm,appVer=appVer,guid=guid,platform=platform)
    flowid = get_flowid()

    infourl = f"https://playvv.yangshipin.cn/playvinfo?&guid={guid}&platform={platform}&vid={vid}&defn={defn}&charge={charge}&defaultfmt={defaultfmt}&otype={otype}&defnpayver={defnpayver}&appVer={appVer}&sphttps={sphttps}&sphls={sphls}&spwm={spwm}&dtype={dtype}&defsrc={defsrc}&encryptVer={encryptVer}&sdtfrom={sdtfrom}&cKey={cKey}&flowid={flowid}"
    # print(infourl)
    response = eval(requests.get(url=infourl,headers=headers).text)
    ############################################
    vi = response['vl']['vi'][0]

    fn = vi['fn']

    fvkey = vi['fvkey']
    title = vi['ti']

    baseurl = vi['ul']['ui'][0]['url']
    # playurl = f"{baseurl}{fn}?sdtfrom={sdtfrom}&guid={guid}&vkey={fvkey}&platform=2"
    playurl_app = f"{baseurl}{fn}?vkey={fvkey}" # 这里其实有这个就够了,其他没用
    # print(title,playurl_app)
    m3u8download(title=title,m3u8url=playurl_app)

if __name__ == '__main__':
    print('视频下载器 https://w.yangshipin.cn/video?type=0&vid=m000091l2hd')
    while True:
        url = input('输入下载网址:')
        try:
            get_signs(url)
        except:
            pass

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值