B站视频解析快速上手:用 bilibili-parse 把任意B站视频变成直链
【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse
B站视频解析这件事,看起来简单,做起来全是坑。想把 B 站的教程视频搬到自己的平台上,或下载到手机里离线看,直接复制分享链接根本不行——你拿到手的只是"门牌号",不是"钥匙"。而一个叫bilibili-parse的开源 PHP 项目,恰好补上了这块拼图,让我这个小白只花了十分钟就跑通了第一个解析请求。
周五晚上,老周卡在"最后一步"
老周是朋友介绍给我认识的一位网校老师。他要做一个"课后回放"栏目,把 B 站上公开的优质课程视频整合进自己的学习平台。按理说,技术难度不高:找到视频、拿到播放地址、存进数据库、前端套个播放器,完事。
结果他卡住了整整两天。不是不会写代码,是拿不到视频地址。
他把 B 站页面翻了个底朝天,开发者工具里的网络面板打开又关闭,盯着那一堆看不懂的加密参数发愁——真正的视频地址藏在一个"套娃"结构里,浏览器只肯给播放器看,不给人看。
那些"看似可行"的路,为什么全走不通
在遇到 bilibili-parse 之前,老周把市面上的方案试了个遍,槽点一个比一个多:
- 录屏:一节课 40 分钟,录完还要剪辑转码,1 小时视频要耗掉半天,画质还缩水。
- 浏览器插件:装了好几个"B站视频下载"插件,要么已失效,要么点开弹出一堆广告。
- 在线解析网站:好不容易找到一个能用的,结果高清要付费,充值完又说"该视频不支持"。
- 手动翻网络请求:能拿到地址,但地址带时效,过几个小时就失效,得重新翻一遍。
这些方案有一个共同问题:每次都要人工干预,无法批量,更没法集成进自己的系统。对于要批量同步几十节课的老周来说,等于每天都有活儿要干。
主角登场:一个"帮你跑腿"的开源 PHP 小项目
bilibili-parse 干的事,一句话就能说清:你给它一个视频编号,它返回给你一条能直接播放或下载的直链。
如果打个比方,它像一个尽职尽责的"代购"——B站把真实视频地址锁在"柜台后面",普通人不让进,而 bilibili-parse 知道该走哪个正规窗口、带上什么"证件"(请求头、编号参数),把地址替你取出来,再原封不动交到你手里。
它整个项目就 4 个文件,核心逻辑全部集中在一个类里:
src/Bilibili.php ← 核心解析类,所有魔法都在这 index.php ← 访问入口,接收参数并输出结果 public/dplayer.html ← 现成的播放器演示页 public/readme.html ← 内置的使用说明页支持的东西比我预想的多得多:不仅支持普通的 av 号 / bv 号,还能解析番剧(bangumi)和付费课程(cheese);输出格式有三种:flv、dash、mp4;返回形式也有三种:json(给程序用)、url(直接拿直链)、dplayer(直接渲染一个播放器页面)。
三步跑通你的第一次解析
上手门槛低到几乎不需要解释,跟着走一遍就行。
第一步:准备好环境。一台装了 PHP 5.4+ 的服务器即可,需要curl和openssl扩展——绝大多数虚拟主机都自带,不用额外折腾。
第二步:拿到代码。在自己的网站目录下执行:
git clone https://gitcode.com/gh_mirrors/bi/bilibili-parse第三步:访问。用浏览器打开你的域名下的index.php,拼上参数。比如:
index.php?av=14661594&p=1&q=64&otype=json几秒钟后,你会看到一坨 JSON,里面藏着url字段——恭喜,第一条 B 站视频直链到手了。就这么简单,没有注册、没有 Token、没有密钥。
参数一共就这几个,记性不好也没关系,访问入口页(不带任何参数)会自动展示一份说明文档:
| 参数 | 作用 | 备注 |
|---|---|---|
| av / bv / ep | 视频编号,三选一 | 普通视频用 av/bv,番剧用 ep |
| p | 分集页码 | 多 P 视频选集数,默认 1 |
| q | 清晰度 | 常见 16/32/64/80,默认 32 |
| type | 视频类型 | video / bangumi / cheese |
| format | 视频格式 | flv / dash / mp4 |
| otype | 输出形式 | json / url / dplayer |
三个真实场景,三组"改造前后"
工具本身是死的,会用才是活的。老周后来又把这套东西玩出了花,下面三个场景最典型。
场景一:网校批量同步课程视频
改造前:每加一节课,老周要手动找地址、人工填入后台,一节课折腾十几分钟,还经常因为链接过期返工。
改造后:PHP 代码里直接调用核心类,循环处理整个课程列表:
use Injahow\Bilibili; $bp = new Bilibili('video'); // 普通视频 $bp->bvid('BV1xx4y1x7zz') // 传视频编号 ->page(1) // 第 1 集 ->quality(64) // 高清 ->format('mp4') // MP4 格式 ->cache(true)->cache_time(3600); // 缓存 1 小时 $result = json_decode($bp->result(), true); echo $result['url'];代码链路是现成的:bvid()设编号 → 类内部自动解析出cid→ 请求 B 站播放接口 →result()吐出直链。缓存一开,同一条链接当天重复请求直接从本地读,服务器几乎零开销。几节课的同步从"半天人工"变成了"一键跑批"。
场景二:通勤路上的离线学习
改造前:地铁里想复习白天的课,视频打开就转圈,一顿一卡,2G 流量还扛不住。
改造后:otype=url一行参数,把直链用短信或二维码发到自己手机上,在 Wi-Fi 环境点开就能下载。推荐用q=32——兼顾画质和文件体积,一部 40 分钟的课也就一两百兆,装进口袋随时复习。
场景三:给网站加个视频播放器
改造前:想在自己的页面上播 B 站视频,要么用 iframe 嵌原站(带弹幕带评论,样式控不住),要么研究半天视频组件。
改造后:项目里自带现成的public/dplayer.html播放器页,直接访问:
index.php?av=14661594&otype=dplayer它会返回一个基于 DPlayer 的完整播放页面,套上自己的域名就能用,样式、画质都归你说了算。
老周踩过的坑,提前帮你避开
新手最容易在这几个地方翻车,提前打预防针:
坑一:清晰度"向上取整"的误解。代码里的quality()有个小机关——你传50,它会自动向下匹配到 48 或 32 这一档可用的值,而不是直接报错。所以想要 80 高清,直接传 80 就好,别传个不上不下的数然后疑惑"怎么没生效"。
坑二:会员视频会明确告诉你"没门"。视频清晰度受限时,返回结果是"视频清晰度受限,可能需要会员",这不是 bug。真要解析会员画质,可以给类传入你自己的cookie(),但请务必只用于你确实有权限观看的内容。
坑三:dash 格式是"分家的"。format=dash返回的是独立的视频流和音频流两个地址,需要播放器自行合并,DPlayer 这类播放器可以处理,但你要是拿它去"下载单个文件",会傻眼。想要单一文件,老老实实用mp4。
坑四:开启缓存前先建好目录。文件缓存的路径是项目下的cache/cid/目录,如果目录不存在或没有写权限,缓存功能会静默失败(不影响解析,但缓存不生效)。顺手 mkdir 一下最省心。
坑五:网络环境。服务器如果访问不了 B 站接口(比如某些海外主机),会解析失败。此时可以用proxy()方法给 curl 指定代理,源码里这个口子是留好的。
效果见证:从"找地址 20 分钟"到"跑批 3 秒"
老周把整套流程跑顺之后,我拉了一下他后台的数据:
- 全站 30 节课程批量同步,人工耗时从 10 小时+ 压缩到分钟级;
- 开启缓存后,热门课程直链的重复请求命中本地缓存,响应基本在毫秒级;
- 播放页从"加载原站 iframe"换成自建 DPlayer 后,首屏速度明显提升,页面里也不再出现无关推荐流。
对一个只有 4 个文件的小项目来说,这个投入产出比相当可观——它解决的不是"写代码"的问题,而是"省人力"的问题。
你的下一步行动清单
如果你也在做视频站、课程平台,或者单纯想找个靠谱的 B 站视频下载手段,bilibili-parse 值得一试:
- 先把项目 clone 下来,用文中的第一个 URL 跑通一次解析,感受一下返回的 JSON 长什么样;
- 翻一翻
src/Bilibili.php源码——不到 600 行,注释清楚,是很好的 PHP 学习样本; - 尝试解析一个番剧(
type=bangumi)或课程(type=cheese),体验不同编号体系的差异; - 把解析逻辑接进你自己的项目,加上错误处理和缓存策略,让它变成你平台的一部分。
如果你也用它做过什么有意思的事,或者在哪一步卡住了,欢迎留言告诉我。技术这东西,一个人琢磨容易钻牛角尖,聊着聊着就通了——你的下一个"五分钟跑通",说不定就在这篇文章的评论区里。
【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考