real-url icon indicating copy to clipboard operation
real-url copied to clipboard

B站直播获取的链接无法播放了

Open HexStan opened this issue 3 years ago • 13 comments

image

HexStan avatar May 13 '22 14:05 HexStan

好像dl-开头的链接可以播放,cn-开头的播放不了了,等大神来修复一下吧

TommyLee9527 avatar May 19 '22 02:05 TommyLee9527

这个目前可以获得能用的链接,我忘了是从哪位大佬的代码修改的了,对大佬说声抱歉,感谢大佬的贡献!

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取哔哩哔哩直播的真实流媒体地址,默认获取直播间提供的最高画质
# qn=150高清
# qn=250超清
# qn=400蓝光
# qn=10000原画
# 另一个直链api
# http://api.live.bilibili.com/room/v1/Room/playUrl?cid=23585383&qn=400&platform=web
import re

import requests


class BiliBili:

    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():
                    f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl'
                    params = {
                        'cid': room_id,
                        'platform': 'mb',
                        'otype': 'json',
                        'qn': 10000
                    }
                    resp = s.get(f_url, params=params).json()
                    try:
                        durl = resp['data']['durl']
                        real_url = durl[0]['url']
                        # real_url = re.sub(r'live_(\d+)_(\d+)_\d+.m3u8', r'live_\1_\2.m3u8', real_url)
                        return real_url
                    except KeyError or IndexError:
                        raise Exception('获取失败')

                return u()
            else:
                raise Exception('未开播')
        else:
            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(get_real_url(r))

lxhlight avatar May 20 '22 10:05 lxhlight

这个目前可以获得能用的链接,我忘了是从哪位大佬的代码修改的了,对大佬说声抱歉,感谢大佬的贡献!

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取哔哩哔哩直播的真实流媒体地址,默认获取直播间提供的最高画质
# qn=150高清
# qn=250超清
# qn=400蓝光
# qn=10000原画
# 另一个直链api
# http://api.live.bilibili.com/room/v1/Room/playUrl?cid=23585383&qn=400&platform=web
import re

import requests


class BiliBili:

    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():
                    f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl'
                    params = {
                        'cid': room_id,
                        'platform': 'mb',
                        'otype': 'json',
                        'qn': 10000
                    }
                    resp = s.get(f_url, params=params).json()
                    try:
                        durl = resp['data']['durl']
                        real_url = durl[0]['url']
                        # real_url = re.sub(r'live_(\d+)_(\d+)_\d+.m3u8', r'live_\1_\2.m3u8', real_url)
                        return real_url
                    except KeyError or IndexError:
                        raise Exception('获取失败')

                return u()
            else:
                raise Exception('未开播')
        else:
            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(get_real_url(r))

谢谢,真的能用

HexStan avatar May 20 '22 11:05 HexStan

这个目前可以获得能用的链接,我忘了是从哪位大佬的代码修改的了,对大佬说声抱歉,感谢大佬的贡献!

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取哔哩哔哩直播的真实流媒体地址,默认获取直播间提供的最高画质
# qn=150高清
# qn=250超清
# qn=400蓝光
# qn=10000原画
# 另一个直链api
# http://api.live.bilibili.com/room/v1/Room/playUrl?cid=23585383&qn=400&platform=web
import re

import requests


class BiliBili:

    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():
                    f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl'
                    params = {
                        'cid': room_id,
                        'platform': 'mb',
                        'otype': 'json',
                        'qn': 10000
                    }
                    resp = s.get(f_url, params=params).json()
                    try:
                        durl = resp['data']['durl']
                        real_url = durl[0]['url']
                        # real_url = re.sub(r'live_(\d+)_(\d+)_\d+.m3u8', r'live_\1_\2.m3u8', real_url)
                        return real_url
                    except KeyError or IndexError:
                        raise Exception('获取失败')

                return u()
            else:
                raise Exception('未开播')
        else:
            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(get_real_url(r))

厉害啊

TommyLee9527 avatar May 21 '22 08:05 TommyLee9527

目前可以用的这个链接,我是从哪位大佬的代码修改的,对大佬说一声,谢谢大佬的贡献!

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取哔哩哔哩直播的真实流媒体地址,默认获取直播间提供的最高画质
# qn=150高清
# qn=250超清
# qn=400蓝光
# qn=10000原画
# 另一个直链api
# http://api.live.bilibili.com/room/v1/Room/playUrl?cid=23585383&qn=400&platform=web
import re

import requests


class BiliBili:

    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():
                    f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl'
                    params = {
                        'cid': room_id,
                        'platform': 'mb',
                        'otype': 'json',
                        'qn': 10000
                    }
                    resp = s.get(f_url, params=params).json()
                    try:
                        durl = resp['data']['durl']
                        real_url = durl[0]['url']
                        # real_url = re.sub(r'live_(\d+)_(\d+)_\d+.m3u8', r'live_\1_\2.m3u8', real_url)
                        return real_url
                    except KeyError or IndexError:
                        raise Exception('获取失败')

                return u()
            else:
                raise Exception('未开播')
        else:
            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(get_real_url(r))

