bilibili-parse 快速上手指南:如何用一套 PHP 接口免费解析 B站视频播放地址
2026/8/27 23:29:04 网站建设 项目流程

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 站点根目录(比如htdocswww),确保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选择第几P1≥1 的整数
q目标清晰度3216 / 32 / 64 / 80 等
type内容类型videovideo / bangumi / cheese
format视频格式flvflv / dash / mp4
otype返回形式jsonjson / url / dplayer

第一组:三个"编号"怎么选

  • av 号是最早的纯数字编号,适合老视频或已知 av 号的场景;
  • bv 号是现在的通用编号,index.php支持直接传入;
  • ep 号专门用于番剧和课程,因为这类内容按"集"组织,没有独立的 bv 号。

如果同时传了 av 和 bv,内部优先按 bv 处理;三者的作用都是先解析出视频的 cid,拿到 cid 才能进一步获取播放地址,所以 cid 也可以被直接指定(属于进阶用法,通常不需要手动传)。

第二组:清晰度 q 到底填多少

q是"目标画质",B站不一定满足你的全部请求,接口会先按编号解析,再对照视频实际可用的清晰度列表自动向下取最近的一档。常用的几档对应关系如下:

q 值画质档位适合的场景
16360P 流畅弱网环境、移动端
32480P 标清默认值,流量与观感较均衡
64720P 高清日常观看的推荐档
801080P 超清对画质有要求的场景
112 及以上2K / 4K 等更高档通常需要登录或大会员

一个需要提前知道的现实:如果目标画质需要会员权限,接口会明确返回"清晰度受限"的提示,而不是静默降级。另外,当format=mp4时,接口内部会把请求画质固定在高清档,这是 B站 HTML5 播放通道的限制,不算 bug。

第三组:三种视频格式的差异

  • flv:默认格式,B站最常见输出,绝大多数播放器和下载工具都能识别;
  • mp4:走 HTML5 通道拿到的封装格式,通用性最强,网页里直接就能播;
  • dash:返回音视频分离的两个地址(videoaudio字段各一条),适合要自己做自适应码率或分别处理音轨的高级玩家。

第四组:内容类型 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 格式的返回略有不同,会多出videoaudio两个字段,分别指向画面流和声音流。

给接口提速:缓存配置怎么开

同一个视频反复被请求,每次都去敲 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 里带有qualityaccept_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询