diff --git a/huya.py b/huya.py index 5e9b834..b62e310 100644 --- a/huya.py +++ b/huya.py @@ -1,5 +1,4 @@ # 获取虎牙直播的真实流媒体地址。 -# 虎牙"一起看"频道的直播间可能会卡顿,尝试将返回地址 tx.hls.huya.com 中的 tx 改为 bd、migu-bd。 import requests import re @@ -7,61 +6,52 @@ import base64 import urllib.parse import hashlib import time -import json + +def live(e): + i, b = e.split('?') + r = i.split('/') + s = re.sub(r'.(flv|m3u8)', '', r[-1]) + c = b.split('&', 3) + 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] + f = str(int(time.time() * 1e7)) + l = n['wsTime'] + t = '0' + h = '_'.join([p, t, s, f, l]) + m = hashlib.md5(h.encode('utf-8')).hexdigest() + y = c[-1] + url = "{}?wsSecret={}&wsTime={}&u={}&seqid={}&{}".format(i, m, l, t, f, y) + return url -class HuYa: - - def __init__(self, rid): - self.rid = rid - - def get_real_url(self): - try: - room_url = 'https://m.huya.com/' + str(self.rid) - header = { - 'Content-Type': 'application/x-www-form-urlencoded', - 'User-Agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 ' - '(KHTML, like Gecko) Chrome/75.0.3770.100 Mobile Safari/537.36 ' - } - response = requests.get(url=room_url, headers=header).text - info = json.loads(re.findall(r"", response)[0]) - if info == {'exceptionType': 0}: - raise Exception('房间不存在') - roomInfo = info["roomInfo"] - real_url = {} - - # not live - if roomInfo["eLiveStatus"] == 1: - raise Exception('未开播') - - # live - elif roomInfo["eLiveStatus"] == 2: - streamInfos = roomInfo["tLiveInfo"]["tLiveStreamInfo"]["vStreamInfo"]["value"] - for streamInfo in streamInfos: - real_url[streamInfo["sCdnType"].lower() + "_flv"] = streamInfo["sFlvUrl"] + "/" + streamInfo["sStreamName"] + "." + \ - streamInfo["sFlvUrlSuffix"] + "?" + streamInfo["sFlvAntiCode"] - real_url[streamInfo["sCdnType"].lower() + "_hls"] = streamInfo["sHlsUrl"] + "/" + streamInfo["sStreamName"] + "." + \ - streamInfo["sHlsUrlSuffix"] + "?" + streamInfo["sHlsAntiCode"] - - # replay - elif roomInfo["eLiveStatus"] == 3: - real_url["replay"] = roomInfo["tReplayInfo"]["tReplayVideoInfo"]["sUrl"] - else: - raise Exception('未知错误') - except Exception as e: - raise Exception(e) - return real_url - - -def get_real_url(rid): +def get_real_url(room_id): try: - hy = HuYa(rid) - return hy.get_real_url() - except Exception as e: - print('Exception:', e) - return False + room_url = 'https://m.huya.com/' + str(room_id) + header = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (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] + liveline = base64.b64decode(liveLineUrl).decode('utf-8') + if liveline: + if 'replay' in liveline: + return '直播录像:' + liveline + else: + liveline = live(liveline) + real_url = ("https:" + liveline).replace("hls", "flv").replace("m3u8", "flv") + else: + real_url = '未开播或直播间不存在' + except: + real_url = '未开播或直播间不存在' + return real_url -if __name__ == '__main__': - rid = input('输入虎牙直播房间号:\n') - print(get_real_url(rid)) \ No newline at end of file +rid = input('输入虎牙直播房间号:\n') +real_url = get_real_url(rid) +print('该直播间源地址为:') +print(real_url) \ No newline at end of file