Greasy Fork 还支持 简体中文。

Bilibili Ban Conventer

Bilibili BV号转AV号工具

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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)
    })
})();