返回提交历史
Modified
docs/misc/bvid_desc.md
+20
-21
XFEstudio/bilibili-API-collect
更新 bvid 算法 (#862)
* Update bvid_desc.md
507f20e
代码差异
1 个文件
+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