找回密码
  注册[Register]
查看: 622|回复: 11

[python] 虎课网视频批量下载实现

[复制链接]
发表于 2021-5-15 21:23 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

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

代码实现

核心代码:
  • nilaoda 的下载器在2.9.1版版之后就默认适配了虎课网视频下载,直接输入m3u8链接即可,也不用输入key

[Python] 纯文本查看 复制代码
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[0];
            var overlayIv = info[1];
            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[data.Length];
            var r = data;
            r = Decrypter.AES128Decrypt(data, l.ToArray(), Decrypter.HexStringToBytes("00000000000000000000000000000000"), CipherMode.CBC, PaddingMode.Zeros);
 
            for (var o = 0; o < 16; o++)
                t[o] = (byte)(r[o] ^ _lastCipherblock[o]);
 
            var key = Convert.ToBase64String(t);
 
            return key;
        }
    }
}



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

    2.python版
[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'][0]['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)[0]
    # 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

注意!本软件不再更新,在此只是分享加密解密思路,并且也已开源代码,一些软件使用方面的问题不要再问,就算是有问题我也不会再更新。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2021-5-15 21:23 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-15 21:36 | 显示全部楼层
谢谢大佬分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-15 21:37 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-15 21:37 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-15 22:09 来自手机 | 显示全部楼层
感谢大佬分享,大牛因有你而更精彩。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-15 23:23 | 显示全部楼层

感谢分享,谢谢提供分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-16 00:04 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-16 05:42 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-5-16 08:55 | 显示全部楼层
谢谢@Thanks!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-5-13 18:20 , Processed in 0.041346 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表