哔哩哔哩直播链接报403解决办法

最近投屏接到客诉说苹果哔哩哔哩客户端投直播会显示播放失败。

我测试发现安卓端哔哩哔哩是正常的,某投屏软件也能正常播放,我对此感到困惑。通过tcpdump分析,发现它的ijk播放器在访问链接时改变了User Agent。

然后我就开始测试了:

headers.put("User-Agent", "Mozilla/5.0.BiliTV/1.7.2"); //正常
headers.put("User-Agent", "Bilibili Freedoooooom/MarkII");//正常
headers.put("User-Agent", "Linux Androi");//正常
headers.put("User-Agent", "Android");//403 forbidden
headers.put("User-Agent", "stagefright");//403 forbidden
headers.put("User-Agent", "a");//正常
headers.put("User-Agent", "Androi");//正常
headers.put("User-Agent", "stagefrigh");//正常

经测试发现含有Android或者stagefright都会导致访问403,其他都正常。

而安卓默认的User Agent就包含了Android和stagefright。

AString MakeUserAgent() {
    AString ua;
    ua.append("stagefright/1.2 (Linux;Android ");
#if (PROPERTY_VALUE_MAX < 8)
#error "PROPERTY_VALUE_MAX must be at least 8"
#endif
    char value[PROPERTY_VALUE_MAX];
    property_get("ro.build.version.release", value, "Unknown");
    ua.append(value);
    ua.append(")");
    return ua;
}

解决

既然知道了问题原因,那么解决起来就很简单了,当判断是哔哩哔哩的直播链接时,改变播放器的user agent。

ijk播放器

mIjkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "user_agent", "Bilibili Freedoooooom/MarkII");

MediaPlayer播放器

headers.put("User-Agent", "Bilibili Freedoooooom/MarkII");
mPlayer.setDataSource(this, Uri.parse(videoUrl), headers);

注意,由于谷歌的bug,安卓5.0和5.1不支持该设置

[MediaPlayer ignores User-Agent header 37018604] - Issue Tracker

…/MediaHTTP.cpp · Gerrit Code Review

其他

当然也可以通过本地代理来解决,拦截播放请求就可以随意改变user agent了,这也可以解决安卓5.0以下MediaPlayer不支持某些tls版本的问题。

参考链接:

哔哩哔哩视频403Forbidden原因

浅度剖析B站的新 -352 风控策略 - A Salty Blog

### 实现直播弹幕抓取与显示的方法 #### 使用 POST 请求获取实时弹幕数据 为了从直播平台上抓取实时弹幕,需要定位到用于发送请求的具体 URL 和所需提交的数据。这通常涉及到利用浏览器的开发者工具分析网络流量,找出正确的 API 接口[^1]。 ```python import requests url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=' + room_id # 替换为实际房间号对应的 oid 参数 response = requests.get(url) if response.status_code == 200: xml_data = response.content.decode('utf-8') else: print("Failed to fetch data.") ``` 这段代码展示了如何通过 GET 请求访问特定直播间 ID 的 XML 形式的弹幕列表。不过需要注意的是,在某些情况下,特别是当观众数量较少时,连续两次获取的结果可能是相同的,因为期间并没有新的弹幕被发送出来[^2]。 #### 处理重复弹幕记录 为了避免存储或展示重复的弹幕消息,可以采用数据库的方式保存每条收到的信息,并设置唯一约束条件防止重复录入。具体来说,可以选择以 `user_id` 和 `timestamp` 组合作为主键,确保同一名用户不会在同一时刻发出两条不同的评论。 ```sql CREATE TABLE IF NOT EXISTS danmu ( user_id VARCHAR(50), timestamp DATETIME, content TEXT, PRIMARY KEY (user_id, timestamp) ); INSERT INTO danmu VALUES ('example_user', NOW(), 'This is a test message'); ``` #### WebSocket 连接实现实时监听 除了传统的 HTTP 请求外,还可以考虑建立 WebSocket 长连接来接收来自服务器推送的新弹幕事件。这种方式更加高效且即时性强,适合构建互动性较高的应用场景[^3]。 ```javascript const wsUrl = "wss://broadcastlv.chat.bilibili.com/sub"; let websocket; websocket = new WebSocket(wsUrl); websocket.onmessage = function(event){ let msgData = JSON.parse(event.data); console.log(msgData.info[1]); // 输出用户名 console.log(msgData.info[2][1]); // 输出弹幕内容 }; ``` 上述 JavaScript 代码片段演示了怎样创建一个 WebSocket 客户端实例并与 B 站官方提供的地址相连,从而能够持续不断地捕获最新的聊天信息并将其打印至控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值