如何对接哔哩哔哩去水印API(Python/PHP/Java)
一、为什么需要哔哩哔哩去水印 API
在内容二次创作、视频剪辑、数据分析等场景下,很多开发者希望获取哔哩哔哩(B 站)视频的原始���水印链接,用于本地保存、素材整合或自动化处理。由于 B 站官方并未对外公开通用的"去水印"接口,市面上常见的需求实际上是通过第三方数据服务商提供的 API 来解析视频直链。本教程将以一个通用的第三方解析 API 为例,演示如何使用 Python、PHP、Java 三种语言完成对接。
提示:使用第三方 API 时,请务必遵守 B 站用户协议、相关版权法律法规以及服务商的使用条款,仅用于合法合规的二次创作与学习用途。
二、准备工作
1. 注册并获取 API 密钥
大多数第三方解析平台都会要求用户注册账号、申请接口、获取 AppKey 或 AppSecret。一般流程如下:
- 进入服务商官网,完成手机号或邮箱注册;
- 在"开发者中心"或"API 管理"页面创建一个新应用;
- 记录下系统分配的 AppKey(接口密钥)以及可选的 AppSecret(签名密钥)。
2. 阅读接口文档
在正式编码前,请重点关注以下几个参数:
- 请求地址(通常为 HTTPS POST 或 GET);
- 必填参数,如视频链接(url 或 bvid)、AppKey;
- 签名方式,常见的有 MD5、SHA256、HMAC 等;
- 返回字段,重点关注无水印视频地址(video_url、play_url 等)。
3. 准备开发环境
- Python:建议 3.8 及以上,安装 requests 库;
- PHP:建议 7.4 及以上,启用 cURL 扩展;
- Java:建议 JDK 11 及以上,使用 HttpClient 或 OkHttp。
三、Python 对接示例
1. 安装依赖
在终端执行以下命令安装 requests 库:
pip install requests
2. 核心代码
下面的示例演示如何提交一个 B 站视频链接并解析出无水印视频地址:
- 构造请求参数,包括 url、app_key 以及当前时间戳;
- 按文档规则拼接字符串,生成 MD5 签名;
- 使用 requests.post 提交请求,并解析 JSON 返回结果。
完整示例代码:
import hashlib
import time
import requests
APP_KEY = "你的AppKey"
APP_SECRET = "你的AppSecret"
API_URL = "https://api.example.com/bili/parse"
def sign(params, secret):
raw = "".join(f"{k}={v}" for k, v in sorted(params.items())) + secret
return hashlib.md5(raw.encode("utf-8")).hexdigest()
def parse_video(video_url):
params = {
"app_key": APP_KEY,
"url": video_url,
"timestamp": str(int(time.time()))
}
params["sign"] = sign(params, APP_SECRET)
resp = requests.post(API_URL, data=params, timeout=10)
return resp.json()
if __name__ == "__main__":
result = parse_video("https://www.bilibili.com/video/BVxxxxxxxxxx")
print(result)
运行后,如果返回 code 为 0,即可在 data 字段中拿到无水印视频地址。
四、PHP 对接示例
1. 使用 cURL 发送请求
PHP 推荐使用 cURL 扩展,便于控制超时与 Header。示例代码如下:
<?php
$appKey = "你的AppKey";
$appSecret = "你的AppSecret";
$apiUrl = "https://api.example.com/bili/parse";
function makeSign(array $params, $secret) {
ksort($params);
$raw = "";
foreach ($params as $k => $v) {
$raw .= $k . "=" . $v;
}
return md5($raw . $secret);
}
$videoUrl = "https://www.bilibili.com/video/BVxxxxxxxxxx";
$params = [
"app_key" => $appKey,
"url" => $videoUrl,
"timestamp" => time()
];
$params["sign"] = makeSign($params, $appSecret);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);
?>
2. 常见问题
- 如果返回 SSL 证书错误,可在本地临时关闭 CURLOPT_SSL_VERIFYPEER,但生产环境建议保持开启;
- 如果中文参数出现乱码,请确保文件编码为 UTF-8,并使用 rawurlencode 处理。
五、Java 对接示例
1. 使用 HttpClient
JDK 11 自带的 java.net.http.HttpClient 即可满足需求,无需额外依赖。示例代码:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.security.MessageDigest;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class BiliParser {
private static final String APP_KEY = "你的AppKey";
private static final String APP_SECRET = "你的AppSecret";
private static final String API_URL = "https://api.example.com/bili/parse";
public static String md5(String input) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte b : digest) sb.append(String.format("%02x", b));
return sb.toString();
}
public static void main(String[] args) throws Exception {
Map<String, String> params = new TreeMap<>();
params.put("app_key", APP_KEY);
params.put("url", "https://www.bilibili.com/video/BVxxxxxxxxxx");
params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
StringBuilder raw = new StringBuilder();
for (Map.Entry<String, String> e : params.entrySet()) {
raw.append(e.getKey()).append("=").append(e.getValue());
}
params.put("sign", md5(raw + APP_SECRET));
StringBuilder form = new StringBuilder();
for (Map.Entry<String, String> e : params.entrySet()) {
form.append(e.getKey()).append("=").append(java.net.URLEncoder.encode(e.getValue(), "UTF-8")).append("&");
}
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();
HttpRequest req = HttpRequest.newBuilder(URI.create(API_URL))
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString(form.toString()))
.build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
}
}
2. 编���运行
将上述代码保存为 BiliParser.java,在命令行执行:
- javac BiliParser.java
- java BiliParser
控制台会输出 JSON 字符串,可使用 FastJSON 或 Jackson 等库进一步解析。
六、常见问题与排查思路
1. 签名错误
- 确认参数排序规则(通常按 key 的 ASCII 升序);
- 确认是否包含或遗漏了 timestamp、nonce 等字段;
- 确认密钥没有多余的空格或换行。
2. 接口超时或 5xx
- 适当增加超时时间,建议 10 秒以上;
- 实现失败重试机制,但避免短时间内高频请求;
- 查看服务商状态页或工单系统,确认是否在维护。
3. 返回的视频地址无法播放
- 部分解析接口返回的是临时链接,需要携带 Referer 才能播放;
- 若用于下载,请尊重版权,仅限个人学习使用。
七、合规与安全建议
- 不要将 AppSecret 硬编码到前端或公开仓库中,建议使用环境变量;
- 为接口调用设置合理的频率限制,避免对服务商造成压力;
- 遵守 B 站 robots 协议及《网络安全法》《数据安全法》等法律法规;
- ��次发布视频时,请保留原作者署名与出处,尊重创作者权益。
八、温馨提示
本文示例代码仅用于演示对接流程,实际接口地址、参数和签名规则请以你所使用服务商的官方文档为准。建议先在测试环境完成联调,再部署到生产环境,并做好日志记录与异常告警。如果你在对接过程中遇到具体报错,可以把错误码、请求参数(隐藏敏感信息)整理后发给服务商技术支持,通常能更快定位问题。
常见问题(FAQ)
如何获取如何对接哔哩哔哩去水印API(Python/PHP/Java)的无水印内容?
复制分享链接到玲珑去水印工具,在线解析即可获得无水印原画质文件。