|
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。
最近看到很多人问下载虎课网视频下载方法,就把之前的方法再发一下吧
原理
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
注意!本软件不再更新,在此只是分享加密解密思路,并且也已开源代码,一些软件使用方面的问题不要再问,就算是有问题我也不会再更新。
|
|