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

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

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

然后我就开始测试了:

arduino 复制代码
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。

arduino 复制代码
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播放器

arduino 复制代码
mIjkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "user_agent", "Bilibili Freedoooooom/MarkII");

MediaPlayer播放器

kotlin 复制代码
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

相关推荐
TeleostNaCl2 小时前
如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
android·经验分享·adb·android studio·android-studio·android runtime
fatiaozhang95273 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
2501_915918414 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong9514 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海4 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿4 小时前
毕业三年后,我离职了
android·面试
编程乐学5 小时前
安卓非原创--基于Android Studio 实现的新闻App
android·ide·android studio·移动端开发·安卓大作业·新闻app
雅雅姐6 小时前
Android14 init.rc中on boot阶段操作4
android
fatiaozhang95276 小时前
中国移动中兴云电脑W132D-RK3528-2+32G-刷机固件包(非原机制作)
android·xml·电脑·电视盒子·刷机固件·机顶盒刷机
Android出海8 小时前
Google Play账户与App突遭封禁?紧急应对与快速重构上架策略
android·网络·重构·新媒体运营·产品运营·内容运营