XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/bilibili-API-collect

更新 bvid 算法 (#862)

* Update bvid_desc.md

507f20e
LaMerChiang <catlair@qq.com>
提交于

代码差异

1 个文件 +20 -21
Modified docs/misc/bvid_desc.md +20 -21
@@ -1,3 +1,4 @@
1
1 2 # bvid说明
2 3
3 4 2020-03-23 B站推出了全新的稿件视频id`bvid`来接替之前的`avid`,其意义与之相同
@@ -11,7 +12,7 @@
11 12
12 13 ### 格式
13 14
14 “bvid”恒为长度为 12 的字符串,前两个字母为大写“BV”,后 10 个为 base58 计算结果
15 “bvid”恒为长度为 12 的字符串,前两个固定为“BV1”,后 9 个为 base58 计算结果(不包含数字 `0` 和大写字母 `I`、 `0` 以及小写字母 `l`)
15 16
16 17 ### 实质
17 18
@@ -25,9 +26,9 @@
25 26
26 27 ## 算法概述
27 28
28 ~~算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)~~
29 ~~实际上该算法并不完整,新的算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj)~~
30 实际上上面的算法依然不完整,新的算法参考自 <https://github.com/SocialSisterYi/bilibili-API-collect/issues/740>~~来自 B 站某个 JS 文件?~~
29 ~~算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)~~
30 ~~实际上该算法并不完整,新的算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj)~~
31 实际上上面的算法依然不完整,新的算法参考自 [SocialSisterYi#740](https://github.com/SocialSisterYi/bilibili-API-collect/issues/740)~~来自 B 站某个 JS 文件?~~
31 32
32 33 ### av->bv算法
33 34
@@ -40,9 +41,9 @@
40 41
41 42 - 定义一个包含初始值为 `['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']` 的长度为 12 的数组`bytes`,用于存储转换后的字符。
42 43 - 定义变量 `bv_idx` 并初始化为数组 `bytes` 的最后一个索引。
43 - 将输入的"aid"与 avid 最大值(2⁵¹)进行按位或运算,并与常量 `XOR_CODE`(23442827791579)进行异或运算,得到变量 `tmp`。
44 - 当 `tmp` 大于0时,执行以下操作:
45 - 将 `tmp` 除以 58 的余数作为索引,从 `FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf` 码表中取出对应的字符,并将其赋值给 `bytes[bv_idx]`。
44 - 将输入的 `aid` 与 avid 最大值(2⁵¹)进行按位或运算,其结果与常量 `XOR_CODE`(23442827791579)进行异或运算,得到变量 `tmp`。
45 - 当 `tmp` 大于0时,循环执行以下操作直到小于0:
46 - 将 `tmp` 除以 58(码表的长度) 的余数作为索引,从 `FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf` 码表中取出对应的字符,并将其赋值给 `bytes[bv_idx]`。
46 47 - 将 `tmp` 与 58 求模赋值给 `tmp`。
47 48 - 将 `bv_idx` 减1。
48 49 - 将 `bytes` 数组中索引为 3 和 9 的元素进行交换。
@@ -51,14 +52,16 @@
51 52
52 53 ### bv->av算法
53 54
55 是 #av->bv算法 的逆向
56
54 57 - 将 `bvid` 中索引为 3 和 9 的字符进行交换。
55 58 - 将 `bvid` 中索引为 4 和 7 的字符进行交换。
56 59 - 删除 `bvid` 前3个字符(固定为 BV1)。
57 60 - 定义变量 `tmp` 并初始化为 0。
58 61 - 遍历 `bvid` 的每个字符,执行以下操作:
59 62 - 获取当前字符在 `FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf` 码表中的索引,并将其赋值给变量 `idx`。
60 - 将 `tmp` 乘以常量 58,并加上 `idx`。
61 - 将 `tmp` 与常量 2⁵¹ - 1 进行按位与运算,并与常量 `XOR_CODE`(23442827791579) 进行异或运算,得到最终结果。
63 - 将 `tmp` 乘以常量 58,并加上 `idx`,最后赋值给 `tmp`。
64 - 将 `tmp` 与常量 2⁵¹ - 1 进行按位与运算,其结果与常量 `XOR_CODE`(23442827791579) 进行异或运算,得到最终结果。
62 65
63 66 ## 编程实现
64 67
@@ -77,12 +80,12 @@ const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf';
77 80
78 81 function av2bv(aid) {
79 82 const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'];
80 let bv_idx = bytes.length - 1;
83 let bvIndex = bytes.length - 1;
81 84 let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE;
82 85 while (tmp > 0) {
83 bytes[bv_idx] = data[Number(tmp % BigInt(BASE))];
86 bytes[bvIndex] = data[Number(tmp % BigInt(BASE))];
84 87 tmp = tmp / BASE;
85 bv_idx -= 1;
88 bvIndex -= 1;
86 89 }
87 90 [bytes[3], bytes[9]] = [bytes[9], bytes[3]];
88 91 [bytes[4], bytes[7]] = [bytes[7], bytes[4]];
@@ -94,11 +97,7 @@ function bv2av(bvid) {
94 97 [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]];
95 98 [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]];
96 99 bvidArr.splice(0, 3);
97 let tmp = 0n;
98 for (let i = 0; i < bvidArr.length; i++) {
99 const idx = data.indexOf(bvidArr[i]);
100 tmp = tmp * BASE + BigInt(idx);
101 }
100 const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n);
102 101 return Number((tmp & MASK_CODE) ^ XOR_CODE);
103 102 }
104 103
@@ -120,12 +119,12 @@ const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf';
120 119
121 120 function av2bv(aid: number) {
122 121 const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'];
123 let bv_idx = bytes.length - 1;
122 let bvIndex = bytes.length - 1;
124 123 let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE;
125 124 while (tmp > 0) {
126 bytes[bv_idx] = data[Number(tmp % BigInt(BASE))];
125 bytes[bvIndex] = data[Number(tmp % BigInt(BASE))];
127 126 tmp = tmp / BASE;
128 bv_idx -= 1;
127 bvIndex -= 1;
129 128 }
130 129 [bytes[3], bytes[9]] = [bytes[9], bytes[3]];
131 130 [bytes[4], bytes[7]] = [bytes[7], bytes[4]];
@@ -149,7 +148,7 @@ console.log(bv2av('BV1L9Uoa9EUx'));
149 148
150 149 ### Python
151 150
152 来自:<https://github.com/SocialSisterYi/bilibili-API-collect/issues/847#issuecomment-1807020675>
151 来自:[SocialSisterYi#847 (comment)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/847#issuecomment-1807020675)
153 152
154 153 ```python
155 154 XOR_CODE = 23442827791579