啊…这两天发现小破站的av号都变成BV号了…记起来贼麻烦…下载B站视频的工具也还没更新,所以就扒了扒av转BV的各种脚本,我觉得这个做的还不错,改了改就搬过来了…还可以对吧!
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>BV 号跋扈 ~ Who done it!</title>
</head>
<body>
<p>BV号转AV号</p>
<input type="text" id="av"><button onclick="return av() && false">AV 号转 BV 号</button>
<input type="text" id="bv"><button onclick="return bv() && false">BV 号转 AV 号</button>
<p id="result">结果:</p>
<p>别问我为何这么丑,这玩意叫简洁风!!!</p>
<p>改写自 <a href="https://www.zhihu.com/question/381784377/answer/1099438784">mcfx 的纸糊回答</a>,并加上一些适当的处理。</p>
<p>可以的话,下面赏我杯咖啡~~~谢谢!!!</p>
<script>
// 改写自 https://www.zhihu.com/question/381784377/answer/1099438784,并加上一些适当的处理
'use strict';
const table = [...'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'];
const s = [11, 10, 3, 8, 4, 6];
const xor = 177451812;
const add = 8728348608;
const av2bv = (av) => {
let num = NaN;
if (Object.prototype.toString.call(av) === '[object Number]') {
num = av;
} else if (Object.prototype.toString.call(av) === '[object String]') {
num = parseInt(av.replace(/[^0-9]/gu, ''));
};
if (isNaN(num) || num <= 0) {
// 网页版直接输出这个结果了
return '¿你在想桃子?';
};
num = (num ^ xor) + add;
let result = [...'BV1 4 1 7 '];
let i = 0;
while (i < 6) {
// 这里改写差点犯了运算符优先级的坑
// 果然 Python 也不是特别熟练
// 说起来 ** 按照传统语法应该写成 Math.pow(),但是我个人更喜欢 ** 一些
result[s[i]] = table[Math.floor(num / 58 ** i) % 58];
i += 1;
};
return result.join('');
};
const bv2av = (bv) => {
let str = '';
if (bv.length === 12) {
str = bv;
} else if (bv.length === 10) {
str = `BV${bv}`;
// 根据官方 API,BV 号开头的 BV1 其实可以省略
// 不过单独省略个 B 又不行(
} else if (bv.length === 9) {
str = `BV1${bv}`;
} else {
return '¿你在想桃子?';
};
if (!str.match(/[Bb][Vv][fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{10}/gu)) {
return '¿你在想桃子?';
};
let result = 0;
let i = 0;
while (i < 6) {
result += table.indexOf(str[s[i]]) * 58 ** i;
i += 1;
};
return `av${result - add ^ xor}`;
};
const av = () => {
let result = av2bv(document.getElementById('av').value);
if (result !== '¿你在想桃子?') {
document.getElementById('result').innerHTML = `结果:<a href="https://www.bilibili.com/video/${result}">${result}</a>`;
} else {
document.getElementById('result').innerHTML = `结果:${result}`;
};
};
const bv = () => {
let result = bv2av(document.getElementById('bv').value);
if (result !== '¿你在想桃子?') {
document.getElementById('result').innerHTML = `结果:<a href="https://www.bilibili.com/video/${result}">${result}</a>`;
} else {
document.getElementById('result').innerHTML = `结果:${result}`;
};
};
document.getElementById('av').addEventListener('keydown', (event) => {
if (event.keyCode === 13) {
av();
};
});
document.getElementById('bv').addEventListener('keydown', (event) => {
if (event.keyCode === 13) {
bv();
};
});
</script>
</body>
</html>