From e34d184d1913254a5508b9acb67f190acf0d6e46 Mon Sep 17 00:00:00 2001 From: BoneAsh Date: Sat, 3 Jul 2021 13:17:17 +0800 Subject: [PATCH] Fix huya --- huya.py | 61 ++++++++------------------------------------------------- 1 file changed, 8 insertions(+), 53 deletions(-) diff --git a/huya.py b/huya.py index 9717900..6c1a6f8 100644 --- a/huya.py +++ b/huya.py @@ -7,6 +7,7 @@ import base64 import urllib.parse import hashlib import time +import json class HuYa: @@ -23,63 +24,17 @@ class HuYa: '(KHTML, like Gecko) Chrome/75.0.3770.100 Mobile Safari/537.36 ' } response = requests.get(url=room_url, headers=header).text - livelineurl = re.findall(r'"liveLineUrl":"([\s\S]*?)"', response)[0] - livelineurl = base64.b64decode(livelineurl).decode('utf-8') - if livelineurl: - if 'replay' in livelineurl: - real_url = { - 'replay': "https:" + livelineurl, - } - else: - stream_name = self.get_stream_name(livelineurl) - base_url = 'http://121.12.115.29/tx.hls.huya.com/src/' + stream_name - real_url = { - # 'hls': base_url + '.m3u8', - 'flv': base_url + '.flv', - # 'hls_2m': base_url + '.m3u8?ratio=2000', - 'flv_2m': base_url + '.flv?ratio=2000' - } - else: + streamInfo = json.loads(re.findall(r"", response)[0])["roomInfo"]["tLiveInfo"]["tLiveStreamInfo"]["vStreamInfo"]["value"] + if streamInfo == []: raise Exception('未开播或直播间不存在') + real_url = {} + for info in streamInfo: + real_url[info["sCdnType"].lower() + "_flv"] = info["sFlvUrl"] + "/" + info["sStreamName"] + "." + info["sFlvUrlSuffix"] + "?" + info["sFlvAntiCode"] + real_url[info["sCdnType"].lower() + "_hls"] = info["sHlsUrl"] + "/" + info["sStreamName"] + "." + info["sHlsUrlSuffix"] + "?" + info["sHlsAntiCode"] except Exception as e: raise Exception('未开播或直播间不存在') return real_url - @staticmethod - def get_stream_name(e): - i, b = e.split('?') - r = i.split('/') - s = re.sub(r'.(flv|m3u8)', '', r[-1]) - return s - - @staticmethod - def live(e): - i, b = e.split('?') - r = i.split('/') - s = re.sub(r'.(flv|m3u8)', '', r[-1]) - c = b.split('&') - c = [i for i in c if i != ''] - n = {i.split('=')[0]: i.split('=')[1] for i in c} - fm = urllib.parse.unquote(n['fm']) - u = base64.b64decode(fm).decode('utf-8') - p = u.split('_')[0] - seqid = str(int(time.time() * 1e7)) - ctype = n['ctype'] - t = n['t'] - mf = hashlib.md5((seqid + '|' + ctype + '|' + t).encode('utf-8')).hexdigest() - ll = n['wsTime'] - ratio = n.get('ratio') - if ratio is None: - ratio = '' - uid = '1279523789849' - h = '_'.join([p, uid, s, mf, ll]) - m = hashlib.md5(h.encode('utf-8')).hexdigest() - txyp = n['txyp'] - fs = n['fs'] - url = "{}?wsSecret={}&wsTime={}&uuid=&uid={}&seqid={}&ratio={}&txyp={}&fs={}&ctype={}&ver=1&t={}".format( - i, m, ll, uid, seqid, ratio, txyp, fs, ctype, t) - return url - def get_real_url(rid): try: @@ -92,4 +47,4 @@ def get_real_url(rid): if __name__ == '__main__': rid = input('输入虎牙直播房间号:\n') - print(get_real_url(rid)) + print(get_real_url(rid)) \ No newline at end of file