B站的视频为什么能被解析下载?聊聊 AV 号、WBI 签名与番剧的边界
在抖音/快手那种"直链藏在页面里"的解析之外,B 站走的是另一条路:它的播放地址必须带签名,而且签名规则还被官方改过几次。本文以 B 站为例,讲清一个解析器要拿到一条 BV 视频的真实地址,中间到底过了哪几道关,以及哪些内容天然碰不到。
目录
一、从 BV 号到 cid:先找到"那条视频"
B 站的视频地址形如 https://www.bilibili.com/video/BV1xx411c7XD。页面 HTML 的 <script> 里有一段 window.__INITIAL_STATE__,里面带了该视频的 cid(视频流的唯一标识)。
BV1xx411c7XD ──► 页面 __INITIAL_STATE__ ──► cid = 123456789
拿到 cid 后,才能去请求真正的播放接口。这一步的意义是:播放地址不是挂在 BV 号下的静态资源,而是按 cid 临时签发的——所以"直接拼 URL"在 B 站行不通。
二、playurl 接口与 WBI 签名
播放接口大致是:
https://api.bilibili.com/x/player/wbi/playurl?cid=xxx&bvid=xxx&qn=80&fnval=16
注意路径里的 wbi——这是 2023 年后引入的签名校验。服务端会把你的请求参数按一个固定的"混淆顺序"重新排列,再拼上 w_rid 签名,否则返回 -412 风控。
WBI 的核心思路(示意):
import hashlib
# 1. 先拿 img_key 与 sub_key(来自 nav 接口,会轮换)
def get_mixin_key(orig):
# 官方固定的 64 位混淆序列表(节选)
enc = [46,47,18,2,53,8,23,32,15,50,10,31,58,3,45,35,27,43,5,49,33,9,42,...]
return ''.join(orig[i % len(orig)] for i in enc)[:32]
# 2. 拼接参数并做 md5
def sign(params: dict, mixin_key: str):
params['wts'] = 1700000000
s = '&'.join(f'{k}={params[k]}' for k in sorted(params))
s += mixin_key
params['w_rid'] = hashlib.md5(s.encode()).hexdigest()
return params
要点:mixin_key 由 img_key + sub_key 按混淆表打乱得到,且会定期轮换;签名里必须带时间戳 wts。这就是为什么早期"硬编码签名函数"的解析器会突然失效——规则一变就得跟着更新。
关于"代你发请求"这件事的底层逻辑,可以看 为什么网页版能下 B 站却下不动 YouTube:B 站对境内网络与可复现签名更友好,所以服务端解析相对稳。
三、返回里有什么:dash 与清晰度
接口返回 data.dash.video 是一个清晰度列表,每项含 id(清晰度档位)、baseUrl、bandwidth:
| 档位 id | 含义 | 编码 |
|---|---|---|
| 80 | 1080P | H.264 |
| 112 | 1080P+ | H.264 |
| 125 | 1080P HDR | H.265 |
| 127 | 8K | H.265 |
选最高清晰度时,解析器一般挑 bandwidth 最大、且本机能硬解的那条 baseUrl。这串地址是带时效的临时直链,直接拿去下载即可,无需再走播放器。
想了解 H.264/H.265/AV1 这些编码档位为什么清晰度相同时体积差那么多,见 从 H.264 到 AV1:为什么同一个视频有的 100MB 有的只有 20MB。
四、番剧、会员与版权的边界
WBI 签名只解决"能不能请求",不解决"有没有权限"。下面几类内容,即使签名正确也会返回空或要求登录:
- 番剧/影视:需
SESSDATA(登录 cookie)且有会员,且受版权地域限制; - 充电专属/付费:服务端直接不放出地址;
- 地区限制内容:境外 IP 可能拿不到
baseUrl。
这里有一条明确的线:解析器能做的,是"把你本来就能看的播放地址取出来",而不是绕过会员或版权去拿你无权访问的内容。前者属于个人备份的灰色地带,后者则越界。关于这条法律边界的更完整讨论,见 下载视频算侵权吗?聊聊个人备份与版权的那条线。
五、小结
B 站解析 = BV → cid → WBI 签名请求 playurl → 取 dash 临时直链。难点在签名规则会轮换、番剧受权限约束;纯技术层面,它比海外平台友好得多,因为网络邻近、签名可复现。把它和你已经熟悉的 视频流 HLS/DASH/ABR/加密 对照看,会更清楚"临时直链"在整套流媒体体系里的位置。