diff --git a/173.py b/173.py index 8eb7efb..7e733fa 100644 --- a/173.py +++ b/173.py @@ -1,22 +1,38 @@ # 艺气山直播:http://www.173.com/room/category?categoryId=11 + import requests -def _173(rid): - params = 'roomId={}&format=m3u8'.format(rid) - with requests.Session() as s: - res = s.post('http://www.173.com/room/getVieoUrl', params=params).json() - data = res['data'] - if data: - status = data['status'] - if status == 2: - return data['url'] +class YQS: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + params = 'roomId={}&format=m3u8'.format(self.rid) + with requests.Session() as s: + res = s.post('http://www.173.com/room/getVieoUrl', params=params).json() + data = res['data'] + if data: + status = data['status'] + if status == 2: + return data['url'] + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + yqs = YQS(rid) + return yqs.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入艺气山直播房间号:\n') - print(_173(r)) + print(get_real_url(r)) + diff --git a/17live.py b/17live.py index 01ad7c3..d8217fa 100644 --- a/17live.py +++ b/17live.py @@ -4,18 +4,31 @@ import requests +class Live17: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response = requests.get(url='https://api-dsa.17app.co/api/v1/lives/' + self.rid).json() + real_url_default = response.get('rtmpUrls')[0].get('url') + real_url_modify = real_url_default.replace('global-pull-rtmp.17app.co', 'china-pull-rtmp-17.tigafocus.com') + real_url = [real_url_modify, real_url_default] + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response = requests.get(url='https://api-dsa.17app.co/api/v1/lives/' + rid).json() - real_url_default = response.get('rtmpUrls')[0].get('url') - real_url_modify = real_url_default.replace('global-pull-rtmp.17app.co', 'china-pull-rtmp-17.tigafocus.com') - real_url = [real_url_modify, real_url_default] - except: - real_url = '该直播间不存在或未开播' - return real_url + live17 = Live17(rid) + return live17.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入17直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入17直播房间号:\n') + print(get_real_url(r)) diff --git a/2cq.py b/2cq.py index 1fadc1b..b12b574 100644 --- a/2cq.py +++ b/2cq.py @@ -1,22 +1,38 @@ # 棉花糖直播:https://www.2cq.com/rank + import requests -def mht(rid): - with requests.Session() as s: - res = s.get('https://www.2cq.com/proxy/room/room/info?roomId={}&appId=1004'.format(rid)) - res = res.json() - if res['status'] == 1: - result = res['result'] - if result['liveState'] == 1: - real_url = result['pullUrl'] - return real_url +class MHT: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://www.2cq.com/proxy/room/room/info?roomId={}&appId=1004'.format(self.rid)) + res = res.json() + if res['status'] == 1: + result = res['result'] + if result['liveState'] == 1: + real_url = result['pullUrl'] + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间可能不存在') + raise Exception('直播间可能不存在') + + +def get_real_url(rid): + try: + mht = MHT(rid) + return mht.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入棉花糖直播房间号:\n') - print(mht(r)) + print(get_real_url(r)) + diff --git a/51lm.py b/51lm.py index 661e007..8946bdf 100644 --- a/51lm.py +++ b/51lm.py @@ -1,43 +1,58 @@ # 羚萌直播:https://live.51lm.tv/programs/Hot + from urllib.parse import urlencode import requests import time import hashlib -def lm(rid): - roominfo = {'programId': rid} +class LM: - def g(d): - return hashlib.md5((d + '#' + urlencode(roominfo) + '#Ogvbm2ZiKE').encode('utf-8')).hexdigest() + def __init__(self, rid): + self.rid = rid - lminfo = { - 'h': int(time.time()) * 1000, - 'i': -246397986, - 'o': 'iphone', - 's': 'G_c17a64eff3f144a1a48d9f02e8d981c2', - 't': 'H', - 'v': '4.20.43', - 'w': 'a710244508d3cc14f50d24e9fecc496a' - } - u = g(urlencode(lminfo)) - lminfo = 'G=' + u + '&' + urlencode(lminfo) - with requests.Session() as s: - res = s.post('https://www.51lm.tv/live/room/info/basic', json=roominfo, headers={'lminfo': lminfo}).json() - code = res['code'] - if code == 200: - status = res['data']['isLiving'] - if status == 'True': - real_url = res['data']['playUrl'] - return real_url - else: - raise Exception('未开播') - elif code == -1: - raise Exception('输入错误') - elif code == 1201: - raise Exception('直播间不存在') + def get_real_url(self): + roominfo = {'programId': self.rid} + + def g(d): + return hashlib.md5((d + '#' + urlencode(roominfo) + '#Ogvbm2ZiKE').encode('utf-8')).hexdigest() + + lminfo = { + 'h': int(time.time()) * 1000, + 'i': -246397986, + 'o': 'iphone', + 's': 'G_c17a64eff3f144a1a48d9f02e8d981c2', + 't': 'H', + 'v': '4.20.43', + 'w': 'a710244508d3cc14f50d24e9fecc496a' + } + u = g(urlencode(lminfo)) + lminfo = 'G=' + u + '&' + urlencode(lminfo) + with requests.Session() as s: + res = s.post('https://www.51lm.tv/live/room/info/basic', json=roominfo, headers={'lminfo': lminfo}).json() + code = res['code'] + if code == 200: + status = res['data']['isLiving'] + if status == 'True': + real_url = res['data']['playUrl'] + return real_url + else: + raise Exception('未开播') + elif code == -1: + raise Exception('输入错误') + elif code == 1201: + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + lm = LM(rid) + return lm.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入羚萌直播房间号:\n') - print(lm(r)) + print(get_real_url(r)) diff --git a/95xiu.py b/95xiu.py index 376d186..2108a5b 100644 --- a/95xiu.py +++ b/95xiu.py @@ -1,23 +1,39 @@ # 95秀:http://www.95.cn/ + import requests import re -def jwxiu(rid): - with requests.Session() as s: - res = s.get('http://www.95.cn/{}.html'.format(rid)).text +class JWXiu: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('http://www.95.cn/{}.html'.format(self.rid)).text + try: + uid = re.search(r'"uid":(\d+),', res).group(1) + status = re.search(r'"is_offline":"(\d)"', res).group(1) + except AttributeError: + raise Exception('没有找到直播间') + if status == '0': + real_url = 'http://play.95xiu.com/app/{}.flv'.format(uid) + return real_url + else: + raise Exception('未开播') + + +def get_real_url(rid): try: - uid = re.search(r'"uid":(\d+),', res).group(1) - status = re.search(r'"is_offline":"(\d)"', res).group(1) - except AttributeError: - raise Exception('没有找到直播间') - if status == '0': - real_url = 'http://play.95xiu.com/app/{}.flv'.format(uid) - return real_url - else: - raise Exception('未开播') + jwx = JWXiu(rid) + return jwx.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入95秀房间号:\n') - print(jwxiu(r)) + print(get_real_url(r)) + diff --git a/9xiu.py b/9xiu.py index bbfb924..49b5c0c 100644 --- a/9xiu.py +++ b/9xiu.py @@ -1,26 +1,41 @@ # 九秀直播:https://www.9xiu.com/other/classify?tag=all&index=all + import requests -def j_xiu(rid): - with requests.Session() as s: - url = 'https://h5.9xiu.com/room/live/enterRoom?rid=' + str(rid) - headers = { - 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) ' - 'AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' - } - res = s.get(url, headers=headers).json() - if res['code'] == 200: - status = res['data']['status'] - if status == 0: - raise Exception('未开播') - elif status == 1: - live_url = res['data']['live_url'] - return live_url - else: - raise Exception('直播间可能不存在') +class JXiu: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + url = 'https://h5.9xiu.com/room/live/enterRoom?rid=' + str( self.rid) + headers = { + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) ' + 'AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' + } + res = s.get(url, headers=headers).json() + if res['code'] == 200: + status = res['data']['status'] + if status == 0: + raise Exception('未开播') + elif status == 1: + live_url = res['data']['live_url'] + return live_url + else: + raise Exception('直播间可能不存在') + + +def get_real_url(rid): + try: + jx = JXiu(rid) + return jx.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入九秀直播房间号:\n') - print(j_xiu(r)) + print(get_real_url(r)) diff --git a/acfun.py b/acfun.py index c00570f..f6253a1 100644 --- a/acfun.py +++ b/acfun.py @@ -1,45 +1,61 @@ # AcFun直播:https://live.acfun.cn/ # 默认最高画质 + import requests import json -def acfun(rid): - headers = { - 'content-type': 'application/x-www-form-urlencoded', - 'cookie': '_did=H5_', - 'referer': 'https://m.acfun.cn/' - } - url = 'https://id.app.acfun.cn/rest/app/visitor/login' - data = 'sid=acfun.api.visitor' - with requests.Session() as s: - res = s.post(url, data=data, headers=headers).json() - userid = res['userId'] - visitor_st = res['acfun.api.visitor_st'] +class AcFun: - url = 'https://api.kuaishouzt.com/rest/zt/live/web/startPlay' - params = { - 'subBiz': 'mainApp', - 'kpn': 'ACFUN_APP', - 'kpf': 'PC_WEB', - 'userId': userid, - 'did': 'H5_', - 'acfun.api.visitor_st': visitor_st - } - data = 'authorId={}&pullStreamType=FLV'.format(rid) - res = s.post(url, params=params, data=data, headers=headers).json() - if res['result'] == 1: - data = res['data'] - videoplayres = json.loads(data['videoPlayRes']) - liveadaptivemanifest, = videoplayres['liveAdaptiveManifest'] - adaptationset = liveadaptivemanifest['adaptationSet'] - representation = adaptationset['representation'][-1] - real_url = representation['url'] - return real_url - else: - raise Exception('直播已关闭') + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + headers = { + 'content-type': 'application/x-www-form-urlencoded', + 'cookie': '_did=H5_', + 'referer': 'https://m.acfun.cn/' + } + url = 'https://id.app.acfun.cn/rest/app/visitor/login' + data = 'sid=acfun.api.visitor' + with requests.Session() as s: + res = s.post(url, data=data, headers=headers).json() + userid = res['userId'] + visitor_st = res['acfun.api.visitor_st'] + + url = 'https://api.kuaishouzt.com/rest/zt/live/web/startPlay' + params = { + 'subBiz': 'mainApp', + 'kpn': 'ACFUN_APP', + 'kpf': 'PC_WEB', + 'userId': userid, + 'did': 'H5_', + 'acfun.api.visitor_st': visitor_st + } + data = 'authorId={}&pullStreamType=FLV'.format(self.rid) + res = s.post(url, params=params, data=data, headers=headers).json() + if res['result'] == 1: + data = res['data'] + videoplayres = json.loads(data['videoPlayRes']) + liveadaptivemanifest, = videoplayres['liveAdaptiveManifest'] + adaptationset = liveadaptivemanifest['adaptationSet'] + representation = adaptationset['representation'][-1] + real_url = representation['url'] + return real_url + else: + raise Exception('直播已关闭') + + +def get_real_url(rid): + try: + acfun = AcFun(rid) + return acfun.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入AcFun直播间号:\n') - print(acfun(r)) + r = input('请输入AcFun直播房间号:\n') + print(get_real_url(r)) + diff --git a/bilibili.py b/bilibili.py index 0541ad4..06723af 100644 --- a/bilibili.py +++ b/bilibili.py @@ -6,45 +6,59 @@ import requests -def bilibili(rid): - # 先获取直播状态和真实房间号 - r_url = 'https://api.live.bilibili.com/room/v1/Room/room_init?id={}'.format(rid) - with requests.Session() as s: - res = s.get(r_url).json() - code = res['code'] - if code == 0: - live_status = res['data']['live_status'] - if live_status == 1: - room_id = res['data']['room_id'] +class BiliBili: - def u(pf): - f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl' - params = { - 'cid': room_id, - 'qn': 10000, - 'platform': pf, - 'https_url_req': 1, - 'ptype': 16 + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + # 先获取直播状态和真实房间号 + r_url = 'https://api.live.bilibili.com/room/v1/Room/room_init?id={}'.format(self.rid) + with requests.Session() as s: + res = s.get(r_url).json() + code = res['code'] + if code == 0: + live_status = res['data']['live_status'] + if live_status == 1: + room_id = res['data']['room_id'] + + def u(pf): + f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl' + params = { + 'cid': room_id, + 'qn': 10000, + 'platform': pf, + 'https_url_req': 1, + 'ptype': 16 + } + resp = s.get(f_url, params=params).json() + try: + durl = resp['data']['durl'] + real_url = durl[-1]['url'] + return real_url + except KeyError or IndexError: + raise Exception('获取失败') + + return { + 'flv_url': u('web'), + 'hls_url': u('h5') } - resp = s.get(f_url, params=params).json() - try: - durl = resp['data']['durl'] - real_url = durl[-1]['url'] - return real_url - except KeyError or IndexError: - raise Exception('获取失败') - - return { - 'flv_url': u('web'), - 'hls_url': u('h5') - } + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('房间不存在') + raise Exception('房间不存在') + + +def get_real_url(rid): + try: + bilibili = BiliBili(rid) + return bilibili.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入bilibili直播间号:\n') - print(bilibili(r)) + r = input('请输入bilibili直播房间号:\n') + print(get_real_url(r)) diff --git a/cc.py b/cc.py index 5ecceae..485666a 100644 --- a/cc.py +++ b/cc.py @@ -1,26 +1,40 @@ # 获取网易CC的真实流媒体地址。 # 默认为最高画质 - import requests -def get_real_url(rid): - room_url = 'https://api.cc.163.com/v1/activitylives/anchor/lives?anchor_ccid=' + str(rid) - response = requests.get(url=room_url).json() - data = response.get('data', 0) - if data: - channel_id = data.get('{}'.format(rid)).get('channel_id', 0) - if channel_id: - response = requests.get('https://cc.163.com/live/channel/?channelids=' + str(channel_id)).json() - real_url = response.get('data')[0].get('sharefile') +class CC: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + room_url = 'https://api.cc.163.com/v1/activitylives/anchor/lives?anchor_ccid=' + str(self.rid) + response = requests.get(url=room_url).json() + data = response.get('data', 0) + if data: + channel_id = data.get('{}'.format(self.rid)).get('channel_id', 0) + if channel_id: + response = requests.get('https://cc.163.com/live/channel/?channelids=' + str(channel_id)).json() + real_url = response.get('data')[0].get('sharefile') + else: + raise Exception('直播间不存在') else: - real_url = '直播间不存在' - else: - real_url = '输入错误' - return real_url + raise Exception('输入错误') + return real_url -rid = input('请输入网易CC直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:\n' + real_url) +def get_real_url(rid): + try: + cc = CC(rid) + return cc.get_real_url() + except Exception as e: + print('Exception:', e) + return False + + +if __name__ == '__main__': + r = input('请输入网易CC直播房间号:\n') + print(get_real_url(r)) + diff --git a/chushou.py b/chushou.py index 9298d5d..61f87bf 100644 --- a/chushou.py +++ b/chushou.py @@ -1,25 +1,38 @@ # 获取触手直播的真实流媒体地址。 - import requests +class ChuShou: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + room_url = 'https://chushou.tv/h5player/video/get-play-url.htm?roomId={}&protocols=2&callback='.format(self.rid) + response = requests.get(url=room_url).json() + data = response.get('data')[0] + real_url = { + 'sdPlayUrl': data.get('sdPlayUrl', 0), + 'hdPlayUrl': data.get('hdPlayUrl', 0), + 'shdPlayUrl': data.get('shdPlayUrl', 0) + } + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - room_url = 'https://chushou.tv/h5player/video/get-play-url.htm?roomId={}&protocols=2&callback='.format(rid) - response = requests.get(url=room_url).json() - data = response.get('data')[0] - real_url = { - 'sdPlayUrl': data.get('sdPlayUrl', 0), - 'hdPlayUrl': data.get('hdPlayUrl', 0), - 'shdPlayUrl': data.get('shdPlayUrl', 0) - } - except: - real_url = '直播间不存在或未开播' - return real_url + cs = ChuShou(rid) + return cs.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入触手直播间数字ID:\n') -real_url = get_real_url(rid) -print('该直播源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入触手直播房间号:\n') + print(get_real_url(r)) + diff --git a/douyin.py b/douyin.py index 175d8e6..0414ebd 100644 --- a/douyin.py +++ b/douyin.py @@ -2,28 +2,40 @@ # 如果知道该直播间如“6779127643792280332”形式的room_id,则直接传入room_id。 # 如果不知道room_id,可以使用手机上打开直播间后,选择“分享--复制链接”,传入如“https://v.douyin.com/qyRqMp/”形式的分享链接。 - import requests import re +class DouYin: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + if 'v.douyin.com' in self.rid: + room_id = re.findall(r'(\d{19})', requests.get(url=self.rid).url)[0] + else: + room_id = self.rid + room_url = 'https://webcast-hl.amemv.com/webcast/room/reflow/info/?room_id={}&live_id=1'.format(room_id) + response = requests.get(url=room_url).json() + hls_pull_url = response.get('data').get('room').get('stream_url').get('hls_pull_url') + rtmp_pull_url = response.get('data').get('room').get('stream_url').get('rtmp_pull_url') + real_url = [rtmp_pull_url, hls_pull_url] + except: + raise Exception('直播间不存在或未开播或参数错误') + return real_url + + def get_real_url(rid): try: - if 'v.douyin.com' in rid: - room_id = re.findall(r'(\d{19})', requests.get(url=rid).url)[0] - else: - room_id = rid - room_url = 'https://webcast-hl.amemv.com/webcast/room/reflow/info/?room_id={}&live_id=1'.format(room_id) - response = requests.get(url=room_url).json() - hls_pull_url = response.get('data').get('room').get('stream_url').get('hls_pull_url') - rtmp_pull_url = response.get('data').get('room').get('stream_url').get('rtmp_pull_url') - real_url = [rtmp_pull_url, hls_pull_url] - except: - real_url = '直播间不存在或未开播或参数错误' - return real_url + dy = DouYin(rid) + return dy.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入抖音直播间room_id或分享链接:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入抖音直播间room_id或分享链接:\n') + print(get_real_url(r)) diff --git a/douyu.py b/douyu.py index 0b840ae..8942b1d 100644 --- a/douyu.py +++ b/douyu.py @@ -1,4 +1,5 @@ # 获取斗鱼直播间的真实流媒体地址,默认最高画质。 + import requests import re import execjs @@ -74,7 +75,7 @@ class DouYu: def get_real_url(self): error, key = self.get_pre() if error == 0: - pass + raise Exception('未知错误') elif error == 102: raise Exception('房间不存在') elif error == 104: @@ -85,7 +86,15 @@ class DouYu: 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') - s = DouYu(r) - print(s.get_real_url()) + print(get_real_url(r)) diff --git a/egame.py b/egame.py index 2b524e0..b1e8a52 100644 --- a/egame.py +++ b/egame.py @@ -1,42 +1,55 @@ # 获取企鹅电竞的真实流媒体地址。 # 默认画质为超清 - import requests -import json import re -def get_real_url(rid): - room_url = 'https://share.egame.qq.com/cgi-bin/pgg_async_fcgi' - post_data = { - 'param': '''{"0":{"module":"pgg_live_read_svr","method":"get_live_and_profile_info","param":{"anchor_id":''' + str(rid) + ''',"layout_id":"hot","index":1,"other_uid":0}}}''' - } - try: - response = requests.post(url=room_url, data=post_data).json() - data = response.get('data', 0) - if data: - video_info = data.get('0').get( - 'retBody').get('data').get('video_info') - pid = video_info.get('pid', 0) - if pid: - is_live = data.get('0').get( - 'retBody').get('data').get('profile_info').get('is_live', 0) - if is_live: - play_url = video_info.get('stream_infos')[ - 0].get('play_url') - real_url = re.findall(r'([\w\W]+?)&uid=', play_url)[0] +class EGame: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + room_url = 'https://share.egame.qq.com/cgi-bin/pgg_async_fcgi' + post_data = { + 'param': '''{"0":{"module":"pgg_live_read_svr","method":"get_live_and_profile_info","param":{"anchor_id":''' + + str(self.rid) + ''',"layout_id":"hot","index":1,"other_uid":0}}}''' + } + try: + response = requests.post(url=room_url, data=post_data).json() + data = response.get('data', 0) + if data: + video_info = data.get('0').get( + 'retBody').get('data').get('video_info') + pid = video_info.get('pid', 0) + if pid: + is_live = data.get('0').get( + 'retBody').get('data').get('profile_info').get('is_live', 0) + if is_live: + play_url = video_info.get('stream_infos')[ + 0].get('play_url') + real_url = re.findall(r'([\w\W]+?)&uid=', play_url)[0] + else: + raise Exception('直播间未开播') else: - real_url = '直播间未开播' + raise Exception('直播间未启用') else: - real_url = '直播间未启用' - else: - real_url = '直播间不存在' - except: - real_url = '数据请求错误' - return real_url + raise Exception('直播间不存在') + except: + raise Exception('数据请求错误') + return real_url -rid = input('请输入企鹅电竞房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:\n' + real_url) +def get_real_url(rid): + try: + eg = EGame(rid) + return eg.get_real_url() + except Exception as e: + print('Exception:', e) + return False + + +if __name__ == '__main__': + r = input('请输入企鹅电竞房间号:\n') + print(get_real_url(r)) diff --git a/fengbolive.py b/fengbolive.py index 3dd499c..9117aed 100644 --- a/fengbolive.py +++ b/fengbolive.py @@ -1,5 +1,6 @@ # 新浪疯播直播:http://www.fengbolive.com/list?type=hot # 链接样式:http://www.fengbolive.com/live/88057518 + from Crypto.Cipher import AES from urllib.parse import unquote import base64 @@ -7,32 +8,46 @@ import json import requests -def fengbo(rid): - with requests.Session() as s: - res = s.get('https://external.fengbolive.com/cgi-bin/get_anchor_info_proxy.fcgi?anchorid=' + str(rid)).json() - if res['ret'] == 1: - info = res['info'] - info = unquote(info, 'utf-8') +class FengBo: - # 开始AES解密 - def pad(t): - return t + (16 - len(t) % 16) * b'\x00' + def __init__(self, rid): + self.rid = rid - key = iv = 'abcdefghqwertyui'.encode('utf8') - cipher = AES.new(key, AES.MODE_CBC, iv) - info = info.encode('utf8') - info = pad(info) - result = cipher.decrypt(base64.decodebytes(info)).rstrip(b'\0') + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://external.fengbolive.com/cgi-bin/get_anchor_info_proxy.fcgi?anchorid=' + str(self.rid)).json() + if res['ret'] == 1: + info = res['info'] + info = unquote(info, 'utf-8') - result = json.loads(result.decode('utf-8')) - url = result['url'] - url = url.replace('hdl', 'hls') - url = url.replace('.flv', '/playlist.m3u8') - return url - else: - raise Exception('房间号错误') + # 开始AES解密 + def pad(t): + return t + (16 - len(t) % 16) * b'\x00' + + key = iv = 'abcdefghqwertyui'.encode('utf8') + cipher = AES.new(key, AES.MODE_CBC, iv) + info = info.encode('utf8') + info = pad(info) + result = cipher.decrypt(base64.decodebytes(info)).rstrip(b'\0') + + result = json.loads(result.decode('utf-8')) + url = result['url'] + url = url.replace('hdl', 'hls') + url = url.replace('.flv', '/playlist.m3u8') + return url + else: + raise Exception('房间号错误') + + +def get_real_url(rid): + try: + fb = FengBo(rid) + return fb.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入疯播直播房间号:\n') - print(fengbo(r)) + print(get_real_url(r)) diff --git a/hongle.py b/hongle.py index ab27b72..9e19445 100644 --- a/hongle.py +++ b/hongle.py @@ -1,6 +1,7 @@ # 红人直播:https://www.hongle.tv/ # 该平台需登陆,下面代码中已集成一个账号的登陆方式; # 如登陆信息过期,可用自己的账号登陆后,查找浏览器Local Storage中的hrtk字段,替换代码中的accesstoken + from urllib.parse import urlencode from urllib.parse import unquote import requests @@ -9,66 +10,80 @@ import hashlib import json -def hongle(rid): - # 模拟登陆 - with requests.Session() as s: - pass +class HongLe: - tt = int(time.time() * 1000) - url = 'https://service.hongle.tv/v2/userw/login?_st1={}'.format(tt) - data = { - '_st1': tt, - 'geetest_challenge': '7f4f6fd6257799c0bcac1f38c21c042dl0', - 'geetest_seccode': 'd1163915f4cfd6c998014c4ca8899c9d|jordan', - 'geetest_validate': 'd1163915f4cfd6c998014c4ca8899c9d', - 'name': '16530801176', - 'password': 'QTXz9/Sp40BbMHwVtcb7AQ==', - } + def __init__(self, rid): + self.rid = rid - data1 = urlencode(data) + 'yuj1ah5o' - _ajaxdata1 = hashlib.md5(data1.encode('utf-8')).hexdigest() - data['_ajaxData1'] = _ajaxdata1 - del data['_st1'] - data = json.dumps(data, separators=(',', ':')) - headers = {'Content-Type': 'application/x-www-form-urlencoded'} - res = s.post(url, data=data, headers=headers).json() - if res['status']['statuscode'] == '0': - sessionid = res['data']['sessionid'] - else: - raise Exception('登陆信息过期') + def get_real_url(self): + # 模拟登陆 + with requests.Session() as s: + pass - url = 'https://service.hongle.tv/v2/roomw/media' - accesstoken = sessionid - params = { - '_st1': tt, - 'accessToken': accesstoken, - 'of': 1, - 'showid': rid, - 'tku': 43112608, - } - data = urlencode(params) + 'yuj1ah5o' - _ajaxData1 = hashlib.md5(data.encode('utf-8')).hexdigest() - params['_ajaxData1'] = _ajaxData1 - params['accessToken'] = unquote(accesstoken) + tt = int(time.time() * 1000) + url = 'https://service.hongle.tv/v2/userw/login?_st1={}'.format(tt) + data = { + '_st1': tt, + 'geetest_challenge': '7f4f6fd6257799c0bcac1f38c21c042dl0', + 'geetest_seccode': 'd1163915f4cfd6c998014c4ca8899c9d|jordan', + 'geetest_validate': 'd1163915f4cfd6c998014c4ca8899c9d', + 'name': '16530801176', + 'password': 'QTXz9/Sp40BbMHwVtcb7AQ==', + } - res = s.get(url, params=params) - if res.status_code == 200: - res = res.json() - statuscode = res['status']['statuscode'] - if statuscode == '0': - if res['data']['live_status'] == '1': - real_url = res['data']['media_url_web'] - real_url = real_url.replace('http', 'https') - real_url = real_url.replace('__', '&') - return real_url - else: - raise Exception('未开播') + data1 = urlencode(data) + 'yuj1ah5o' + _ajaxdata1 = hashlib.md5(data1.encode('utf-8')).hexdigest() + data['_ajaxData1'] = _ajaxdata1 + del data['_st1'] + data = json.dumps(data, separators=(',', ':')) + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + res = s.post(url, data=data, headers=headers).json() + if res['status']['statuscode'] == '0': + sessionid = res['data']['sessionid'] else: - raise Exception('房间不存在') - else: - raise Exception('参数错误') + raise Exception('登陆信息过期') + + url = 'https://service.hongle.tv/v2/roomw/media' + accesstoken = sessionid + params = { + '_st1': tt, + 'accessToken': accesstoken, + 'of': 1, + 'showid': self.rid, + 'tku': 43112608, + } + data = urlencode(params) + 'yuj1ah5o' + _ajaxData1 = hashlib.md5(data.encode('utf-8')).hexdigest() + params['_ajaxData1'] = _ajaxData1 + params['accessToken'] = unquote(accesstoken) + + res = s.get(url, params=params) + if res.status_code == 200: + res = res.json() + statuscode = res['status']['statuscode'] + if statuscode == '0': + if res['data']['live_status'] == '1': + real_url = res['data']['media_url_web'] + real_url = real_url.replace('http', 'https') + real_url = real_url.replace('__', '&') + return real_url + else: + raise Exception('未开播') + else: + raise Exception('房间不存在') + else: + raise Exception('参数错误') + + +def get_real_url(rid): + try: + hl = HongLe(rid) + return hl.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入红人直播房间号:\n') - print(hongle(r)) + print(get_real_url(r)) diff --git a/huajiao.py b/huajiao.py index 8e0421a..e226793 100644 --- a/huajiao.py +++ b/huajiao.py @@ -1,21 +1,34 @@ # 获取花椒直播的真实流媒体地址。 - import requests import time +class HuaJiao: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + tt = str(time.time()) + try: + room_url = 'https://h.huajiao.com/api/getFeedInfo?sid={tt}&liveid={rid}'.format(tt=tt, rid=self.rid) + response = requests.get(url=room_url).json() + real_url = response.get('data').get('live').get('main') + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): - tt = str(time.time()) try: - room_url = 'https://h.huajiao.com/api/getFeedInfo?sid={tt}&liveid={rid}'.format(tt=tt, rid=rid) - response = requests.get(url=room_url).json() - real_url = response.get('data').get('live').get('main') - except: - real_url = '直播间不存在或未开播' - return real_url + hj = HuaJiao(rid) + return hj.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入花椒直播间号:\n') -real_url = get_real_url(rid) -print('该直播源地址为:\n' + real_url) +if __name__ == '__main__': + r = input('请输入花椒直播房间号:\n') + print(get_real_url(r)) diff --git a/huomao.py b/huomao.py index 87b7445..8577147 100644 --- a/huomao.py +++ b/huomao.py @@ -3,62 +3,74 @@ # 实际上使用http://live-lx-hdl.huomaotv.cn/live/qvCESZ?token=44a7f115f0af496e268bcbb7cdbb63b1,即可播放 # 链接中lx可替换cdn(lx,tx,ws,js,jd2等),媒体类型可为.flv或.m3u8,码率可为BL8M,BL4M,TD,BD,HD,SD - import requests import time import hashlib import re -def get_time(): - tt = str(int((time.time() * 1000))) - return tt +class HuoMao: + def __init__(self, rid): + self.rid = rid -def get_videoids(rid): - room_url = 'https://www.huomao.com/mobile/mob_live/' + str(rid) - response = requests.get(url=room_url).text - try: - videoids = re.findall(r'var stream = "([\w\W]+?)";', response)[0] - except: - videoids = 0 - return videoids + @staticmethod + def get_time(): + tt = str(int((time.time() * 1000))) + return tt + @staticmethod + def get_videoids(rid): + room_url = 'https://www.huomao.com/mobile/mob_live/' + str(rid) + response = requests.get(url=room_url).text + try: + videoids = re.findall(r'var stream = "([\w\W]+?)";', response)[0] + except: + videoids = 0 + return videoids -def get_token(videoids, time): - token = hashlib.md5((str(videoids) + 'huomaoh5room' + str(time) + - '6FE26D855E1AEAE090E243EB1AF73685').encode('utf-8')).hexdigest() - return token + @staticmethod + def get_token(videoids, time): + token = hashlib.md5((str(videoids) + 'huomaoh5room' + str(time) + + '6FE26D855E1AEAE090E243EB1AF73685').encode('utf-8')).hexdigest() + return token + + def get_real_url(self): + videoids = self.get_videoids(self.rid) + if videoids: + time = self.get_time() + token = self.get_token(videoids, time) + room_url = 'https://www.huomao.com/swf/live_data' + post_data = { + 'cdns': 1, + 'streamtype': 'live', + 'VideoIDS': videoids, + 'from': 'huomaoh5room', + 'time': time, + 'token': token + } + response = requests.post(url=room_url, data=post_data).json() + roomStatus = response.get('roomStatus', 0) + if roomStatus == '1': + real_url_flv = response.get('streamList')[-1].get('list')[0].get('url') + real_url_m3u8 = response.get('streamList')[-1].get('list_hls')[0].get('url') + real_url = [real_url_flv, real_url_m3u8.replace('_480', '')] + else: + raise Exception('直播间未开播') + else: + raise Exception('直播间不存在') + return real_url def get_real_url(rid): - videoids = get_videoids(rid) - if videoids: - time = get_time() - token = get_token(videoids, time) - room_url = 'https://www.huomao.com/swf/live_data' - post_data = { - 'cdns': 1, - 'streamtype': 'live', - 'VideoIDS': videoids, - 'from': 'huomaoh5room', - 'time': time, - 'token': token - } - response = requests.post(url=room_url, data=post_data).json() - roomStatus = response.get('roomStatus', 0) - if roomStatus == '1': - real_url_flv = response.get('streamList')[-1].get('list')[0].get('url') - real_url_m3u8 = response.get('streamList')[-1].get('list_hls')[0].get('url') - real_url = [real_url_flv, real_url_m3u8.replace('_480', '')] - else: - real_url = '直播间未开播' - else: - real_url = '直播间不存在' - return real_url + try: + hm = HuoMao(rid) + return hm.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入火猫直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入火猫直播房间号:\n') + print(get_real_url(r)) diff --git a/huya.py b/huya.py index 23b2d52..d337c75 100644 --- a/huya.py +++ b/huya.py @@ -1,5 +1,6 @@ # 获取虎牙直播的真实流媒体地址。 # 虎牙"一起看"频道的直播间可能会卡顿 + import requests import re import base64 @@ -8,53 +9,69 @@ import hashlib import time -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)) - ll = n['wsTime'] - t = '0' - h = '_'.join([p, t, s, f, ll]) - m = hashlib.md5(h.encode('utf-8')).hexdigest() - y = c[-1] - url = "{}?wsSecret={}&wsTime={}&u={}&seqid={}&{}".format(i, m, ll, t, f, y) - return url +class HuYa: + def __init__(self, rid): + self.rid = rid -def huya(room_id): - try: - 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] - if livelineurl: - if 'replay' in livelineurl: - return '直播录像:https:' + livelineurl + 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] + if livelineurl: + if 'replay' in livelineurl: + real_url = { + 'replay': "https:" + livelineurl, + } + else: + s_url = self.live(livelineurl) + b_url = self.live(livelineurl.replace('_2000', '')) + real_url = { + '2000p': "https:" + s_url, + 'BD': "https:" + b_url + } else: - s_url = live(livelineurl) - b_url = live(livelineurl.replace('_2000', '')) - real_url = { - '2000p': "https:" + s_url, - 'BD': "https:" + b_url - } - else: - real_url = '未开播或直播间不存在' - except: - real_url = '未开播或直播间不存在' - return real_url + raise Exception('未开播或直播间不存在') + except Exception as e: + raise Exception('未开播或直播间不存在') + return real_url + + @staticmethod + 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)) + ll = n['wsTime'] + t = '0' + h = '_'.join([p, t, s, f, ll]) + m = hashlib.md5(h.encode('utf-8')).hexdigest() + y = c[-1] + url = "{}?wsSecret={}&wsTime={}&u={}&seqid={}&{}".format(i, m, ll, t, f, y) + 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(huya(rid)) + rid = input('输入虎牙直播房间号:\n') + print(get_real_url(rid)) diff --git a/imifun.py b/imifun.py index 3135676..351cb3f 100644 --- a/imifun.py +++ b/imifun.py @@ -1,23 +1,38 @@ # 艾米直播:https://www.imifun.com/ + import requests import re -def imifun(rid): - with requests.Session() as s: - res = s.get('https://www.imifun.com/' + str(rid)).text - roomid = re.search(r"roomId:\s'([\w-]+)'", res) - if roomid: - status = re.search(r"isLive:(\d),", res).group(1) - if status == '1': - real_url = 'https://wsmd.happyia.com/ivp/{}.flv'.format(roomid.group(1)) - return real_url +class IMFun: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://www.imifun.com/' + str(self.rid)).text + roomid = re.search(r"roomId:\s'([\w-]+)'", res) + if roomid: + status = re.search(r"isLive:(\d),", res).group(1) + if status == '1': + real_url = 'https://wsmd.happyia.com/ivp/{}.flv'.format(roomid.group(1)) + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + imf = IMFun(rid) + return imf.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入艾米直播房间号:\n') - print(imifun(r)) + print(get_real_url(r)) diff --git a/immomo.py b/immomo.py index 9898321..a0f3dc2 100644 --- a/immomo.py +++ b/immomo.py @@ -1,31 +1,43 @@ import requests -def immomo(rid): - url = 'https://web.immomo.com/webmomo/api/scene/profile/roominfos' - data = { - 'stid': rid, - 'src': 'url' - } +class ImMoMo: + def __init__(self, rid): + self.rid = rid - with requests.Session() as s: - s.get('https://web.immomo.com') - res = s.post(url, data=data).json() + def get_real_url(self): + url = 'https://web.immomo.com/webmomo/api/scene/profile/roominfos' + data = { + 'stid': self.rid, + 'src': 'url' + } - ec = res.get('ec', 0) - if ec != 200: - raise Exception('请求参数错误') - else: - live = res['data']['live'] - if live: - real_url = res['data']['url'] - return real_url + with requests.Session() as s: + s.get('https://web.immomo.com') + res = s.post(url, data=data).json() + + ec = res.get('ec', 0) + if ec != 200: + raise Exception('请求参数错误') else: - raise Exception('未开播') + live = res['data']['live'] + if live: + real_url = res['data']['url'] + return real_url + else: + raise Exception('未开播') + + +def get_real_url(rid): + try: + mm = ImMoMo(rid) + return mm.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入陌陌直播房间号:\n') - print(immomo(r)) + r = input('请输入陌陌直播房间号:\n') + print(get_real_url(r)) -# https://web.immomo.com/live/337033339 diff --git a/inke.py b/inke.py index 7221f7b..cfa220d 100644 --- a/inke.py +++ b/inke.py @@ -1,25 +1,37 @@ # 获取映客直播的真实流媒体地址。 - import requests +class InKe: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + room_url = 'https://webapi.busi.inke.cn/web/live_share_pc?uid=' + str(self.rid) + response = requests.get(url=room_url).json() + record_url = response.get('data').get('file').get('record_url') + stream_addr = response.get('data').get('live_addr') + real_url = { + 'record_url': record_url, + 'stream_addr': stream_addr + } + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - room_url = 'https://webapi.busi.inke.cn/web/live_share_pc?uid=' + str(rid) - response = requests.get(url=room_url).json() - record_url = response.get('data').get('file').get('record_url') - stream_addr = response.get('data').get('live_addr') - real_url = { - 'record_url': record_url, - 'stream_addr': stream_addr - } - except: - real_url = '直播间不存在或未开播' - return real_url + inke = InKe(rid) + return inke.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入映客直播间uid:\n') -real_url = get_real_url(rid) -print('该直播源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入映客直播房间号:\n') + print(get_real_url(r)) diff --git a/iqiyi.py b/iqiyi.py index 3b5fb1f..6d633b7 100644 --- a/iqiyi.py +++ b/iqiyi.py @@ -9,39 +9,51 @@ import time import urllib.parse +class IQiYi: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response = requests.get('https://m-gamelive.iqiyi.com/w/' + self.rid).text + # 获取直播间的qipuId + qipuId = re.findall(r'"qipuId":(\d*?),"roomId', response)[0] + callback = 'jsonp_' + str(int((time.time() * 1000))) + '_0000' + params = { + 'lp': qipuId, + 'src': '01010031010000000000', + 'rateVers': 'H5_QIYI', + 'qd_v': 1, + 'callback': callback + } + + # ba传参iqiyi.js + ba = '/jp/live?' + urllib.parse.urlencode(params) + with open('iqiyi.js', 'r') as f: + content = f.read() + cmd5x = execjs.compile(content) + vf = cmd5x.call('cmd5x', ba) + + # 请求 + response = requests.get('https://live.video.iqiyi.com' + ba, params={'vf': vf}).text + url_json = json.loads(re.findall(r'try{.*?\((.*)\);}catch\(e\){};', response)[0]) + real_url = (url_json.get('data').get('streams'))[0].get('url') + real_url = real_url.replace('hlslive.video.iqiyi.com', 'm3u8live.video.iqiyi.com') + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response = requests.get('https://m-gamelive.iqiyi.com/w/' + rid).text - # 获取直播间的qipuId - qipuId = re.findall(r'"qipuId":(\d*?),"roomId', response)[0] - callback = 'jsonp_' + str(int((time.time() * 1000))) + '_0000' - params = { - 'lp': qipuId, - 'src': '01010031010000000000', - 'rateVers': 'H5_QIYI', - 'qd_v': 1, - 'callback': callback - } - - # ba传参iqiyi.js - ba = '/jp/live?' + urllib.parse.urlencode(params) - with open('iqiyi.js', 'r') as f: - content = f.read() - cmd5x = execjs.compile(content) - vf = cmd5x.call('cmd5x', ba) - - # 请求 - response = requests.get('https://live.video.iqiyi.com' + ba, params={'vf': vf}).text - url_json = json.loads(re.findall(r'try{.*?\((.*)\);}catch\(e\){};', response)[0]) - real_url = (url_json.get('data').get('streams'))[0].get('url') - real_url = real_url.replace('hlslive.video.iqiyi.com', 'm3u8live.video.iqiyi.com') - except: - real_url = '直播间不存在或未开播' - return real_url + iqiyi = IQiYi(rid) + return iqiyi.get_real_url() + except Exception as e: + print('Exception:', e) + return False - -rid = input('请输入爱奇艺直播间id:\n') # 如:19732 -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入爱奇艺直播房间号:\n') + print(get_real_url(r)) diff --git a/ixigua.py b/ixigua.py index cadf5b7..b8be547 100644 --- a/ixigua.py +++ b/ixigua.py @@ -1,22 +1,34 @@ # 获取西瓜直播的真实流媒体地址。 - import requests import re -import json + + +class IXiGua: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + room_url = self.rid + response = requests.get(url=room_url).text + real_url = re.findall(r'playInfo":([\s\S]*?),"authStatus', response)[0] + real_url = re.sub(r'\\u002F', '/', real_url) + except: + raise Exception('直播间不存在或未开播') + return real_url + def get_real_url(rid): try: - room_url = rid - response = requests.get(url=room_url).text - real_url = re.findall(r'playInfo":([\s\S]*?),"authStatus', response)[0] - real_url = re.sub(r'\\u002F', '/', real_url) - except: - real_url = '直播间不存在或未开播' - return real_url + xg = IXiGua(rid) + return xg.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入西瓜直播URL:\n') -real_url = get_real_url(rid) -print('该直播源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入西瓜直播房间号:\n') + print(get_real_url(r)) diff --git a/jd.py b/jd.py index b9ed7ed..073795f 100644 --- a/jd.py +++ b/jd.py @@ -1,31 +1,46 @@ # 京东直播:https://h5.m.jd.com/dev/3pbY8ZuCx4ML99uttZKLHC2QcAMn/live.html?id=1807004&position=0 + import requests import json -def jd(rid): - url = 'https://api.m.jd.com/client.action' - params = { - 'functionId': 'liveDetail', - 'body': json.dumps({'id': rid, 'videoType': 1}, separators=(',', ':')), - 'client': 'wh5' - } - with requests.Session() as s: - res = s.get(url, params=params).json() - data = res.get('data', 0) - if data: - status = data['status'] - if status == 1: - real_url = data['h5Pull'] - return real_url +class JD: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + url = 'https://api.m.jd.com/client.action' + params = { + 'functionId': 'liveDetail', + 'body': json.dumps({'id': self.rid, 'videoType': 1}, separators=(',', ':')), + 'client': 'wh5' + } + with requests.Session() as s: + res = s.get(url, params=params).json() + data = res.get('data', 0) + if data: + status = data['status'] + if status == 1: + real_url = data['h5Pull'] + return real_url + else: + print('未开播') + real_url = '回放:' + data.get('playBack').get('videoUrl', 0) + return real_url else: - print('未开播') - real_url = '回放:' + data.get('playBack').get('videoUrl', 0) - return real_url - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + jd = JD(rid) + return jd.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入京东直播间id:\n') - print(jd(r)) + r = input('请输入京东直播房间号:\n') + print(get_real_url(r)) diff --git a/kk.py b/kk.py index e0b3925..d1da8dc 100644 --- a/kk.py +++ b/kk.py @@ -2,26 +2,40 @@ import requests -def kk(rid): - url = 'https://sapi.kktv1.com/meShow/entrance?parameter={}' - parameter = {'FuncTag': 10005043, 'userId': '{}'.format(rid), 'platform': 1, 'a': 1, 'c': 100101} - with requests.Session() as s: - res = s.get(url.format(parameter)).json() - tagcode = res['TagCode'] - if tagcode == '00000000': - if res.get('liveType', 0) == 1: - roomid = res['roomId'] - parameter = {'FuncTag': 60001002, 'roomId': roomid, 'platform': 1, 'a': 1, 'c': 100101} - with requests.Session() as s: - res = s.get(url.format(parameter)).json() - real_url = res['liveStream'] - return real_url +class KK: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + url = 'https://sapi.kktv1.com/meShow/entrance?parameter={}' + parameter = {'FuncTag': 10005043, 'userId': '{}'.format(self.rid), 'platform': 1, 'a': 1, 'c': 100101} + with requests.Session() as s: + res = s.get(url.format(parameter)).json() + tagcode = res['TagCode'] + if tagcode == '00000000': + if res.get('liveType', 0) == 1: + roomid = res['roomId'] + parameter = {'FuncTag': 60001002, 'roomId': roomid, 'platform': 1, 'a': 1, 'c': 100101} + with requests.Session() as s: + res = s.get(url.format(parameter)).json() + real_url = res['liveStream'] + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + kk = KK(rid) + return kk.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入KK直播房间号:\n') - print(kk(r)) + print(get_real_url(r)) diff --git a/kuaishou.py b/kuaishou.py index 19cf8c2..4e22c36 100644 --- a/kuaishou.py +++ b/kuaishou.py @@ -2,28 +2,41 @@ import json import re - import requests -def kuaishou(rid): - headers = { - 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 ' - '(KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - 'cookie': 'did=web_'} - with requests.Session() as s: - res = s.get('https://m.gifshow.com/fw/live/{}'.format(rid), headers=headers) - livestream = re.search(r'liveStream":(.*),"obfuseData', res.text) - if livestream: - livestream = json.loads(livestream.group(1)) - *_, hlsplayurls = livestream['multiResolutionHlsPlayUrls'] - urls, = hlsplayurls['urls'] - url = urls['url'] - return url - else: - raise Exception('直播间不存在或未开播') +class KuaiShou: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + headers = { + 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 ' + '(KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + 'cookie': 'did=web_'} + with requests.Session() as s: + res = s.get('https://m.gifshow.com/fw/live/{}'.format(self.rid), headers=headers) + livestream = re.search(r'liveStream":(.*),"obfuseData', res.text) + if livestream: + livestream = json.loads(livestream.group(1)) + *_, hlsplayurls = livestream['multiResolutionHlsPlayUrls'] + urls, = hlsplayurls['urls'] + url = urls['url'] + return url + else: + raise Exception('直播间不存在或未开播') + + +def get_real_url(rid): + try: + ks = KuaiShou(rid) + return ks.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入快手直播房间号:\n') # 例:jjworld126 - print(kuaishou(r)) + r = input('请输入快手直播房间地址:\n') + print(get_real_url(r)) diff --git a/kugou.py b/kugou.py index 456c029..90c1f6e 100644 --- a/kugou.py +++ b/kugou.py @@ -3,18 +3,31 @@ import requests +class KuGou: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response1 = requests.get('https://fx1.service.kugou.com/video/pc/live/pull/v3/streamaddr?roomId={}&ch=fx&version=1.0&streamType=1-2-5&platform=7&ua=fx-flash&kugouId=0&layout=1'.format(self.rid)).json() + response2 = requests.get('https://fx1.service.kugou.com/video/mo/live/pull/h5/v3/streamaddr?roomId={}&platform=18&version=1000&streamType=3-6&liveType=1&ch=fx&ua=fx-mobile-h5&kugouId=0&layout=1'.format(self.rid)).json() + real_url_flv = response1.get('data').get('horizontal')[0].get('httpflv')[0] + real_url_hls = response2.get('data').get('horizontal')[0].get('httpshls')[0] + except: + raise Exception('直播间不存在或未开播') + return {"flv": real_url_flv, "hls": real_url_hls} + + def get_real_url(rid): try: - response1 = requests.get('https://fx1.service.kugou.com/video/pc/live/pull/v3/streamaddr?roomId={}&ch=fx&version=1.0&streamType=1-2-5&platform=7&ua=fx-flash&kugouId=0&layout=1'.format(rid)).json() - response2 = requests.get('https://fx1.service.kugou.com/video/mo/live/pull/h5/v3/streamaddr?roomId={}&platform=18&version=1000&streamType=3-6&liveType=1&ch=fx&ua=fx-mobile-h5&kugouId=0&layout=1'.format(rid)).json() - real_url_flv = response1.get('data').get('horizontal')[0].get('httpflv')[0] - real_url_hls = response2.get('data').get('horizontal')[0].get('httpshls')[0] - except: - real_url_flv = real_url_hls = '直播间不存在或未开播' - return real_url_flv, real_url_hls + kg = KuGou(rid) + return kg.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入酷狗直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入酷狗直播房间号:\n') + print(get_real_url(r)) diff --git a/kuwo.py b/kuwo.py index 333f4bb..deb61c0 100644 --- a/kuwo.py +++ b/kuwo.py @@ -1,22 +1,38 @@ # 酷我聚星直播:http://jx.kuwo.cn/ + import requests -def kuwo(rid): - with requests.Session() as s: - res = s.get('https://zhiboserver.kuwo.cn/proxy.p?src=h5&cmd=enterroom&rid={}&videotype=1&auto=1'.format(rid)) - res = res.json() +class KuWo: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://zhiboserver.kuwo.cn/proxy.p?src=h5&cmd=enterroom&rid={}&videotype=1&auto=1'.format(self.rid)) + res = res.json() + try: + livestatus = res['room']['livestatus'] + except KeyError: + raise Exception('房间号错误') + if livestatus == 2: + real_url = res['live']['url'] + return real_url + else: + raise Exception('未开播') + + +def get_real_url(rid): try: - livestatus = res['room']['livestatus'] - except KeyError: - raise Exception('房间号错误') - if livestatus == 2: - real_url = res['live']['url'] - return real_url - else: - raise Exception('未开播') + kw = KuWo(rid) + return kw.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入酷我聚星直播房间号:\n') - print(kuwo(r)) + print(get_real_url(r)) + diff --git a/laifeng.py b/laifeng.py index 616001e..e7230c7 100644 --- a/laifeng.py +++ b/laifeng.py @@ -6,21 +6,34 @@ import requests import re +class LaiFeng: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response_main = requests.get(url='http://v.laifeng.com/{}/m'.format(self.rid)).text + stream_name = re.findall(r"initAlias:'(.*)?'", response_main)[0] + real_url = {} + for stream_format in ['HttpFlv', 'Hls']: + request_url = 'https://lapi.lcloud.laifeng.com/Play?AppId=101&StreamName={}&Action=Schedule&Version=2.0&Format={}'.format(stream_name, stream_format) + response = requests.get(url=request_url).json() + real_url[stream_format] = response.get(stream_format)[0].get('Url') + except: + raise Exception('该直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response_main = requests.get(url='http://v.laifeng.com/{}/m'.format(rid)).text - stream_name = re.findall(r"initAlias:'(.*)?'", response_main)[0] - real_url = {} - for stream_format in ['HttpFlv', 'Hls']: - request_url = 'https://lapi.lcloud.laifeng.com/Play?AppId=101&StreamName={}&Action=Schedule&Version=2.0&Format={}'.format(stream_name, stream_format) - response = requests.get(url=request_url).json() - real_url[stream_format] = response.get(stream_format)[0].get('Url') - except: - real_url = '该直播间不存在或未开播' - return real_url + lf = LaiFeng(rid) + return lf.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入来疯直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入来疯直播房间号:\n') + print(get_real_url(r)) diff --git a/lehai.py b/lehai.py index 1c1bf22..8c9e982 100644 --- a/lehai.py +++ b/lehai.py @@ -1,4 +1,5 @@ # 乐嗨直播:https://www.lehaitv.com/ + from urllib.parse import urlencode from urllib.parse import unquote import requests @@ -6,35 +7,49 @@ import time import hashlib -def lehai(rid): - url = 'https://service.lehaitv.com/v2/room/{}/enter'.format(rid) - params = { - '_st1': int(time.time() * 1e3), - 'accessToken': 's7FUbTJ%2BjILrR7kicJUg8qr025ZVjd07DAnUQd8c7g%2Fo4OH9pdSX6w%3D%3D', - 'tku': 3000006, - } - data = urlencode(params) + '1eha12h5' - _ajaxData1 = hashlib.md5(data.encode('utf-8')).hexdigest() - params['_ajaxData1'] = _ajaxData1 - params['accessToken'] = unquote(params['accessToken']) - with requests.Session() as s: - res = s.get(url, params=params) - if res.status_code == 200: - res = res.json() - statuscode = res['status']['statuscode'] - if statuscode == '0': - if res['data']['live_status'] == '1': - anchor, = res['data']['anchor'] - real_url = anchor['media_url'] - return real_url +class LeHai: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + url = 'https://service.lehaitv.com/v2/room/{}/enter'.format(self.rid) + params = { + '_st1': int(time.time() * 1e3), + 'accessToken': 's7FUbTJ%2BjILrR7kicJUg8qr025ZVjd07DAnUQd8c7g%2Fo4OH9pdSX6w%3D%3D', + 'tku': 3000006, + } + data = urlencode(params) + '1eha12h5' + _ajaxData1 = hashlib.md5(data.encode('utf-8')).hexdigest() + params['_ajaxData1'] = _ajaxData1 + params['accessToken'] = unquote(params['accessToken']) + with requests.Session() as s: + res = s.get(url, params=params) + if res.status_code == 200: + res = res.json() + statuscode = res['status']['statuscode'] + if statuscode == '0': + if res['data']['live_status'] == '1': + anchor, = res['data']['anchor'] + real_url = anchor['media_url'] + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') + raise Exception('房间不存在 或 权限检查错误') else: - raise Exception('房间不存在 或 权限检查错误') - else: - raise Exception('请求错误') + raise Exception('请求错误') + + +def get_real_url(rid): + try: + lh = LeHai(rid) + return lh.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入乐嗨直播房间号:\n') - print(lehai(r)) + print(get_real_url(r)) diff --git a/longzhu.py b/longzhu.py index f3174b6..3c7988f 100644 --- a/longzhu.py +++ b/longzhu.py @@ -4,18 +4,31 @@ import requests import re +class LongZhu: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response = requests.get('http://m.longzhu.com/' + str(self.rid)).text + roomId = re.findall(r'roomId = (\d*);', response)[0] + response = requests.get('http://livestream.longzhu.com/live/getlivePlayurl?roomId={}&hostPullType=2&isAdvanced=true&playUrlsType=1'.format(roomId)).json() + real_url = response.get('playLines')[0].get('urls')[-1].get('securityUrl') + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response = requests.get('http://m.longzhu.com/' + str(rid)).text - roomId = re.findall(r'roomId = (\d*);', response)[0] - response = requests.get('http://livestream.longzhu.com/live/getlivePlayurl?roomId={}&hostPullType=2&isAdvanced=true&playUrlsType=1'.format(roomId)).json() - real_url = response.get('playLines')[0].get('urls')[-1].get('securityUrl') - except: - real_url = '直播间不存在或未开播' - return real_url + lz = LongZhu(rid) + return lz.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入龙珠直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入龙珠直播房间号:\n') + print(get_real_url(r)) diff --git a/look.py b/look.py index 59bab46..38b4acf 100644 --- a/look.py +++ b/look.py @@ -1,21 +1,34 @@ # 获取网易云音乐旗下look直播的真实流媒体地址。 # look直播间链接形式:https://look.163.com/live?id=73694082 - import requests import re +class Look: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response = requests.post(url='https://look.163.com/live?id=' + self.rid).text + real_url = re.findall(r'"liveUrl":([\s\S]*),"liveType"', response)[0] + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response = requests.post(url='https://look.163.com/live?id=' + rid).text - real_url = re.findall(r'"liveUrl":([\s\S]*),"liveType"', response)[0] - except: - real_url = '该直播间不存在或未开播' - return real_url + look = Look(rid) + return look.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入look直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入Look直播房间号:\n') + print(get_real_url(r)) + diff --git a/now.py b/now.py index b07b3b9..288d202 100644 --- a/now.py +++ b/now.py @@ -1,25 +1,37 @@ # 获取NOW直播的真实流媒体地址。 - import requests +class Now: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + room_url = 'https://now.qq.com/cgi-bin/now/web/room/get_live_room_url?room_id={}&platform=8'.format(self.rid) + response = requests.get(url=room_url).json() + result = response.get('result') + real_url = { + 'raw_hls_url': result.get('raw_hls_url', 0), + 'raw_rtmp_url': result.get('raw_rtmp_url', 0), + 'raw_flv_url': result.get('raw_flv_url', 0) + } + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - room_url = 'https://now.qq.com/cgi-bin/now/web/room/get_live_room_url?room_id={}&platform=8'.format(rid) - response = requests.get(url=room_url).json() - result = response.get('result') - real_url = { - 'raw_hls_url': result.get('raw_hls_url', 0), - 'raw_rtmp_url': result.get('raw_rtmp_url', 0), - 'raw_flv_url': result.get('raw_flv_url', 0) - } - except: - real_url = '直播间不存在或未开播' - return real_url + now = Now(rid) + return now.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入NOW直播间数字ID:\n') -real_url = get_real_url(rid) -print('该直播源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入NOW直播间号:\n') + print(get_real_url(r)) diff --git a/pps.py b/pps.py index fa4d37f..c8cfa78 100644 --- a/pps.py +++ b/pps.py @@ -5,24 +5,37 @@ import re import time +class PPS: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response = requests.get('http://m-x.pps.tv/room/' + str(self.rid)).text + anchor_id = re.findall(r'anchor_id":(\d*),"online_uid', response)[0] + tt = int(time.time() * 1000) + url = 'http://api-live.iqiyi.com/stream/geth5?qd_tm={}&typeId=1&platform=7&vid=0&qd_vip=0&qd_uid={}&qd_ip=114.114.114.114&qd_vipres=0&qd_src=h5_xiu&qd_tvid=0&callback='.format(tt, anchor_id) + headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Referer': 'http://m-x.pps.tv/' + } + response = requests.get(url=url, headers=headers).text + real_url = re.findall(r'"hls":"(.*)","rate_list', response)[0] + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response = requests.get('http://m-x.pps.tv/room/' + str(rid)).text - anchor_id = re.findall(r'anchor_id":(\d*),"online_uid', response)[0] - tt = int(time.time() * 1000) - url = 'http://api-live.iqiyi.com/stream/geth5?qd_tm={}&typeId=1&platform=7&vid=0&qd_vip=0&qd_uid={}&qd_ip=114.114.114.114&qd_vipres=0&qd_src=h5_xiu&qd_tvid=0&callback='.format(tt, anchor_id) - headers = { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Referer': 'http://m-x.pps.tv/' - } - response = requests.get(url=url, headers=headers).text - real_url = re.findall(r'"hls":"(.*)","rate_list', response)[0] - except: - real_url = '直播间未开播或不存在' - return real_url + pps = PPS(rid) + return pps.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入奇秀直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入奇秀直播房间号:\n') + print(get_real_url(r)) diff --git a/qf.py b/qf.py index d51939e..1111839 100644 --- a/qf.py +++ b/qf.py @@ -5,17 +5,30 @@ import requests import re +class QF: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response = requests.post(url='https://qf.56.com/' + self.rid).text + real_url = re.findall(r"flvUrl:'(.*)\?wsSecret", response) + real_url = real_url[0] + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response = requests.post(url='https://qf.56.com/' + rid).text - real_url = re.findall(r"flvUrl:'(.*)\?wsSecret", response) - real_url = real_url[0] - except: - real_url = '该直播间不存在或未开播' - return real_url + qf = QF(rid) + return qf.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入千帆直播房间号:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入千帆直播房间号:\n') + print(get_real_url(r)) diff --git a/qie.py b/qie.py index 3d05750..684b8d6 100644 --- a/qie.py +++ b/qie.py @@ -1,22 +1,37 @@ # 企鹅体育:https://live.qq.com/directory/all + import requests import re -def qie(rid): - with requests.Session() as s: - res = s.get('https://m.live.qq.com/' + str(rid)) - show_status = re.search(r'"show_status":"(\d)"', res.text) - if show_status: - if show_status.group(1) == '1': - hls_url = re.search(r'"hls_url":"(.*)","use_p2p"', res.text).group(1) - return hls_url +class ESport: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://m.live.qq.com/' + str(self.rid)) + show_status = re.search(r'"show_status":"(\d)"', res.text) + if show_status: + if show_status.group(1) == '1': + hls_url = re.search(r'"hls_url":"(.*)","use_p2p"', res.text).group(1) + return hls_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + es = ESport(rid) + return es.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入企鹅体育直播间号:\n') - print(qie(r)) + r = input('请输入企鹅体育直播房间号:\n') + print(get_real_url(r)) diff --git a/renren.py b/renren.py index dba59a1..9312841 100644 --- a/renren.py +++ b/renren.py @@ -1,33 +1,48 @@ # 人人直播:http://zhibo.renren.com/ + import requests import re import hashlib -def renren(rid): - with requests.Session() as s: - res = s.get('http://activity.renren.com/liveroom/' + str(rid)) - livestate = re.search(r'"liveState":(\d)', res.text) - if livestate: - try: - s = re.search(r'"playUrl":"([\s\S]*?)"', res.text).group(1) - if livestate.group(1) == '0': - accesskey = re.search(r'accesskey=(\w+)', s).group(1) - expire = re.search(r'expire=(\d+)', s).group(1) - live = re.search(r'(/live/\d+)', s).group(1) - c = accesskey + expire + live - key = hashlib.md5(c.encode('utf-8')).hexdigest() - e = s.split('?')[0].split('/')[4] - t = 'http://ksy-hls.renren.com/live/' + e + '/index.m3u8?key=' + key - return t - elif livestate.group(1) == '1': - return '回放:' + s - except IndexError: - raise Exception('解析错误') - else: - raise Exception('直播间不存在') +class RenRen: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('http://activity.renren.com/liveroom/' + str(self.rid)) + livestate = re.search(r'"liveState":(\d)', res.text) + if livestate: + try: + s = re.search(r'"playUrl":"([\s\S]*?)"', res.text).group(1) + if livestate.group(1) == '0': + accesskey = re.search(r'accesskey=(\w+)', s).group(1) + expire = re.search(r'expire=(\d+)', s).group(1) + live = re.search(r'(/live/\d+)', s).group(1) + c = accesskey + expire + live + key = hashlib.md5(c.encode('utf-8')).hexdigest() + e = s.split('?')[0].split('/')[4] + t = 'http://ksy-hls.renren.com/live/' + e + '/index.m3u8?key=' + key + return t + elif livestate.group(1) == '1': + return '回放:' + s + except IndexError: + raise Exception('解析错误') + else: + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + rr = RenRen(rid) + return rr.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入人人直播房间号:\n') - print(renren(r)) + r = input('请输入人人直播房间号:\n') + print(get_real_url(r)) diff --git a/showself.py b/showself.py index 81a4f0c..e09e920 100644 --- a/showself.py +++ b/showself.py @@ -1,49 +1,64 @@ # 秀色直播:https://www.showself.com/ + from urllib.parse import urlencode import requests import time import hashlib -def showself(rid): - with requests.Session() as s: - res = s.get('https://service.showself.com/v2/custuser/visitor').json() - uid = res['data']['uid'] - accesstoken = sessionid = res['data']['sessionid'] - params = { - 'accessToken': accesstoken, - 'tku': uid, - '_st1': int(time.time() * 1000) - } - payload = { - 'groupid': '999', - 'roomid': rid, - 'sessionid': sessionid, - 'sessionId': sessionid - } - data = dict(params, **payload) - data = urlencode(sorted(data.items(), key=lambda d: d[0])) + 'sh0wselfh5' - _ajaxData1 = hashlib.md5(data.encode('utf-8')).hexdigest() - payload['_ajaxData1'] = _ajaxData1 - url = 'https://service.showself.com/v2/rooms/{}/members?{}'.format(rid, urlencode(params)) - with requests.Session() as s: - res = s.post(url, json=payload) - if res.status_code == 200: - res = res.json() - statuscode = res['status']['statuscode'] - if statuscode == '0': - if res['data']['roomInfo']['live_status'] == '1': - anchor, = res['data']['roomInfo']['anchor'] - real_url = anchor['media_url'] - return real_url +class ShowSelf: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://service.showself.com/v2/custuser/visitor').json() + uid = res['data']['uid'] + accesstoken = sessionid = res['data']['sessionid'] + params = { + 'accessToken': accesstoken, + 'tku': uid, + '_st1': int(time.time() * 1000) + } + payload = { + 'groupid': '999', + 'roomid': self.rid, + 'sessionid': sessionid, + 'sessionId': sessionid + } + data = dict(params, **payload) + data = urlencode(sorted(data.items(), key=lambda d: d[0])) + 'sh0wselfh5' + _ajaxData1 = hashlib.md5(data.encode('utf-8')).hexdigest() + payload['_ajaxData1'] = _ajaxData1 + url = 'https://service.showself.com/v2/rooms/{}/members?{}'.format(self.rid, urlencode(params)) + with requests.Session() as s: + res = s.post(url, json=payload) + if res.status_code == 200: + res = res.json() + statuscode = res['status']['statuscode'] + if statuscode == '0': + if res['data']['roomInfo']['live_status'] == '1': + anchor, = res['data']['roomInfo']['anchor'] + real_url = anchor['media_url'] + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') + raise Exception('房间不存在') else: - raise Exception('房间不存在') - else: - raise Exception('参数错误') + raise Exception('参数错误') + + +def get_real_url(rid): + try: + ss = ShowSelf(rid) + return ss.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入秀色直播房间号:\n') - print(showself(r)) + rid = input('输入秀色直播房间号:\n') + print(get_real_url(rid)) diff --git a/tuho.py b/tuho.py index 32c8b06..2391c59 100644 --- a/tuho.py +++ b/tuho.py @@ -1,23 +1,38 @@ # 星光直播:https://www.tuho.tv/28545037 + import requests import re -def tuho(rid): - with requests.Session() as s: - res = s.get('https://www.tuho.tv/' + str(rid)).text - flv = re.search(r'videoPlayFlv":"(https[\s\S]+?flv)', res) - if flv: - status = re.search(r'isPlaying\s:\s(\w+),', res).group(1) - if status == 'true': - real_url = flv.group(1).replace('\\', '') - return real_url +class TuHo: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://www.tuho.tv/' + str(self.rid)).text + flv = re.search(r'videoPlayFlv":"(https[\s\S]+?flv)', res) + if flv: + status = re.search(r'isPlaying\s:\s(\w+),', res).group(1) + if status == 'true': + real_url = flv.group(1).replace('\\', '') + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + th = TuHo(rid) + return th.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入星光直播房间号:\n') - print(tuho(r)) + print(get_real_url(r)) diff --git a/v6cn.py b/v6cn.py index d402018..fd09c8b 100644 --- a/v6cn.py +++ b/v6cn.py @@ -4,21 +4,35 @@ import requests import re +class V6CN: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + response = requests.get('https://v.6.cn/' + str(self.rid)).text + result = re.findall(r'"flvtitle":"v(\d*?)-(\d*?)"', response)[0] + uid = result[0] + flvtitle = 'v{}-{}'.format(*result) + response = requests.get('https://rio.6rooms.com/live/?s=' + str(uid)).text + hip = 'https://' + re.findall(r'(.*\.xiu123\.cn).*', response)[0] + real_url = [hip + '/' + flvtitle + '/playlist.m3u8', hip + '/httpflv/' + flvtitle] + except: + raise Exception('直播间不存在或未开播') + return real_url + + def get_real_url(rid): try: - response = requests.get('https://v.6.cn/' + str(rid)).text - result = re.findall(r'"flvtitle":"v(\d*?)-(\d*?)"', response)[0] - uid = result[0] - flvtitle = 'v{}-{}'.format(*result) - response = requests.get('https://rio.6rooms.com/live/?s=' + str(uid)).text - hip = 'https://' + re.findall(r'(.*\.xiu123\.cn).*', response)[0] - real_url = [hip + '/' + flvtitle + '/playlist.m3u8', hip + '/httpflv/' + flvtitle] - except: - real_url = '直播间不存在或未开播' - return real_url + v6cn = V6CN(rid) + return v6cn.get_real_url() + except Exception as e: + print('Exception:', e) + return False -rid = input('请输入六间房直播ID:\n') -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入六间房直播房间号:\n') + print(get_real_url(r)) + diff --git a/wali.py b/wali.py index b6d5ef2..5b328d9 100644 --- a/wali.py +++ b/wali.py @@ -1,19 +1,34 @@ # 小米直播:https://live.wali.com/fe + import requests -def wali(rid): - zuid = rid.split('_')[0] - with requests.Session() as s: - res = s.get('https://s.zb.mi.com/get_liveinfo?lid={}&zuid={}'.format(rid, zuid)).json() - status = res['data']['status'] - if status == 1: - flv = res['data']['video']['flv'] - return flv.replace('http', 'https') - else: - raise Exception('直播间不存在或未开播') +class WaLi: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + zuid = self.rid.split('_')[0] + with requests.Session() as s: + res = s.get('https://s.zb.mi.com/get_liveinfo?lid={}&zuid={}'.format(self.rid, zuid)).json() + status = res['data']['status'] + if status == 1: + flv = res['data']['video']['flv'] + return flv.replace('http', 'https') + else: + raise Exception('直播间不存在或未开播') + + +def get_real_url(rid): + try: + wali = WaLi(rid) + return wali.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入小米直播房间号:\n') - print(wali(r)) + r = input('请输入小米直播房间号:\n') + print(get_real_url(r)) diff --git a/woxiu.py b/woxiu.py index 577ea7c..24aa305 100644 --- a/woxiu.py +++ b/woxiu.py @@ -1,27 +1,42 @@ # 我秀直播:https://www.woxiu.com/ + import requests -def woxiu(rid): - headers = { - 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) ' - 'Version/11.0 Mobile/15A372 Safari/604.1' - } - url = 'https://m.woxiu.com/index.php?action=M/Live&do=LiveInfo&room_id={}'.format(rid) - with requests.Session() as s: - res = s.get(url, headers=headers) +class WoXiu: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + headers = { + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) ' + 'Version/11.0 Mobile/15A372 Safari/604.1' + } + url = 'https://m.woxiu.com/index.php?action=M/Live&do=LiveInfo&room_id={}'.format(self.rid) + with requests.Session() as s: + res = s.get(url, headers=headers) + try: + res = res.json() + except: + raise Exception('直播间不存在') + status = res['online'] + if status: + live_stream = res['live_stream'] + return live_stream + else: + raise Exception('未开播') + + +def get_real_url(rid): try: - res = res.json() - except: - raise Exception('直播间不存在') - status = res['online'] - if status: - live_stream = res['live_stream'] - return live_stream - else: - raise Exception('未开播') + wx = WoXiu(rid) + return wx.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入我秀直播房间号:\n') - print(woxiu(r)) + r = input('请输入我秀直播房间号:\n') + print(get_real_url(r)) diff --git a/xunlei.py b/xunlei.py index a0c93b4..c1ee0ed 100644 --- a/xunlei.py +++ b/xunlei.py @@ -1,41 +1,57 @@ # 迅雷直播:https://live.xunlei.com/global/index.html?id=0 + import requests import hashlib import time from urllib.parse import urlencode -def xunlei(rid): - url = 'https://biz-live-ssl.xunlei.com//caller' - headers = { - 'cookie': 'appid=1002' - } - _t = int(time.time() * 1000) - u = '1002' - f = '&*%$7987321GKwq' - params = { - '_t': _t, - 'a': 'play', - 'c': 'room', - 'hid': 'h5-e70560ea31cc17099395c15595bdcaa1', - 'uuid': rid, - } - data = urlencode(params) - p = hashlib.md5((u + data + f).encode('utf-8')).hexdigest() - params['sign'] = p - with requests.Session() as s: - res = s.get(url, params=params, headers=headers).json() - if res['result'] == 0: - play_status = res['data']['play_status'] - if play_status == 1: - real_url = res['data']['data']['stream_pull_https'] - return real_url +class XunLei: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + url = 'https://biz-live-ssl.xunlei.com//caller' + headers = { + 'cookie': 'appid=1002' + } + _t = int(time.time() * 1000) + u = '1002' + f = '&*%$7987321GKwq' + params = { + '_t': _t, + 'a': 'play', + 'c': 'room', + 'hid': 'h5-e70560ea31cc17099395c15595bdcaa1', + 'uuid': self.rid, + } + data = urlencode(params) + p = hashlib.md5((u + data + f).encode('utf-8')).hexdigest() + params['sign'] = p + with requests.Session() as s: + res = s.get(url, params=params, headers=headers).json() + if res['result'] == 0: + play_status = res['data']['play_status'] + if play_status == 1: + real_url = res['data']['data']['stream_pull_https'] + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间可能不存在') + raise Exception('直播间可能不存在') + + +def get_real_url(rid): + try: + xl = XunLei(rid) + return xl.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入迅雷直播房间号:\n') - print(xunlei(r)) + r = input('请输入迅雷直播房间号:\n') + print(get_real_url(r)) + diff --git a/yizhibo.py b/yizhibo.py index 6f9a7e7..b52b131 100644 --- a/yizhibo.py +++ b/yizhibo.py @@ -1,41 +1,50 @@ # 获取一直播的真实流媒体地址。 - import requests import re -def get_real_url(room_url): +class YiZhiBo: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + scid = re.findall(r'/l/(\S*).html', self.rid)[0] + flvurl = 'http://alcdn.f01.xiaoka.tv/live/{}.flv'.format(scid) + m3u8url = 'http://al01.alcdn.hls.xiaoka.tv/live/{}.m3u8'.format(scid) + rtmpurl = 'rtmp://alcdn.r01.xiaoka.tv/live/live/{}'.format(scid) + real_url = { + 'flvurl': flvurl, + 'm3u8url': m3u8url, + 'rtmpurl': rtmpurl + } + except: + raise Exception('链接错误') + return real_url + + def get_status(self): + try: + scid = re.findall(r'/l/(\S*).html', self.rid)[0] + response = requests.get( + url='https://m.yizhibo.com/www/live/get_live_video?scid=' + str(scid)).json() + status_code = response.get('data').get('info').get('status') + status = '直播中' if status_code == 10 else '未开播' + except: + raise Exception('链接错误') + return status + + +def get_real_url(rid): try: - scid = re.findall(r'/l/(\S*).html', room_url)[0] - flvurl = 'http://alcdn.f01.xiaoka.tv/live/{}.flv'.format(scid) - m3u8url = 'http://al01.alcdn.hls.xiaoka.tv/live/{}.m3u8'.format(scid) - rtmpurl = 'rtmp://alcdn.r01.xiaoka.tv/live/live/{}'.format(scid) - real_url = { - 'flvurl': flvurl, - 'm3u8url': m3u8url, - 'rtmpurl': rtmpurl - } - except: - real_url = '链接错误' - return real_url + yzb = YiZhiBo(rid) + return yzb.get_real_url() + except Exception as e: + print('Exception:', e) + return False -def get_status(room_url): - try: - scid = re.findall(r'/l/(\S*).html', room_url)[0] - response = requests.get( - url='https://m.yizhibo.com/www/live/get_live_video?scid=' + str(scid)).json() - status_code = response.get('data').get('info').get('status') - status = '直播中' if status_code == 10 else '未开播' - except: - status = '链接错误' - return status - - -rid = input('请输入一直播房间地址:\n') -status = get_status(rid) -print('当前直播状态', status) -real_url = get_real_url(rid) -print('该直播间源地址为:') -print(real_url) +if __name__ == '__main__': + r = input('请输入一直播房间地址:\n') + print(get_real_url(r)) diff --git a/youku.py b/youku.py index de029a8..15b5db9 100644 --- a/youku.py +++ b/youku.py @@ -3,36 +3,51 @@ # 而且没有平台水印和主播自己贴的乱七八糟的字幕遮挡。 # liveId 是如下形式直播间链接: # “https://vku.youku.com/live/ilproom?spm=a2hcb.20025885.m_16249_c_59932.d_11&id=8019610&scm=20140670.rcmd.16249.live_8019610”中的8019610字段。 + import requests import time import hashlib import json -def youku(liveid): +class YouKu: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + try: + tt = str(int(time.time() * 1000)) + data = json.dumps({'liveId': self.rid, 'app': 'Pc'}, separators=(',', ':')) + url = 'https://acs.youku.com/h5/mtop.youku.live.com.livefullinfo/1.0/?appKey=24679788' + s = requests.Session() + cookies = s.get(url).cookies + token = requests.utils.dict_from_cookiejar(cookies).get('_m_h5_tk')[0:32] + sign = hashlib.md5((token + '&' + tt + '&' + '24679788' + '&' + data).encode('utf-8')).hexdigest() + params = { + 't': tt, + 'sign': sign, + 'data': data + } + response = s.get(url, params=params).json() + # name = response.get('data').get('data').get('name') + streamname = response.get('data').get('data').get('stream')[0].get('streamName') + real_url = 'http://lvo-live.youku.com/vod2live/{}_mp4hd2v3.m3u8?&expire=21600&psid=1&ups_ts={}&vkey='.format( + streamname, int(time.time())) + except: + raise Exception('请求错误') + return real_url + + +def get_real_url(rid): try: - tt = str(int(time.time() * 1000)) - data = json.dumps({'liveId': liveid, 'app': 'Pc'}, separators=(',', ':')) - url = 'https://acs.youku.com/h5/mtop.youku.live.com.livefullinfo/1.0/?appKey=24679788' - s = requests.Session() - cookies = s.get(url).cookies - token = requests.utils.dict_from_cookiejar(cookies).get('_m_h5_tk')[0:32] - sign = hashlib.md5((token + '&' + tt + '&' + '24679788' + '&' + data).encode('utf-8')).hexdigest() - params = { - 't': tt, - 'sign': sign, - 'data': data - } - response = s.get(url, params=params).json() - # name = response.get('data').get('data').get('name') - streamname = response.get('data').get('data').get('stream')[0].get('streamName') - real_url = 'http://lvo-live.youku.com/vod2live/{}_mp4hd2v3.m3u8?&expire=21600&psid=1&ups_ts={}&vkey='.format( - streamname, int(time.time())) - except: - real_url = '请求错误' - return real_url + yk = YouKu(rid) + return yk.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': - r = input('输入优酷轮播台liveId:\n') - print(youku(r)) + r = input('请输入优酷轮播台房间号:\n') + print(get_real_url(r)) diff --git a/yuanbobo.py b/yuanbobo.py index e54650e..fe92261 100644 --- a/yuanbobo.py +++ b/yuanbobo.py @@ -3,21 +3,35 @@ import requests import re -def yuanbobo(rid): - with requests.Session() as s: - res = s.get('https://zhibo.yuanbobo.com/' + str(rid)).text - stream_id = re.search(r"stream_id:\s+'(\d+)'", res) - if stream_id: - status = re.search(r"status:\s+'(\d)'", res).group(1) - if status == '1': - real_url = 'http://ks-hlslive.yuanbobo.com/live/{}/index.m3u8'.format(stream_id.group(1)) - return real_url +class YuanBoBo: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://zhibo.yuanbobo.com/' + str(self.rid)).text + stream_id = re.search(r"stream_id:\s+'(\d+)'", res) + if stream_id: + status = re.search(r"status:\s+'(\d)'", res).group(1) + if status == '1': + real_url = 'http://ks-hlslive.yuanbobo.com/live/{}/index.m3u8'.format(stream_id.group(1)) + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + th = YuanBoBo(rid) + return th.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入热猫直播房间号:\n') - print(yuanbobo(r)) + print(get_real_url(r)) diff --git a/yy.py b/yy.py index 3f3672f..95ca203 100644 --- a/yy.py +++ b/yy.py @@ -1,35 +1,50 @@ # 获取YY直播的真实流媒体地址。https://www.yy.com/1349606469 # 默认获取最高画质 + import requests import re import json -def yy(rid): - headers = { - 'referer': 'http://wap.yy.com/mobileweb/{rid}'.format(rid=rid), - 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko)' - ' Version/11.0 Mobile/15A372 Safari/604.1' - } - room_url = 'http://interface.yy.com/hls/new/get/{rid}/{rid}/1200?source=wapyy&callback='.format(rid=rid) - with requests.Session() as s: - res = s.get(room_url, headers=headers) - if res.status_code == 200: - data = json.loads(res.text[1:-1]) - if data.get('hls', 0): - xa = data['audio'] - xv = data['video'] - xv = re.sub(r'0_\d+_0', '0_0_0', xv) - url = 'https://interface.yy.com/hls/get/stream/15013/{}/15013/{}?source=h5player&type=m3u8'.format(xv, xa) - res = s.get(url).json() - real_url = res['hls'] - return real_url +class YY: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + headers = { + 'referer': 'http://wap.yy.com/mobileweb/{rid}'.format(rid=self.rid), + 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko)' + ' Version/11.0 Mobile/15A372 Safari/604.1' + } + room_url = 'http://interface.yy.com/hls/new/get/{rid}/{rid}/1200?source=wapyy&callback='.format(rid=self.rid) + with requests.Session() as s: + res = s.get(room_url, headers=headers) + if res.status_code == 200: + data = json.loads(res.text[1:-1]) + if data.get('hls', 0): + xa = data['audio'] + xv = data['video'] + xv = re.sub(r'0_\d+_0', '0_0_0', xv) + url = 'https://interface.yy.com/hls/get/stream/15013/{}/15013/{}?source=h5player&type=m3u8'.format(xv, xa) + res = s.get(url).json() + real_url = res['hls'] + return real_url + else: + raise Exception('未开播') else: - raise Exception('未开播') - else: - raise Exception('直播间不存在') + raise Exception('直播间不存在') + + +def get_real_url(rid): + try: + yy = YY(rid) + return yy.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入YY直播房间号:\n') - print(yy(r)) + print(get_real_url(r)) diff --git a/zhanqi.py b/zhanqi.py index d32be97..b499852 100644 --- a/zhanqi.py +++ b/zhanqi.py @@ -3,23 +3,37 @@ import requests -def zhanqi(rid): - with requests.Session() as s: - res = s.get('https://m.zhanqi.tv/api/static/v2.1/room/domain/{}.json'.format(rid)) - try: - res = res.json() - videoid = res['data']['videoId'] - status = res['data']['status'] - if status == '4': - url = 'https://dlhdl-cdn.zhanqi.tv/zqlive/{}.flv?get_url=1'.format(videoid) - real_url = s.get(url).text - else: - real_url = '未开播' - except: - real_url = '直播间不存在' - return real_url +class ZhanQi: + + def __init__(self, rid): + self.rid = rid + + def get_real_url(self): + with requests.Session() as s: + res = s.get('https://m.zhanqi.tv/api/static/v2.1/room/domain/{}.json'.format(self.rid)) + try: + res = res.json() + videoid = res['data']['videoId'] + status = res['data']['status'] + if status == '4': + url = 'https://dlhdl-cdn.zhanqi.tv/zqlive/{}.flv?get_url=1'.format(videoid) + real_url = s.get(url).text + else: + raise Exception('未开播') + except: + raise Exception('直播间不存在') + return real_url + + +def get_real_url(rid): + try: + zq = ZhanQi(rid) + return zq.get_real_url() + except Exception as e: + print('Exception:', e) + return False if __name__ == '__main__': r = input('输入战旗直播房间号:\n') - print(zhanqi(r)) + print(get_real_url(r))