ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

Bilibili-Old的BV/av互转算法:完整揭秘B站视频ID背后的数学原理

Bilibili-Old的BV/av互转算法:完整揭秘B站视频ID背后的数学原理 Bilibili-Old的BV/av互转算法完整揭秘B站视频ID背后的数学原理【免费下载链接】Bilibili-Old恢复旧版Bilibili页面为了那些念旧的人。项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-OldBilibili-Old是一个恢复 B 站旧版网页的开源项目它的核心能力之一就是在页面链接、参数、评论区里自动完成BV/av 互转——把 2020 年后启用的 BV 号还原成旧版页面能识别的 av 号。今天这篇文章带你拆解这段代码背后的数学原理异或加密、58 进制编码、位掩码一个都不少。为什么需要 BV/av 互转2020 年 3 月 23 日B 站把视频的av号全面换成了BV号这一点在 README.md 的「B站更新摘记」里也有记录。而旧版网页的接口只认aid即 av 号后面的纯数字。所以想让旧版页面正常播放新视频就必须在浏览器里把 BV 号实时算回 av 号——不能查数据库、不能调接口只能靠算法硬算。好消息是BV 号并不是随机字符串它其实是 av 号经过一层可逆变换后的编码结果。算法总览三步流水线整个算法在 src/utils/av.ts 中实现核心只有 4 个「魔法数字」和一个字母表常量值作用XOR_CODE23442827791579异或密钥负责「打乱」av 号MASK_CODE2251799813685247即 2⁴⁴−1位掩码截取低 44 位BASE58进制基数用 58 个字符编码ALPHABETFcwAPNKTMu...等 58 字符自定义 58 进制字母表变换链路一句话概括av号 ──┬─→ 按位或 (151) ──→ 与 XOR_CODE 异或 ──→ 58进制编码 → BV号 BV号 ──┴─← 逆向执行上面每一步 ←──────────────←正向av 号怎么变成 BV 号toBV()函数src/utils/av.ts的逻辑分 4 步校验范围av 号必须落在[1, 2⁵¹)之间越界直接抛错高位补齐MAX_AID | avid即与2⁵¹做按位或。这相当于给 av 号最高位「打上 1 的标记」保证后续运算位宽固定异或加密把结果与XOR_CODE做按位异或。异或运算是最经典的「可逆加密」——同一个密钥再异或一次就还原58 进制编码对异或结果反复取模、整除取余数作为下标去查ALPHABET字母表从右往左填进 BV 号的 9 个空位。注意一个有趣的细节编码时并不是直接按位置 3~11 顺序填而是通过DIGIT_MAP [0,1,2,9,7,5,6,4,8,3,10,11]做了位置打乱让输出看起来更「随机」。逆向BV 号怎么还原成 av 号fromBV()就是反过来走一遍容错处理允许输入省略BV前缀的短号如17x411w7KC自动补全58 进制解码按DIGIT_MAP逆映射取出第 3~11 位字符查表得数值从左往右累乘累加还原出一个大整数异或解密与XOR_CODE再做一次异或撤销第 3 步的加密掩码截取与MASK_CODE2⁴⁴−1按位与把高位「标记位」清掉剩下的就是纯 av 号。两步都只用加减乘除和位运算所以纯前端、零网络请求、微秒级完成。Bilibili-Old 是怎么用它「无感」替换的这才是这个算法在项目中真正的价值——它被埋在多个模块里对用户完全透明URL 净化src/core/url.ts 的clear()会拦截所有页面链接把 URL 参数里的bvid...直接换算成aid...还会处理 B 站「参数名叫 aid 但值其实是 BV 号」的奇葩情况最后用AV.fromStr()对链接主体和 hash 部分做「通杀式」全局替换参数解析src/utils/utils.ts 的urlParam()能从任意形式的链接完整 URL、裸 BV 号、avid参数中提取并换算出 aid是播放器的入口解析器评论区还原src/core/comment.ts 用AV.fromStr()把新版评论区里的 BV 号「转化回标题」还原旧版体验接口层兜底src/io/api-webshow-locs.ts 对纪录片相关接口的返回文本做整体替换src/page/read.ts专栏页同理——凡是旧接口吐不出 BV 号的地方统统就地换算。fromStr()配合一个正则^BV1 58 字母表字符 ×9批量匹配文本中的所有 BV 号逐个替换一次扫描搞定整段内容。动手验证一下以项目源码中的官方示例为例我实际运行了这套算法av 号换算出的 BV 号逆向还原170001BV17x411w7KC✅1700012345678BV12s411D73t✅2345678可以看到两个不同的 av 号算出的 BV 号都以BV1开头、后面 9 位——格式约束来自算法本身双向转换完全对等说明「异或 掩码」这套组合是严格可逆的。小结BV/av 互转算法本质上是一道漂亮的位运算小练习按位或打上高位标记固定位宽异或密钥完成「加密」可逆且极快58 进制 自定义字母表 位置打乱把大整数变成人眼友好的短字符串逆向时掩码清掉高位一步还原。理解了这个算法你再看 Bilibili-Old 在 URL、参数、评论、接口四处埋下的换算逻辑就会明白为什么它能让旧版页面在新视频时代里「无缝续命」——不需要任何后端配合纯数学的力量就够了。【免费下载链接】Bilibili-Old恢复旧版Bilibili页面为了那些念旧的人。项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Old创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表