diff --git a/bilibili.py b/bilibili.py index 9c98942..0541ad4 100644 --- a/bilibili.py +++ b/bilibili.py @@ -1,61 +1,50 @@ -# 获取哔哩哔哩直播的真实流媒体地址。 -# PC网页和手机APP端的qn=1是最高画质;qn取值0~4。 -# 手机网页端的只找到一个值qn=0。 - +# 获取哔哩哔哩直播的真实流媒体地址,默认获取直播间提供的最高画质 +# qn=150高清 +# qn=250超清 +# qn=400蓝光 +# qn=10000原画 import requests -import re -def get_real_rid(rid): - room_url = 'https://api.live.bilibili.com/room/v1/Room/room_init?id=' + str(rid) - response = requests.get(url=room_url).json() - data = response.get('data', 0) - if data: - live_status = data.get('live_status', 0) - room_id = data.get('room_id', 0) +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'] + + 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') + } + + else: + raise Exception('未开播') else: - live_status = room_id = 0 - return live_status, room_id + raise Exception('房间不存在') -def get_real_url_flv(rid): - room = get_real_rid(rid) - live_status = room[0] - room_id = room[1] - qn = 1 # PC网页和手机APP端的qn=1是最高画质;qn取值0~4。 - if live_status: - try: - room_url = 'https://api.live.bilibili.com/xlive/web-room/v1/index/getRoomPlayInfo?room_id={}&play_url=1&mask=1&qn={}&platform=web'.format(room_id, qn) - response = requests.get(url=room_url).json() - durl = response.get('data').get('play_url').get('durl', 0) - real_url = durl[-1].get('url') - except: - real_url = '疑似部分国外IP无法GET到正确数据,待验证' - else: - real_url = '未开播或直播间不存在' - return real_url - - -def get_real_url_hls(rid): - room = get_real_rid(rid) - live_status = room[0] - room_id = room[1] - qn = 0 # 手机网页端的只找到一个值qn=0。 - if live_status: - try: - room_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl?cid={}&platform=h5&otype=json&quality={}'.format(room_id, qn) - response = requests.get(url=room_url).json() - durl = response.get('data').get('durl', 0) - real_url = durl[-1].get('url') - except: - real_url = '疑似部分国外IP无法GET到正确数据,待验证' - else: - real_url = '未开播或直播间不存在' - return real_url - -rid = input('请输入bilibili房间号:\n') -real_url_flv = get_real_url_flv(rid) -# real_url_hls = get_real_url_hls(rid) -print('该直播间源地址为:') -print(real_url_flv) -# print(real_url_hls) +if __name__ == '__main__': + r = input('输入bilibili直播间号:\n') + print(bilibili(r))