1
0
mirror of https://github.com/wbt5/real-url.git synced 2025-12-16 23:10:29 +08:00
zhibo-url/douyu.py
2021-06-07 15:00:50 +08:00

117 lines
4.1 KiB
Python
Raw 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.

# 获取斗鱼直播间的真实流媒体地址,默认最高画质。
import hashlib
import re
import time
import json
import execjs
import requests
class DouYu:
def __init__(self, rid):
# 房间号通常为1~7位纯数字浏览器地址栏中看到的房间号不一定是真实rid.
self.did = '10000000000000000000000000001501'
self.t10 = str(int(time.time()))
self.t13 = str(int((time.time() * 1000)))
self.s = requests.Session()
self.res = self.s.get('https://m.douyu.com/' + str(rid)).text
result = re.search(r'rid":(\d{1,7}),"vipId', self.res)
if result:
self.rid = result.group(1)
else:
raise Exception('房间号错误')
def set_rate(self, rate):
self.live_rate = rate
@staticmethod
def md5(data):
return hashlib.md5(data.encode('utf-8')).hexdigest()
def get_pre(self):
url = 'https://playweb.douyucdn.cn/lapi/live/hlsH5Preview/' + self.rid
data = {
'rid': self.rid,
'did': self.did
}
auth = DouYu.md5(self.rid + self.t13)
headers = {
'rid': self.rid,
'time': self.t13,
'auth': auth
}
res = self.s.post(url, headers=headers, data=data).json()
if 0 != res['error']:
print('error at url:{}\nresponse:{}'.format(url, res))
return None
return data['rtmp_url'] + '/' + data['rtmp_live']
def get_js(self):
result = re.search(r'(function ub98484234.*)\s(var.*)', self.res).group()
func_ub9 = re.sub(r'eval.*;}', 'strc;}', result)
js = execjs.compile(func_ub9)
res = js.call('ub98484234')
v = re.search(r'v=(\d+)', res).group(1)
rb = DouYu.md5(self.rid + self.did + self.t10 + v)
func_sign = re.sub(r'return rt;}\);?', 'return rt;}', res)
func_sign = func_sign.replace('(function (', 'function sign(')
func_sign = func_sign.replace('CryptoJS.MD5(cb).toString()', '"' + rb + '"')
js = execjs.compile(func_sign)
params = js.call('sign', self.rid, self.did, self.t10)
# params += '&ver=219032101&rid={}&rate=-1'.format(self.rid)
params += '&ver=219032101&rid={}&rate={}'.format(self.rid, self.live_rate)
url = 'https://m.douyu.com/api/room/ratestream'
res = self.s.post(url, params=params).json()['data']
return res['url']
def get_pc_js(self, cdn='ws-h5'):
"""
通过PC网页端的接口获取完整直播源。
:param cdn: 主线路ws-h5、备用线路tct-h5
:param rate: 1流畅2高清3超清4蓝光4M0蓝光8M或10M
:return: JSON格式
"""
res = self.s.get('https://www.douyu.com/' + str(self.rid)).text
result = re.search(r'(vdwdae325w_64we[\s\S]*function ub98484234[\s\S]*?)function', res).group(1)
func_ub9 = re.sub(r'eval.*?;}', 'strc;}', result)
js = execjs.compile(func_ub9)
res = js.call('ub98484234')
v = re.search(r'v=(\d+)', res).group(1)
rb = DouYu.md5(self.rid + self.did + self.t10 + v)
func_sign = re.sub(r'return rt;}\);?', 'return rt;}', res)
func_sign = func_sign.replace('(function (', 'function sign(')
func_sign = func_sign.replace('CryptoJS.MD5(cb).toString()', '"' + rb + '"')
js = execjs.compile(func_sign)
params = js.call('sign', self.rid, self.did, self.t10)
params += '&cdn={}&rate={}'.format(cdn, self.live_rate)
url = 'https://www.douyu.com/lapi/live/getH5Play/{}'.format(self.rid)
res = self.s.post(url, params=params).json()['data']
return res['rtmp_url'] + '/' + res['rtmp_live']
def get_real_url(self):
ret = []
ret.append(self.get_pre())
ret.append(self.get_js())
ret.append(self.get_pc_js())
return ret
if __name__ == '__main__':
r = input('输入斗鱼直播间号:\n')
s = DouYu(r)
r = input('输入画质(1流畅2高清3超清4蓝光4M0蓝光8M或10M)\n')
s.set_rate(r)
print(s.get_real_url())