diff --git a/douyu.py b/douyu.py index 8942b1d..272dda6 100644 --- a/douyu.py +++ b/douyu.py @@ -1,10 +1,10 @@ # 获取斗鱼直播间的真实流媒体地址,默认最高画质。 - -import requests -import re -import execjs -import time import hashlib +import re +import time + +import execjs +import requests class DouYu: @@ -72,29 +72,49 @@ class DouYu: return key + def get_pc_js(self, cdn='ws-h5', rate=0): + """ + 通过PC网页端的接口获取完整直播源。 + :param cdn: 主线路ws-h5、备用线路tct-h5 + :param rate: 1流畅;2高清;3超清;4蓝光4M;0蓝光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, rate) + url = 'https://www.douyu.com/lapi/live/getH5Play/{}'.format(self.rid) + res = self.s.post(url, params=params).json() + + return res + def get_real_url(self): error, key = self.get_pre() if error == 0: - raise Exception('未知错误') + pass elif error == 102: raise Exception('房间不存在') elif error == 104: raise Exception('房间未开播') else: key = self.get_js() - return "http://tx2play1.douyucdn.cn/live/{}.flv?uuid=".format(key) -def get_real_url(rid): - try: - dy = DouYu(rid) - return dy.get_real_url() - except Exception as e: - print('Exception:', e) - return False - - if __name__ == '__main__': r = input('输入斗鱼直播间号:\n') - print(get_real_url(r)) + s = DouYu(r) + print(s.get_real_url())