Greasy Fork

Greasy Fork is available in English.

Bilibili Ban Conventer

Bilibili BV号转AV号工具

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Bilibili Ban Conventer
// @namespace    https://github.com/tylzh97
// @version      0.2
// @description  Bilibili BV号转AV号工具
// @author       Birkhoff
// @match        *.bilibili.com/video/BV*
// @require      http://libs.baidu.com/jquery/1.8.3/jquery.min.js
// @grant        GM_addStyle
// ==/UserScript==

// 网络状况较好时,可以将次数值调低;网络较差时将此数字调高
// 网页加载完成多少秒后,将av号渲染到页面中
// 由于Bilibili前端使用Vue框架,修改页面模板后可能会导致页面渲染失败,因此要在Vue渲染完毕后脚本才能渲染
const delayTime = 3.5

// 点击复制内容函数
function copy(str) {
    let transfer = document.createElement('input');
    transfer.id = 'copy-temp-input'
    let v_r = $("#viewbox_report")
    v_r.append(transfer)
    transfer.value = str;
    transfer.focus();
    transfer.select();
    if (document.execCommand('copy')) {
        document.execCommand('copy');
    }
    transfer.blur();
    $('#copy-temp-input').remove()
}

(function() {
    'use strict';
    console.log("This is bilibili Tampermonkey Script.")
    // 当DOM渲染完成时
    $(document).ready(_ => {
        console.log("Page Loading!")
        const patt = /video\/(bv.+)/i
        const url = window.location.href
        const bv = patt.exec(url)[1]
        console.log(bv)
        // 转码参考 https://www.zhihu.com/question/381784377/answer/1099438784
        const magicStr = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF';
        let table = {};
        for (let i = 0; i < magicStr.length; i++) table[magicStr[i]] = BigInt(i);
        let s = [11, 10, 3, 8, 4, 6, 2, 9, 5, 7];
        const XOR = 177451812n, ADD = 100618342136696320n;
        // bv转av解码
        function decode(src) {
            let r = 0n;
            for (let i = 0; i < 10; i++) {
                r += table[src[s[i]]] * (58n ** BigInt(i));
            }
            return (r - ADD) ^ XOR;
        }
        // 获取bigint类型av号
        const av = decode(bv);
        const str_av = 'av' + av
        console.log(av)
        console.log(str_av)
        // 在视频信息中添加av号标签
        let avinfo = '<div class="video-data">'
        avinfo += '<span style="cursor: pointer" class="a-crumbs" id="av-copy">' + str_av + '</span>'
        avinfo += '<span style="cursor: pointer" id="url-copy">https://www.bilibili.com/video/' + str_av + '</span>'
        avinfo += '</div>'
        let v_r = $("#viewbox_report")
        // 由于bilibili前端使用了VUE框架,在VUE渲染完毕前修改HTML模板会造成VUE渲染失败,因此此处定时3秒再将av号信息渲染到页面中
        setTimeout(_ => {
            v_r.append(avinfo)
            $('#av-copy').click(function() {
                copy(str_av.toString())
            })
            $('#url-copy').click(function() {
                copy('https://www.bilibili.com/video/' + str_av)
            })
        }, delayTime * 1000)
    })
})();