提示

返回博客列表

B站的视频为什么能被解析下载?聊聊 AV 号、WBI 签名与番剧的边界

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_keyimg_key + sub_key 按混淆表打乱得到,且会定期轮换;签名里必须带时间戳 wts。这就是为什么早期"硬编码签名函数"的解析器会突然失效——规则一变就得跟着更新。

关于"代你发请求"这件事的底层逻辑,可以看 为什么网页版能下 B 站却下不动 YouTube:B 站对境内网络与可复现签名更友好,所以服务端解析相对稳。

三、返回里有什么:dash 与清晰度

接口返回 data.dash.video 是一个清晰度列表,每项含 id(清晰度档位)、baseUrlbandwidth

档位 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/加密 对照看,会更清楚"临时直链"在整套流媒体体系里的位置。

想亲手试试?用 VidDown 一键解析下载

粘贴视频链接即可解析,多平台支持、网页端即用;下载桌面客户端解锁海外平台本地解析,开通会员更享不限次下载。

顶部