B站视频解析如何实现?PHP 视频解析 API 三步拿到播放直链

📅 2026/8/14 13:24:46
B站视频解析如何实现?PHP 视频解析 API 三步拿到播放直链
B站视频解析如何实现PHP 视频解析 API 三步拿到播放直链【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse有没有过这种经历在 B 站刷到一个讲解特别通透的教学视频想下载下来在地铁里接着看或者想把这段内容嵌进自己的学习平台结果右键没有下载入口网页源码翻到底也只看到一堆加密字段你眼前的是播放器页面而真正能保存、能二次使用的是藏在这套页面背后的播放直链。bilibili-parse 就是来解决这道坎的开源 PHP 视频解析 API给它一个视频编号它替你把直链取回来。一、一个真实的困扰网页能播文件却够不着先说一个发生在我身边的场景。朋友负责公司内部的技能培训平台领导提了个需求把几段优秀的 B 站公开教程整合进平台让新员工不用跳转外部站点就能看完。他一开始走了两条弯路。第一条是直接 iframe 嵌入视频页结果页面上广告、推荐流、登录弹窗全跟着进来了体验一塌糊涂第二条是想办法抓取视频文件翻遍浏览器开发者工具看到的是分片地址、加密参数、还有一串过期时间手动拼根本拼不出来。卡了两天差点用录屏软件去录。问题到底出在哪把视频网页想象成餐厅的菜单把真实存在的视频文件想象成后厨已经做好的菜。菜单给你看的是介绍不是菜本身。B 站的视频播放页就是菜单而真正可下载、可嵌入、可离线缓存的播放直链是后厨那道菜。这两者之间隔着点菜、下单、传菜的全过程而 bilibili-parse 扮演的正是那个传菜窗口——你把菜名递过去它把做好的菜端到你面前。二、五分钟认识它它到底帮你做了什么一句话概括bilibili-parse 接收视频编号返回真实可用的播放地址。它内部替你完成了三步脏活累活认编号——支持av号旧编号、bv号新编号和ep剧集号三种身份标识你给哪种它都能认。发请求——模拟一个正常浏览器的身份UA、Referer、Cookie 都替你伪装好了向 B 站接口发起请求拿到原始视频数据。取直链——从返回数据中解析出带时效的播放地址按你指定的格式吐出来。它的输出方式很灵活适合不同用途参数名含义默认值可选值说明av / bv / ep视频标识无三者至少给一个定位你要解析哪个视频p分集页码1≥1多 P 视频选第几集q清晰度3216 / 32 / 64 / 80等级越高画质越好type视频类型videovideo / bangumi普通视频还是番剧format视频格式flvflv / dash / mp4影响返回的链接结构otype输出形式jsonjson / url / dplayer程序用还是浏览器用参数的逻辑很直白identify告诉它是谁 configure告诉它要什么质量 output告诉它结果怎么给。没有复杂的配置项每一个参数单独看都能猜出含义。三、第一次亲手搞定三步完成部署并跑通第一个请求部署成本低到可以忽略前提是服务器上已有 PHP 环境要求 PHP 5.4 及以上并安装 Curl 和 OpenSSL 扩展。第一步获取项目代码git clone https://gitcode.com/gh_mirrors/bi/bilibili-parse第二步把项目目录放到支持 PHP 的站点下比如 Nginx 或 Apache 的 web 根目录保持目录结构不动index.php是访问入口src/Bilibili.php是核心解析类。第三步浏览器打开入口页面验证环境不带任何参数访问index.php时页面会展示默认说明文档带参数访问时它才开始干活。试试下面这个请求你的域名/index.php?av14661594p1q64otypejson这段 URL 的意思是解析av14661594这个视频的第一集清晰度要 64结果以 JSON 格式返回。你会收到类似这样的数据{ code: 0, quality: 64, accept_quality: [127, 125, 120, 116, 112, 80, 64, 32, 16], url: https://upos-sz-mirror..../xxx.flv?t... }code为 0 表示成功url就是可以直接用于下载或播放的直链。从克隆代码到拿到第一个结果全程不超过五分钟。如果想在自己的 PHP 程序里调用代码同样非常简洁?php require src/Bilibili.php; use Injahow\Bilibili; $bp new Bilibili(video); // 普通视频 $bp-bvid(BV1xx4y1x7zz) // 指定视频 BV 号 -page(1) // 第一集 -quality(64) // 目标清晰度 -format(mp4); // 要 mp4 格式 echo $bp-result(); // 输出 JSON 结果这段代码做的事情和刚才的 URL 完全一致区别在于它适合写进你自己的项目里反复调用——比如循环处理一个视频列表把返回的直链批量存入数据库。四、把它用进日常三类用户各有各的玩法工具只有一个用的人不同用法也完全不同。面向学习者一分钟拿到离线视频只想下载某个视频离线看不需要写任何代码。用浏览器直接访问 URL 形式接口把otype换成url接口会直接吐出纯文本的直链你的域名/index.php?av14661594p2q32otypeurl把这个链接粘贴到下载工具里即可保存。清晰度选 32 比较稳妥——兼顾画质与文件体积移动设备上完全够用。面向开发者把它当成一个视频数据中间层如果你在搭建自己的学习平台、资料站或工具站把 bilibili-parse 当作一层视频地址网关最合适前端收集用户提交的 av/bv 号后端调用类方法解析把结果 JSON 返回给前端播放器。注意给这个入口加上访问频率限制避免被滥用拖垮接口。面向进阶玩家解析番剧与付费课程src/Bilibili.php中除了video还内置了bangumi番剧和cheeseB 站课堂课程两种类型。解析番剧时把 type 设为bangumi并用ep剧集号定位部分会员内容需要在实例上设置cookie()或access_key()才能通过权限校验这一点在源码注释里有明确说明。五、你可能踩过的坑现象、原因、解法实践中最常遇到的几个问题按现象 → 原因 → 解法整理如下现象原因解法返回无访问权限目标视频是会员专享或需要登录为实例设置有效cookie后重试确实无权访问就换视频返回 unknown cid视频编号填错或 av/bv 互转时抄漏了字符回到视频页核对编号bv号注意大小写与完整长度能解析但链接打不开直链带时效保存太久已过期尽量在解析后立即使用程序化场景改为实时解析并配合缓存请求的清晰度没生效该视频未提供那么高的码率工具会自动向下修正这是正常保护逻辑参考返回的accept_quality列表取值请求频繁后被限速触发了频率限制开启缓存减少重复请求或增加请求间隔六、让工具更好用三个值得深入研究的能力第一次跑通只是开始把下面三处吃透这套工具才算真正成为你工具箱里顺手的那一件。1. 缓存机制一劳永逸地降低请求压力。src/Bilibili.php内置了文件缓存和 APCu 内存缓存两种方案默认一小时有效期$bp-cache(true) // 开启文件缓存 -cache_time(3600); // 缓存 1 小时 // 内存充足时也可以换用 APCu $bp-cache(true, apcu)-cache_time(3600);开启后同一视频的重复请求会直接命中缓存对批量处理场景帮助极大。注意使用文件缓存时需要预先在项目下创建cache/cid目录。2. dash 格式拿到音画分离的高质量流。把format设为dash返回结果不再是单个 URL而是video与audio两个独立地址。这是 B 站高清视频的真实存储形态画质上限更高如果后续要做离线合流可以配合 ffmpeg 之类的工具把音视频合并适合对清晰度有执念的玩家。3. 清晰度的自动向下修正逻辑。你请求 64 清晰度但该视频最高只提供 32工具不会报错而是自动降档返回 32 并如实标注quality字段。这让接口在对接真实世界时足够宽容不需要调用方自己去猜每个视频支持到什么码率。七、写在最后回到开头那个够不着视频文件的困扰现在你应该已经看清问题不在于视频不存在而在于缺少一条把它从页面里取出来的通道。bilibili-parse 就是这样一条通道——普通用户用它下载离线视频开发者用它搭建视频数据接口进阶玩家研究它的请求与解析逻辑来理解流媒体分发机制。本项目代码量不大核心逻辑集中在src/Bilibili.php一个文件里配合public/dplayer.html的播放器演示和public/readme.html的说明文档学习成本相当友好。最后提醒一句技术本身是中性的请把这类解析工具用在个人学习、研究或平台整合的正当场景中尊重创作者版权遵守视频平台的服务条款。先从解析一个自己熟悉的视频开始跑通流程后再尝试批量场景动手比空想更能建立手感。【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考