你好 我这边没办法使用诶 可以具体说一下吗

yaodooo avatar May 21 '22 11:05 yaodooo

目前可以用的这个链接,我是从哪位大佬的代码修改的,对大佬说一声,谢谢大佬的贡献!

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取哔哩哔哩直播的真实流媒体地址,默认获取直播间提供的最高画质
# qn=150高清
# qn=250超清
# qn=400蓝光
# qn=10000原画
# 另一个直链api
# http://api.live.bilibili.com/room/v1/Room/playUrl?cid=23585383&qn=400&platform=web
import re

import requests


class BiliBili:

    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():
                    f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl'
                    params = {
                        'cid': room_id,
                        'platform': 'mb',
                        'otype': 'json',
                        'qn': 10000
                    }
                    resp = s.get(f_url, params=params).json()
                    try:
                        durl = resp['data']['durl']
                        real_url = durl[0]['url']
                        # real_url = re.sub(r'live_(\d+)_(\d+)_\d+.m3u8', r'live_\1_\2.m3u8', real_url)
                        return real_url
                    except KeyError or IndexError:
                        raise Exception('获取失败')

                return u()
            else:
                raise Exception('未开播')
        else:
            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(get_real_url(r))

你好 我这边没办法使用诶 可以具体说一下吗

你好,你是指这个代码获取不到直链还是指获取到的直链不能用?

lxhlight avatar May 21 '22 13:05 lxhlight

我这边显示的是 Exception: HTTPSConnectionPool(host='api.live.bilibili.com', port=443): Max retries exceeded with url: /room/v1/Room/room_init?id=33 (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:777)'),)) False 我不知道怎样处理

yaodooo avatar May 21 '22 13:05 yaodooo

这个目前可以获得能用的链接,我忘了是从哪位大佬的代码修改的了,对大佬说声抱歉,感谢大佬的贡献!

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取哔哩哔哩直播的真实流媒体地址,默认获取直播间提供的最高画质
# qn=150高清
# qn=250超清
# qn=400蓝光
# qn=10000原画
# 另一个直链api
# http://api.live.bilibili.com/room/v1/Room/playUrl?cid=23585383&qn=400&platform=web
import re

import requests


class BiliBili:

    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():
                    f_url = 'https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl'
                    params = {
                        'cid': room_id,
                        'platform': 'mb',
                        'otype': 'json',
                        'qn': 10000
                    }
                    resp = s.get(f_url, params=params).json()
                    try:
                        durl = resp['data']['durl']
                        real_url = durl[0]['url']
                        # real_url = re.sub(r'live_(\d+)_(\d+)_\d+.m3u8', r'live_\1_\2.m3u8', real_url)
                        return real_url
                    except KeyError or IndexError:
                        raise Exception('获取失败')

                return u()
            else:
                raise Exception('未开播')
        else:
            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(get_real_url(r))

这就是realurl吧,和20年的版本代码差不多

imtipi avatar May 21 '22 15:05 imtipi

我这边显示的是 Exception: HTTPSConnectionPool(host='api.live.bilibili.com', port=443): Max retries exceeded with url: /room/v1/Room/room_init?id=33 (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:777)'),)) False 我不知道怎样处理

参考这个改一下试试,如果还是不行我也不知道怎么解决了

https://blog.csdn.net/y_f_raquelle/article/details/84135535

lxhlight avatar May 21 '22 19:05 lxhlight

master分钟中b站直播获取的链接是m3u8格式,而这段脚本输出的是flv格式,请问是否有办法获得能用的m3u8格式?

Candlend avatar May 25 '22 15:05 Candlend

master分钟中b站直播获取的链接是m3u8格式,而这段脚本输出的是flv格式,请问是否有办法获得能用的m3u8格式?

m3u8格式比flv有什么优点吗?

TommyLee9527 avatar May 28 '22 08:05 TommyLee9527

master分钟中b站直播获取的链接是m3u8格式,而这段脚本输出的是flv格式,请问是否有办法获得能用的m3u8格式?

m3u8格式比flv有什么优点吗?

我目前在Unity中使用AVPro Video这一插件来播放视频流,但该插件只支持m3u8格式。

Candlend avatar May 28 '22 09:05 Candlend

我这边显示的是 Exception: HTTPSConnectionPool(host='api.live.bilibili.com', port=443): Max retries exceeded with url: /room/v1/Room/room_init?id=33 (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:777)'),)) False 我不知道怎样处理

如果有挂代理的话,退出代理软件就正常了

linran913 avatar May 30 '22 14:05 linran913