mirror of
https://github.com/wbt5/real-url.git
synced 2025-12-16 23:10:29 +08:00
96 lines
3.2 KiB
Python
96 lines
3.2 KiB
Python
# 获取虎牙直播的真实流媒体地址。
|
||
# 虎牙"一起看"频道的直播间可能会卡顿,尝试将返回地址 tx.hls.huya.com 中的 tx 改为 bd、migu-bd。
|
||
|
||
import requests
|
||
import re
|
||
import base64
|
||
import urllib.parse
|
||
import hashlib
|
||
import time
|
||
|
||
|
||
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
|
||
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.15/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:
|
||
raise Exception('未开播或直播间不存在')
|
||
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:
|
||
hy = HuYa(rid)
|
||
return hy.get_real_url()
|
||
except Exception as e:
|
||
print('Exception:', e)
|
||
return False
|
||
|
||
|
||
if __name__ == '__main__':
|
||
rid = input('输入虎牙直播房间号:\n')
|
||
print(get_real_url(rid))
|