哔哩哔哩去水印API源码二开教程
本文详细介绍哔哩哔哩去水印API的二次开发流程,包含源码解析、接口对接、本地部署与常见问题排查,适合PHP/Python初学者快速上手。
一、什么是哔哩哔哩去水印 API
哔哩哔哩(B 站)视频默认带有作者水印和平台 Logo,所谓"去水印"通常指通过解析视频真实地址,去除浏览器端叠加的浮层水印,而非破解平台加密。本文介绍的二次开发思路,是基于公开的网页接口进行数据抓取与重组,从而在自己的程序里实现"一键解析"功能。
提示:本文仅讨论技术原理与代码实现,所有素材版权归原作者所有,请勿用于商业爬取或侵权分发。
二、二次开发前的准备工作
1. 环境与工具
- 编程语言:推荐 PHP 7.4+ 或 Python 3.8+,社区资源丰富。
- 本地环境:PHPStudy、XAMPP 或 Docker 一键部署。
- 调试工具:Postman、ApiPost、Charles 抓包工具。
- 代码编辑器:VS Code、PhpStorm、PyCharm 均可。
2. 必备知识
- HTTP 请求与 JSON 数据解析。
- 正则表达式或 XPath 提取网页字段。
- 基础的接口签名(sign)生成思路。
三、源码解析与接口定位
1. 抓包找接口
打开 B 站任意视频页,按 F12 进入 Network 面板,搜索关键词 playurl 或 cid,可以找到视频真实流地址接口。重点关注以下字段:
- 请求方式:通常为 GET 或 POST。
- 请求参数:
avid、cid、qn、fnval、fourk、platform。 - 返回数据:包含
durl或dash字段,即视频流地址。
2. 关键参数说明
- avid:视频的 AV 号。
- cid:视频对应的章节 ID,决定播放哪个分P。
- qn:清晰度,80 为 1080P,112 为 1080P+ 高码率,116 为 4K。
- fnval:1 表示 MP4 格式,16 表示 DASH 格式。
四、PHP 版 API 源码示例
下面给出一个最小可运行的 PHP 示例,演示如何通过 avid 和 cid 获取无水印视频地址:
<?php
header('Content-Type: application/json; charset=utf-8');
$avid = $_GET['avid'] ?? '';
$cid = $_GET['cid'] ?? '';
if (!$avid || !$cid) {
echo json_encode(['code' => 400, 'msg' => '参数缺失']);
exit;
}
$url = "https://api.bilibili.com/x/player/playurl?avid={$avid}&cid={$cid}&qn=80&fnval=1&fourk=1&platform=html5";
$cookie = '你的B站登录Cookie'; // 建议使用登录态 Cookie 提高成功率
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Referer: https://www.bilibili.com',
'Cookie: ' . $cookie
]);
$res = curl_exec($ch);
curl_close($ch);
$data = json_decode($res, true);
if (!empty($data['data']['durl'][0]['url'])) {
echo json_encode([
'code' => 200,
'url' => $data['data']['durl'][0]['url'],
'quality' => $data['data']['quality']
]);
} else {
echo json_encode(['code' => 500, 'msg' => '解析失败']);
}
?>代码要点解读
- 必须携带
Referer,否则会被风控拦截。 - 登录 Cookie 能提升高清晰度视频的获取成功率。
- 返回的
durl[0].url即为无水印视频流地址,可直接在前端<video>标签播放。
五、Python 版源码示例
如果你更熟悉 Python,可以使用 requests 库快速实现:
import requests
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/parse')
def parse():
avid = request.args.get('avid')
cid = request.args.get('cid')
if not avid or not cid:
return jsonify({'code': 400, 'msg': '参数缺失'})
api = f'https://api.bilibili.com/x/player/playurl?avid={avid}&cid={cid}&qn=80&fnval=1&fourk=1'
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://www.bilibili.com'
}
res = requests.get(api, headers=headers).json()
url = res.get('data', {}).get('durl', [{}])[0].get('url')
return jsonify({'code': 200, 'url': url})
if __name__ == '__main__':
app.run(port=5000)
六、前端调用与效果展示
前端只需一个简单的 HTML 页面即可调用上述接口:
- 输入框:粘贴 B 站视频链接。
- 解析按钮:JS 提取链接中的
BV号或av号,再请求/parse接口。 - 视频标签:拿到地址后赋值给
src,即可无水印播放。
小技巧:BV 号转 AV 号可借助官方公开算法或第三方开源库,避免重复造轮子。
七、常见问题排查
- 返回
-101未登录:在请求头中补全 Cookie。 - 返回
-403权限不足:检查 Referer 是否为bilibili.com域名。 - 视频画质只有 480P:登录账号并开启大会员,再提高
qn参数。 - 接口频繁失效:B 站接口更新较快,建议关注开源社区的版本更新日志。
八、二次开发注意事项
- 遵守 B 站
robots.txt与用户协议,控制请求频率。 - 不要将接口用于大规模爬取,避免对官方服务器造成压力。
- 项目上线前做好日志记录与异常告警,便于排查。
- 尊重视频作者版权,去水印仅用于个人学习与备份。
温馨提示
去水印 API 的本质是调用官方公开接口,技术上并不复杂,但请务必在合法合规的前提下使用。本文提供的源码仅供学习参考,请勿用于任何侵犯版权或违反平台规则的场景。希望这篇教程能帮你快速搭建属于自己的解析服务,如有疑问欢迎在评论区留言讨论。

常见问题(FAQ)
如何获取哔哩哔哩去水印API源码二开教程的无水印内容?
复制分享链接到玲珑去水印工具,在线解析即可获得无水印原画质文件。