bilibili-parse 快速上手指南:如何用一套 PHP 接口免费解析 B站视频播放地址
【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse
需要从 B站拿视频直链却总是绕弯路?bilibili-parse 就是为此而生的开源 PHP 视频解析 API,只需传入 av 号、bv 号或番剧 ep 号,就能在几秒内换回真实可用的播放地址。它还支持画质选择、flv/dash/mp4 多格式输出、JSON 直出以及内置缓存,部署门槛极低。这篇文章会从零带你跑通它,并讲透每一个参数和常见的坑。
先回答一个问题:为什么你拿不到 B站视频的真实地址
在浏览器里打开一个 B站视频,地址栏那一串www.bilibili.com/video/BV...只是"页面地址",并不是视频文件本身。真正的视频流藏在页面背后的播放接口里,普通用户想要把它抓出来,通常会遇到几道坎:
- 右键另存为?B站早就关闭了原生下载入口;
- 用在线下载站?要么收费、要么解析失败、要么夹杂一堆广告;
- 手动翻接口?需要处理签名、请求头、清晰度参数,还要面对随时变动的规则。
如果你同时还在折腾批量抓取系列视频、把内容嵌入自己的网站,或者想把多个 B站视频聚合到自己的系统里,手动复制粘贴根本不可行。这时候,你需要的是一个稳定的"解析接口",而 bilibili-parse 恰好把这件事封装成了一段可以直接调用的 PHP 代码。
bilibili-parse 是什么:一段话讲清它的定位
这个项目本质上是一个"B站播放地址查询中间层":你告诉它视频编号和想要的画质,它去请求 B站官方接口,再把你真正需要的那段视频地址返回给你。整个调用过程不需要登录账号,不需要数据库,不需要配置复杂的密钥体系。
它一次能替你处理四件事:
- 编号自适应:av 号、bv 号、ep 号都能认,不用自己换算;
- 多内容类型:普通投稿(video)、番剧影视(bangumi)、付费课程(cheese)三种场景走不同的官方接口,自动切换;
- 多格式多画质:flv / dash / mp4 任选,画质从 360P 到 1080P 自动匹配,B站只给什么它就返回什么;
- 多输出形式:可以吐 JSON 数据、可以只回一个纯文本 URL,也可以直接生成一个 DPlayer 播放页面。
整个仓库只有三个核心文件:入口脚本index.php、核心类src/Bilibili.php、播放器演示页public/dplayer.html,代码量很小,想改逻辑时翻起来也不吃力。
运行它需要什么条件
要求非常低,满足三条即可:
- PHP 5.4 及以上版本;
- 已启用 Curl 扩展(负责发网络请求);
- 已启用 OpenSSL 扩展(保证 HTTPS 请求正常)。
不需要安装 Composer,不需要数据库,也不需要配 Nginx 的伪静态规则,是标准的"放上去就能用"型项目。
部署只要两步:把接口在本地或服务器上跑起来
第一步:获取代码。在服务器或本机任意目录执行:
git clone https://gitcode.com/gh_mirrors/bi/bilibili-parse第二步:放入站点目录。把克隆下来的整个目录放到 PHP 站点根目录(比如htdocs或www),确保index.php能被 Web 服务器直接访问到即可。
第三步:验证。浏览器打开http://你的域名/index.php?bv=某个有效bv号&otype=json,能看到一段 JSON,说明解析链路已经通了。注意,不带任何参数访问index.php时,它会把项目的说明页public/readme.html展示出来,这属于正常行为,不是报错。
核心参数逐一说透:一张速查表加四组说明
先把所有可用的请求参数列成一张速查表:
| 参数名 | 作用 | 默认值 | 可选值 |
|---|---|---|---|
| av | 老式视频编号(数字) | — | 任意有效 av 号 |
| bv | 现行视频编号(字母数字混合) | — | 任意有效 bv 号 |
| ep | 番剧 / 课程的剧集编号 | — | 任意有效 ep 号 |
| cid | 分P的视频内容编号(进阶) | — | 与视频对应的 cid |
| p | 选择第几P | 1 | ≥1 的整数 |
| q | 目标清晰度 | 32 | 16 / 32 / 64 / 80 等 |
| type | 内容类型 | video | video / bangumi / cheese |
| format | 视频格式 | flv | flv / dash / mp4 |
| otype | 返回形式 | json | json / url / dplayer |
第一组:三个"编号"怎么选
- av 号是最早的纯数字编号,适合老视频或已知 av 号的场景;
- bv 号是现在的通用编号,
index.php支持直接传入; - ep 号专门用于番剧和课程,因为这类内容按"集"组织,没有独立的 bv 号。
如果同时传了 av 和 bv,内部优先按 bv 处理;三者的作用都是先解析出视频的 cid,拿到 cid 才能进一步获取播放地址,所以 cid 也可以被直接指定(属于进阶用法,通常不需要手动传)。
第二组:清晰度 q 到底填多少
q是"目标画质",B站不一定满足你的全部请求,接口会先按编号解析,再对照视频实际可用的清晰度列表自动向下取最近的一档。常用的几档对应关系如下:
| q 值 | 画质档位 | 适合的场景 |
|---|---|---|
| 16 | 360P 流畅 | 弱网环境、移动端 |
| 32 | 480P 标清 | 默认值,流量与观感较均衡 |
| 64 | 720P 高清 | 日常观看的推荐档 |
| 80 | 1080P 超清 | 对画质有要求的场景 |
| 112 及以上 | 2K / 4K 等更高档 | 通常需要登录或大会员 |
一个需要提前知道的现实:如果目标画质需要会员权限,接口会明确返回"清晰度受限"的提示,而不是静默降级。另外,当format=mp4时,接口内部会把请求画质固定在高清档,这是 B站 HTML5 播放通道的限制,不算 bug。
第三组:三种视频格式的差异
- flv:默认格式,B站最常见输出,绝大多数播放器和下载工具都能识别;
- mp4:走 HTML5 通道拿到的封装格式,通用性最强,网页里直接就能播;
- dash:返回音视频分离的两个地址(
video与audio字段各一条),适合要自己做自适应码率或分别处理音轨的高级玩家。
第四组:内容类型 type 别忽略
很多人只用默认的video,但如果你要解析番剧或课程,必须把type切到对应值,否则内部会走错接口,返回一堆报错。三种取值对应三种官方接口:普通投稿、番剧点播、课程点播,各管各的。
三种输出模式怎么选:一次看明白
otype决定了接口返回什么,这是接入方最容易混淆的地方。
模式一:otype=json(默认,最常用)
返回结构化数据,适合程序消费。典型请求:
index.php?bv=BV1xxxxx&q=64&otype=json模式二:otype=url(最省事)
只返回一段纯文本的播放地址,适合在脚本里直接抓取使用。注意它要求format是 flv 或 mp4 这类单地址格式:
index.php?av=14661594&p=2&otype=url模式三:otype=dplayer(开箱即用)
此时接口不解析地址,而是直接把public/dplayer.html这个播放器页面返回给你。页面自带 DPlayer,会自动用 mp4 格式去请求并渲染播放器,想快速预览效果时最方便:
index.php?av=14661594&otype=dplayer把它写进自己的代码:核心类的调用姿势
虽然直接请求index.php已经够用,但更常见的做法是在你自己的 PHP 工程里引入核心类,这样可以在同一进程内反复调用、自由组合参数。核心类的调用方式支持链式写法:
include 'src/Bilibili.php'; use Injahow\Bilibili; $bp = new Bilibili('video'); // video / bangumi / cheese $bp->bvid('BV1xx411c7mD') ->page(1) // 第几P ->quality(64) // 目标画质 ->format('mp4'); // flv / dash / mp4 $result = json_decode($bp->result(), true); if ($result['code'] === 0) { echo $result['url']; // 直接拿到播放地址 }result()是总入口,它会自动完成"解析 cid → 请求播放接口 → 校验结果 → 返回数据"全流程,只要code为 0 就代表解析成功。如果缓存开启,它还会先查缓存、命中就直接返回。
返回值长什么样
flv / mp4 格式的典型返回:
{ "code": 0, "quality": 64, "accept_quality": [64, 32, 16], "url": "https://...(真实播放地址)" }dash 格式的返回略有不同,会多出video和audio两个字段,分别指向画面流和声音流。
给接口提速:缓存配置怎么开
同一个视频反复被请求,每次都去敲 B站接口既不划算也不礼貌。核心类内置了缓存机制,支持两种后端:
// 文件缓存:把结果写入 cache/cid 目录,默认缓存 1 小时 $bp->cache(true)->cache_time(3600); // APCu 缓存:内存级,更快,需要服务器装了 apcu 扩展 $bp->cache(true, 'apcu')->cache_time(3600);几个细节值得注意:
- 缓存文件按"视频 cid + 清晰度 + 格式"组合命名,不同画质的请求会各自缓存,互不干扰;
- 缓存有效期下限是 60 秒,即使你传了 10 秒也不会生效;
- 使用文件缓存时,需要确保
cache/cid目录有写入权限,否则缓存会静默失败; - 对频繁变动的视频(比如正在直播回放、刚更新的剧集),可以把缓存时间调短一些。
这些场景里,它能真正派上用场
内容创作者收集素材时:写个循环脚本,把一串 bv 号挨个请求 JSON,提取出指定画质的地址,再配合下载工具就能批量入库,比手动一个个存方便得多。
教育平台做资源整合时:把 B站上的公开课程地址解析后嵌入自己的学习页面,学生不用跳转就能观看,同时保留来源链接。
个人网站或博客做媒体增强时:用otype=dplayer生成播放器页,或者在自己前端用 DPlayer 配合解析接口,几行代码就能把 B站视频"搬"进自己的页面。
企业内部做内容归档时:接口返回的 JSON 里带有quality和accept_quality,可以作为内容质量的判断依据,方便归档时打标签。
常见报错排查清单:遇到问题先对照这张表
| 返回内容 | 含义 | 处理建议 |
|---|---|---|
code: 1+unknown cid | 没解析出视频内容编号 | 检查编号是否打错、视频是否已失效 |
code: 1+无访问权限 | 内容属于预览或受限状态 | 该视频无法公开解析,换一个源 |
code: 1+获取信息失败 | 播放接口没返回可用数据 | 试试切换 format,或确认该视频类型与 type 是否匹配 |
code: 1+视频清晰度受限 | 目标画质需要登录或大会员 | 降低 q 值,或接受较低画质 |
| 访问 index.php 显示说明页 | 没传 av / bv / ep 参数 | 这是设计好的引导页,补上参数即可 |
| 请求超时或空结果 | 服务器到 B站网络不稳 | 检查服务器出口网络,必要时走代理 |
另外提醒一句:q值传得过高不会报错,内部会自动向下收敛到 B站实际允许的画质;但如果你需要精确控制返回质量,建议把q和返回 JSON 中的accept_quality对照着看。
写在最后:它擅长什么,又有什么边界
bilibili-parse 的价值在于"把 B站复杂的播放接口封装成一行参数",让解析这件事从玄学变成可复用的工程能力。它免费、开源、部署简单,适合内容创作者、PHP 开发者、教育从业者和个人站长快速落地。
同时也要说清它的边界:它只解析 B站公开可访问的内容,付费视频和会员专属画质无能为力;它返回的是播放地址,本身不提供下载能力,下载需要再配合下载工具;接口调用也有频率限制,别在短时间内暴力请求。
如果你正好需要一套不折腾的 B站视频解析方案,照着这篇文章的步骤部署一次,再拿自己的视频编号试几个参数组合,很快就能摸清它的脾气。动手跑一遍,比读十遍文档都管用。
【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考