Amnda 发表于 2021-5-15 21:23

虎课网视频批量下载实现

最近看到很多人问下载虎课网视频下载方法,就把之前的方法再发一下吧
原理
huke/虎课网视频分析.md at main · Nchujx/huke (github.com)
里面就是一个aescbc的key加密,key 和 iv 都在m3u8链接里面了

代码实现
核心代码:

[*]nilaoda 的下载器在2.9.1版版之后就默认适配了虎课网视频下载,直接输入m3u8链接即可,也不用输入key

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;

namespace N_m3u8DL_CLI
{
    //https://js.huke88.com/assets/revision/js/plugins/tcplayer/tcplayer.v4.1.min.js?v=930
    //https://js.huke88.com/assets/revision/js/plugins/tcplayer/libs/hls.min.0.13.2m.js?v=930
    class DecodeHuke88Key
    {
      private static string[] GetOverlayInfo(string url)
      {
            var enc = new Regex("eyJ\\w{100,}").Match(url).Value;
            var json = Encoding.UTF8.GetString(Convert.FromBase64String(enc));
            JObject jObject = JObject.Parse(json);
            var key = jObject["overlayKey"].ToString();
            var iv = jObject["overlayIv"].ToString();
            return new string[] { key, iv };
      }

      public static string DecodeKey(string url, byte[] data)
      {
            var info = GetOverlayInfo(url);
            var overlayKey = info;
            var overlayIv = info;
            var l = new List<byte>();
            var c = new List<byte>();
            for (int h = 0; h < 16; h++)
            {
                var f = overlayKey.Substring(2 * h, 2);
                var g = overlayIv.Substring(2 * h, 2);
                l.Add(Convert.ToByte(f, 16));
                c.Add(Convert.ToByte(g, 16));
            }

            var _lastCipherblock = c.ToArray();

            var t = new byte;
            var r = data;
            r = Decrypter.AES128Decrypt(data, l.ToArray(), Decrypter.HexStringToBytes("00000000000000000000000000000000"), CipherMode.CBC, PaddingMode.Zeros);

            for (var o = 0; o < 16; o++)
                t = (byte)(r ^ _lastCipherblock);

            var key = Convert.ToBase64String(t);

            return key;
      }
    }
}


N_m3u8DL-CLI/DecodeHuke88Key.cs at master · nilaoda/N_m3u8DL-CLI (github.com)

    2.python版
def getm3u8(app_id,tx_file_id,token):
    key = '0000000000000000'
    overlayKey = key.encode().hex()
    overlayIv = key.encode().hex()
    geturl = f'https://playvideo.qcloud.com/getplayinfo/v4/{app_id}/{tx_file_id}?psign={token}&overlayKey={overlayKey}&overlayIv={overlayIv}'
    response_get = requests.get(geturl).json()
    # 得到3个参数 drmToken title m3u8列表
    drmToken = response_get['media']['streamingInfo']['drmToken']
    title = response_get['media']['basicInfo']['name']
    playlisturl = response_get['media']['streamingInfo']['drmOutput']['url']

    headersurl = '/'.join(playlisturl.split('/')[:-1]) + '/'
    parms = playlisturl.split('/')[-1]
    playlisturl = headersurl + 'voddrm.token.' + drmToken + '.' + parms
    m3u8url = headersurl + requests.get(playlisturl).text.split('\n')[-2]

    # 得到 key
    m3u8text = requests.get(m3u8url).text
    keyurl = re.findall('(?<=METHOD=AES-128,URI=").+?(?=")', m3u8text)
    # print(keyurl)
    encryptkey = requests.get(keyurl).content
    cryptor = AES.new(key=key.encode(), mode=AES.MODE_CBC, iv=key.encode())

    decryptkey = cryptor.decrypt(encryptkey)
         # base64编码的解密key
    decryptkey = base64.b64encode(decryptkey).decode()

    print(title, m3u8url,decryptkey)




软件成品
https://github.com/Nchujx/huke/releases

注意!本软件不再更新,在此只是分享加密解密思路,并且也已开源代码,一些软件使用方面的问题不要再问,就算是有问题我也不会再更新。

Jsn123 发表于 2021-5-15 21:23

谢谢分享

道是无情却有情 发表于 2021-5-15 21:36

谢谢大佬分享

1147490239 发表于 2021-5-15 21:37

谢谢大佬

wgandwd 发表于 2021-5-15 21:37

多谢楼主分享

笑东风丶 发表于 2021-5-15 22:09

感谢大佬分享,大牛因有你而更精彩。

2627625367 发表于 2021-5-15 23:23


感谢分享,谢谢提供分享

1353931640 发表于 2021-5-16 00:04

谢谢大牛

gzwwwww 发表于 2021-5-16 05:42

6666

大脑门 发表于 2021-5-16 08:55

谢谢@Thanks!
页: [1] 2
查看完整版本: 虎课网视频批量下载实现