bili直播解析工具

方案概述

采用 “中间人转发” 的模式:

  1. 前端 (你的网页):获取用户输入的 B站直播间链接。

  2. 后端 (你的服务器 PHP):代替用户向 Bilibili 官方 API 发送请求,获取真实的 .m3u8.flv 直播流地址。

  3. 回传:后端将地址返回给前端,前端自动复制到剪贴板。

工作原理详解

  1. 输入解析

    • 用户输入 https://live.bilibili.com/123

    • PHP 正则表达式提取出数字 123

  2. 获取真实 RoomID

    • B站有很多“短号”(例如 6号房),不能直接用来请求流地址。

    • PHP 访问 room_init 接口,将 123 转换为真实的内部 RoomID(比如 5440)。

  3. 获取流媒体 (m3u8)

    • PHP 访问 playUrl 接口。

    • 关键点:我们在参数中指定了 platform=h5

    • B站对 H5 平台通常返回 .m3u8 (HLS) 格式。这种格式对网络波动容忍度高,且VRChat 的 Unity 播放器原生支持

    • 如果是 PC 端参数,通常返回 .flv,这在 VRChat 中往往无法播放。

  4. 复制体验

    • JavaScript 使用 navigator.clipboard API

技术架构与原理

本项目采用 前后端分离 的思路,但部署在同一个 Web 服务下。

  • 服务端 (Backend): PHP

    • 利用 PHP 强大的 cURL 库充当代理,伪装请求 Bilibili 官方接口。

    • 运行环境:宝塔面板 (AAPanel) + Nginx + PHP 7.4。

  • 客户端 (Frontend): HTML5 + Bootstrap 5 + Vanilla JS

    • 利用 fetch API 与后端通信。

    • 利用 navigator.clipboard API 管理剪贴板。

工作流程图

用户剪贴板 -> 前端 JS 读取 -> PHP 后端 (伪装请求) -> Bilibili API -> 获取 .m3u8 -> PHP 返回 JSON -> 前端 JS 写入剪贴板


4. 核心难点与解决方案 (Troubleshooting)

在开发过程中,我遇到了几个关键的技术障碍,以下是解决思路:

难点一:Bilibili 的反爬虫机制 (403 Forbidden)

问题:直接使用 PHP file_get_contents 请求 B站接口时,会返回 403 错误或空数据。 解决: B站会对请求头(Header)进行校验。我通过 PHP cURL 手动设置了 User-Agent,伪装成手机浏览器端访问,成功绕过限制。

PHP

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3...)');

难点二:直播间“短号”解析

问题:B站很多热门主播使用的是“短号”(如 live.bilibili.com/6),直接用这个 ID 去请求流地址接口会失败。 解决: 引入“两步解析法”:

  1. 先调用 room_init 接口,将短号(Short ID)转换为真实房间号(Room ID)。

  2. 再用真实房间号去请求流地址。

难点三:VRChat 的格式兼容性

问题:B站默认 PC 端接口返回的是 .flv 格式,Unity 播放器对其支持极差,经常黑屏或只有声音。 解决: 在请求流地址接口时,强制指定参数 platform=h5。这样 B站后端会认为请求来自手机 H5 页面,从而返回兼容性极佳的 HLS (.m3u8) 格式,完美适配 VRChat。

难点四:浏览器的剪贴板安全策略

问题:在测试时发现 JS 无法读取剪贴板,报错 DOMException: Document is not focused 或权限拒绝。 解决: 现代浏览器安全规范规定,navigator.clipboard API 必须在 HTTPS 环境下才能运行。我通过宝塔面板申请了 Let’s Encrypt 免费证书,开启 HTTPS 强制跳转,解决了此问题。


5. 部署教程 (基于宝塔面板)

如果你也想搭建一个类似的工具,只需以下几步:

步骤 1:环境准备

  • 拥有一台服务器,安装 宝塔面板

  • 安装 NginxPHP (推荐 7.4 或 8.0)。

  • 在宝塔中添加站点,解析好域名。

步骤 2:部署后端 (api.php)

在网站根目录新建 api.php,负责处理 API 转发。核心代码逻辑如下:

  1. 接收前端传来的 id

  2. 正则提取数字。

  3. 请求 B站 room_init 获取真实 ID。

  4. 请求 B站 playUrl 获取 m3u8 链接。

  5. 返回 JSON 数据。

步骤 3:部署前端 (index.html)

在网站根目录新建 index.html

  • 引入 Bootstrap 5 CDN 美化界面。

  • 编写 JS async/await 函数处理“读取-请求-写入”的异步逻辑。

  • 添加 CSS 变量实现深色模式和毛玻璃效果。

步骤 4:开启 HTTPS (至关重要)

在宝塔站点设置中 -> SSL -> Let’s Encrypt -> 申请并开启。没有 HTTPS,剪贴板功能将失效。


6. 总结

ShanYbili 项目虽然体量不大,但麻雀虽小五脏俱全。它解决了一个具体的垂直场景痛点(VR 社交看直播),并在这个过程中实践了反向代理、API 逆向分析、前端异步交互以及现代 UI 设计。

未来的改进方向

  • 增加对 B站视频稿件(非直播)的解析支持。

  • 增加历史记录功能,方便找回之前的直播间。

希望这个项目能为你的 VRChat 之旅带来便利!

访问blive.shany.cc即可使用

本项目使用AI辅助完成,项目开源免费,禁止二次制作转发,直播内容与本项目无关。


bili直播解析工具
https://blog.shany.cc/archives/bililive
作者
Shany Jin
更新于
2026年02月06日
许可协议