啊…这两天发现小破站的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>