1
0
mirror of https://github.com/wbt5/real-url.git synced 2025-06-16 15:59:57 +08:00
zhibo-url/migu.py
2021-11-07 16:01:46 +08:00

116 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# @Time: 2021/11/6 10:51
# @Project: real-url
# @Author: wbt5
# @Blog: https://wbt5.com
import requests
from urllib import parse
class MiGu:
"""
获取咪咕体育直播的流媒体地址
直播列表:https://www.miguvideo.com/mgs/website/prd/sportMatchDetail.html
直播间地址形式:https://www.miguvideo.com/mgs/website/prd/sportLive.html?mgdbId=120000173758
mgdbId 120000173758即为房间号
"""
def __init__(self, rid, rate=3):
"""
Args:
rate:估计是清晰度默认rate=3是高清
rid:房间号,如 120000173758
"""
self.rid = rid
self.rate = rate
def get_real_url(self):
"""
先获取contId
Returns:
url
"""
headers = {
'appId': 'miguvideo',
'clientId': '',
'SDKCEId': '',
'terminalId': 'www',
'userId': '',
'userToken': '',
'X-UP-CLIENT-CHANNEL-ID': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/95.0.4638.69 Safari/537.36',
'Referer': 'https://www.miguvideo.com/',
}
url = 'https://app-sc.miguvideo.com/vms-match/v3/staticcache/basic/basic-data/{}'.format(self.rid)
with requests.Session() as session:
res = session.get(url, headers=headers).json()
try:
contid = res['body']['pId']
url = f'https://webapi.miguvideo.com/gateway/playurl/v3/play/playurl?contId={contid}&rateType={self.rate}'
res = session.get(url, headers=headers).json()
try:
playurl = res['body']['urlInfo']['url']
real_url = self.calcu(playurl)
return real_url
except KeyError:
return '未获取到url,可能参数错误!'
except KeyError:
return '未获取到contId'
@staticmethod
def calcu(pre_url):
"""
计算ddCalcu原始过程在pcPlayer.js的9432行到9460行。
这里直接用python代码还原其实可以简化。
Args:
pre_url:playurl请求返回的url用来拼接计算ddCalcu
Returns:
real_url:添加ddCalcu后的播放地址
"""
params = dict(parse.parse_qsl(pre_url.split('?')[-1]))
t = 'eeeeeeeee'
r = str(params['timestamp'])
n = str(params['ProgramID'])
a = params['Channel_ID']
o = params['puData']
# s = '2624'
# js里是遍历s这里直接写死
u = t[2] or 'e'
ll = r[6] or 't'
c = n[2] or "c"
f = a[len(a) - 4] or 'n'
d = o
h = []
for p in range(0, int(len(d) / 2)):
h.append(d[len(d) - p - 1])
if p < len(d) - p - 1:
h.append(o[p])
x = {
1: u,
2: ll,
3: c,
4: f
}
h.append(x[p]) if p in [1, 2, 3, 4] else ''
v = ''.join(h)
real_url = pre_url + '&ddCalcu=' + v
return real_url
def get_real_url(rid):
try:
mg = MiGu(rid)
return mg.get_real_url()
except Exception as e:
print('Exception', e)
return False
if __name__ == '__main__':
rr = input('请输入咪咕直播间号:\n')
print(get_real_url(rr))