Greasy Fork is available in English.

B站、油管、推特屏蔽原神内鬼爆料相关视频

屏蔽B站、油管、推特三大平台的原神、星穹铁道内鬼爆料视频和消息

// ==UserScript==
// @name         B站、油管、推特屏蔽原神内鬼爆料相关视频
// @namespace    http://tampermonkey.net/
// @version      3.0.0-alpha.2
// @description  屏蔽B站、油管、推特三大平台的原神、星穹铁道内鬼爆料视频和消息
// @author       凡云 - https://space.bilibili.com/3491267
// @match        *://*.bilibili.com/*
// @match        *://*.youtube.com/*
// @match        *://*.twitter.com/*
// @icon         https://static.hdslb.com/images/favicon.ico
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @grant        GM_listValues
// @grant        GM_addValueChangeListener
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @noframes
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const authorLink = 'https://space.bilibili.com/3491267'
    const scriptLink = 'https://greasyfork.org/zh-CN/scripts/447376'
    const baseApi = 'https://lcybff.github.io/helper/mihoyoLeaksBlock'
    const configApi = baseApi + '/config.json'
    const areaApi = baseApi + '/arealist.json'
    const imagesAll = {
        bilibili: {
            // 右侧按钮背景图标
            openIcon: 'https://i0.hdslb.com/bfs/article/7e764e5831314a698d116f59f2977aed3491267.png',
            // 设置界面标题背景图
            layoutHeaderBg: 'https://i0.hdslb.com/bfs/article/f2ef018ee493b3e6df285333f6a9fc623491267.jpg',
            // 设置界面四角图标
            cornerIcon: 'https://i0.hdslb.com/bfs/article/e99bbc04cdb89bcd1da5d78fdab0b1dd3491267.png',
            // 外链图标
            outlinkIcon: 'https://i0.hdslb.com/bfs/article/546d3a598cbe738e74ab6645b8d3ed023491267.png',
            // 帮助图标
            helpIcon: 'https://i0.hdslb.com/bfs/article/91129a4c63c0bd1a77dd423a5f9b6c313491267.png',
            // 关闭按钮
            closeIcon: 'https://i0.hdslb.com/bfs/article/a4ac29bb1567b563b6a682d6ae467ba23491267.png',
            // 设置界面底部图
            brImg: 'https://i0.hdslb.com/bfs/article/16e88865719a0baaa4433e1334d047fb3491267.png',
            // 导入配置图标
            importIcon: 'https://i0.hdslb.com/bfs/article/03b81284c1e2e110b1fb07dc59e30ced3491267.png',
            // 导出配置图标
            exportIcon: 'https://i0.hdslb.com/bfs/article/cbe024b4261dc156cf3b154af33f56ef3491267.png',
            // 查看图标
            watchIcon: 'https://i0.hdslb.com/bfs/article/bbbf6251696153107c2774f6aa4c604b3491267.png',
            // 清除缓存配置图标
            clearIcon: 'https://i0.hdslb.com/bfs/article/0fbfaeb4d2b116bc729429745a27c4f53491267.png'
        },
        youtube: {
            openIcon: 'https://pbs.twimg.com/media/FgzUHioakAAQxc0?format=png',
            layoutHeaderBg: 'https://pbs.twimg.com/media/FhdHiktaYAAtB6Q?format=jpg',
            cornerIcon: 'https://pbs.twimg.com/media/FgzUHimaYAE0RgH?format=png',
            outlinkIcon: 'https://pbs.twimg.com/media/FyQ6cRmaMAgxd2N?format=png',
            helpIcon: 'https://pbs.twimg.com/media/FyQ6cReacAA_AFg?format=png',
            closeIcon: 'https://pbs.twimg.com/media/FyQ6cRaaYAIBj7o?format=png',
            brImg: 'https://pbs.twimg.com/media/FhdHikiaUAE1nRX?format=png',
            importIcon: 'https://pbs.twimg.com/media/FyQ6eqIaUAAaaq-?format=png',
            exportIcon: 'https://pbs.twimg.com/media/FyQ6eppaMAEh_C2?format=png',
            watchIcon: 'https://pbs.twimg.com/media/FyQ6cRfaIAAICMe?format=png',
            clearIcon: 'https://pbs.twimg.com/media/FyQ7cWPakAALZeB?format=png',
        },
        twitter: {
            openIcon: 'https://pbs.twimg.com/media/FgzUHioakAAQxc0?format=png',
            layoutHeaderBg: 'https://pbs.twimg.com/media/FhdHiktaYAAtB6Q?format=jpg',
            cornerIcon: 'https://pbs.twimg.com/media/FgzUHimaYAE0RgH?format=png',
            outlinkIcon: 'https://pbs.twimg.com/media/FyQ6cRmaMAgxd2N?format=png',
            helpIcon: 'https://pbs.twimg.com/media/FyQ6cReacAA_AFg?format=png',
            closeIcon: 'https://pbs.twimg.com/media/FyQ6cRaaYAIBj7o?format=png',
            brImg: 'https://pbs.twimg.com/media/FhdHikiaUAE1nRX?format=png',
            importIcon: 'https://pbs.twimg.com/media/FyQ6eqIaUAAaaq-?format=png',
            exportIcon: 'https://pbs.twimg.com/media/FyQ6eppaMAEh_C2?format=png',
            watchIcon: 'https://pbs.twimg.com/media/FyQ6cRfaIAAICMe?format=png',
            clearIcon: 'https://pbs.twimg.com/media/FyQ7cWPakAALZeB?format=png',
        },
    }
    const blockTimeout = 500

    // 远程获取初始化配置
    function requestConfig(api = '') {
        return new Promise(function(resolve, reject){
            GM_xmlhttpRequest({
                method: 'GET',
                url: api,
                responseType: 'json',
                onload: function(res) {
                    if (res.status == 200) {
                        resolve(res.response);
                    } else {
                        reject({ error: '数据请求失败,请稍后重试' });
                    }
                },
                onerror: function() {
                    alert('请求失败,请允许访问跨源资源重试')
                }
            })
        })
    }

    var fullBlockTitle,
    fullBlockUsers,
    fullBlockUsersWhite,
    areaList,
    areaListGM,
    images,
    activeDomain

    // 初始化过滤
    function initialize() {
        // 获取全部区域
        areaListGM = GMGetValue('areaList', [])

        images = imagesAll.common

        if (/bilibili/.test(document.domain)) {
            areaList = getAreaList('bilibili')
            initActive(toCnName('Bili'), 'Bili')
            blockArea('bilibili')
            images = imagesAll.bilibili
        }

        if (/youtube/.test(document.domain)) {
            areaList = getAreaList('youtube')
            initActive(toCnName('Ytb'), 'Ytb')
            blockArea('youtube')
            images = imagesAll.youtube
        }

        if (/twitter/.test(document.domain)) {
            areaList = getAreaList('twitter')
            initActive(toCnName('Twitter'), 'Twitter')
            blockArea('twitter')
            images = imagesAll.twitter
        }

        initImages()

        // 表单赋值
        document.getElementById('blockTitle').value = GMGetValue(fullBlockTitle)
        document.getElementById('blockUsers').value = GMGetValue(fullBlockUsers)
        document.getElementById('blockUsersWhite').value = GMGetValue(fullBlockUsersWhite)

        // 监听
        GMChange(fullBlockTitle)
        GMChange(fullBlockUsers)
        GMChange(fullBlockUsersWhite)
    }

    // 转换标识英文
    function toCnName(string = '') {
        if (/Bili/.test(string)) {
            return 'B站'
        } else if (/Ytb/.test(string)) {
            return '油管'
        } else {
            return '推特'
        }
    }

    // 公共
    function blockCommon(main = '', item = '', text = '', media = '', user = '', home = false) {
        let blockTitle = getBlockRegExp(fullBlockTitle);
        let blockUsers = getBlockRegExp(fullBlockUsers);
        let blockUsersWhite = getBlockRegExp(fullBlockUsersWhite);
        $(main).find(item).each(function(){
            let that = $(this)
            let textString = text ? that.find(text).text():''
            let userString = user ? (home === true ? $(user).text() : that.find(user).text()):''
            if (blockUsersWhite.test(userString.trim())) {
                // 白名单
            } else if (blockTitle.test(textString) || blockUsers.test(userString)) {
                blurBlock('on', that, text, media)
            } else {
                blurBlock('off', that, text, media)
            }
        })
    }

    // 推特
    function blockTwitter(item = '', text = '', media = '', user = '') {
        let blockTitle = getBlockRegExp(fullBlockTitle);
        let blockUsers = getBlockRegExp(fullBlockUsers);
        let blockUsersWhite = getBlockRegExp(fullBlockUsersWhite);
        $(item).each(function(){
            let that = $(this)
            let textString = text ? that.find(text).text():''
            let userString = user ? that.find(user).text():''
            if (blockUsersWhite.test(userString.trim())) {
                // 白名单
            } else if ((blockTitle.test(textString) || blockUsers.test(userString)) && $(item).attr('tabindex') === '0') {
                blurBlock('on', that, text, media)
            } else {
                blurBlock('off', that, text, media)
            }
        })
    }

    // 获取生效区域列表
    function getAreaList(name = '', field = 'area') {
        let list = []
        $('#blockLayout #areaWrap .areaBox .areaList').empty()
        areaListGM.forEach((e, i) => {
            let switchStatus = e.on === true ? 'on' : ''
            if (e[field] == name) {
                list.push(e)
                $('#blockLayout #areaWrap .areaBox .areaList').append('<div class="areaItem"><div class="name" title="' + e.name + '" data-index="' + i + '">' + e.name + '</div><div class="actions"><div class="switchButton ' + switchStatus + '" data-index="' + i + '"><i></i></div></div></div>')
            }
        });
        return list
    }

    // 统一过滤入口
    function blockArea(name = '') {
        setInterval(() => {
            areaList.forEach(e => {
                // 启用屏蔽状态
                if (e.on === true) {
                    switch (name) {
                        case 'twitter':
                            blockTwitter(e.item, e.text, e.media, e.user)
                            break;
                        default:
                            blockCommon(e.main, e.item, e.text, e.media, e.user, e.home)
                            break;
                    }
                }
            })
        }, blockTimeout)
    }

    // 目标标题和图片模糊化处理
    function blurBlock(type = '', item = '', text = '', media = '') {
        if (type === 'on') {
            // 添加模糊化
            item.find(text).addClass('blurBlock').attr('title', item.find(text).text())
            item.find(media).addClass('blurBlock')
        } else {
            // 去除模糊化
            item.find(text).removeClass('blurBlock')
            item.find(media).removeClass('blurBlock')
        }
    }

    // 恢复过滤前的状态
    function blockRestart() {
        $('.blurBlock').removeClass('blurBlock')
    }

    // 设置当前生效配置
    function initActive(name = '', activeName = '') {
        $('#blockLayout .tabs .tabs-title .tab').text(name)
        // 赋值键名
        fullBlockTitle = 'blockTitle' + activeName
        fullBlockUsers = 'blockUsers' + activeName
        fullBlockUsersWhite = 'blockUsersWhite' + activeName
        activeDomain = activeName
    }

    // 显示/隐藏 屏蔽设置界面
    $('body').on('click', '#blockOpenButton, #blockLayout .bg, #blockLayout .closeButton1', function() {
        $('#blockLayout').toggleClass('active')
    })

    // 显示/隐藏区域界面
    $('body').on('click', '#blockLayout .btnGroup .listButton, #blockLayout #areaWrap .closeButton2', function() {
        $('#blockLayout #areaWrap').toggleClass('show')
    })

    // 隐藏更新界面
    $('body').on('click', '#blockLayout #updateWrap .closeButton3', function() {
        $('#blockLayout #updateWrap').removeClass('show')
    })

    // 隐藏比较界面
    $('body').on('click', '#blockLayout #compareWrap .closeButton4', function() {
        $('#blockLayout #compareWrap').removeClass('show')
    })

    // 显示屏蔽区域参数修改界面
    $('body').on('click', '#blockLayout #areaWrap .areaBox .areaList .areaItem .name', function() {
        $('#blockLayout #areaWrap .areaBox .areaForm').css('display', 'flex')
        $('#blockLayout #areaWrap .areaBox .areaList').css('display', 'none')
        areaFormInit(areaListGM[$(this).data('index')], $(this).data('index'))
    })

    // 隐藏屏蔽区域参数修改界面
    $('body').on('click', '#blockLayout #areaWrap .areaBox .areaForm .backToList', function() {
        $('#blockLayout #areaWrap .areaBox .areaForm').hide()
        $('#blockLayout #areaWrap .areaBox .areaList').show()
        areaFormInit()
    })

    // 提交修改屏蔽区域参数
    $('body').on('click', '#blockLayout #areaWrap .areaBox .areaForm .submitArea', function() {
        let areaForm = document.getElementById('areaForm');
        let areaFormData = new FormData(areaForm);
        let areaData = {}
        for(var d of areaFormData.entries()) {
            let value = d[1]
            if (d[0] == 'on') {
                value = value == 'true' ? true : false
            }
            areaData[d[0]] = value;
        }
        $('#blockLayout #areaWrap .areaBox .areaForm').css('display', 'none')
        $('#blockLayout #areaWrap .areaBox .areaList').css('display', 'block')
        let index = $(this).data('index') ? $(this).data('index'):0

        areaListGM[index] = areaData
        GM_setValue('areaList', areaListGM)
        showMsg('修改成功')
        areaFormInit()
        clearInterval()
        blockRestart()
        initialize()
        return false;
    })

    // 屏蔽列表区域选项开关
    $('body').on('click', '#blockLayout #areaWrap .areaBox .areaList .areaItem .switchButton', function() {
        $(this).toggleClass("on")
        areaListGM[$(this).data('index')].on = $(this).hasClass('on')
        GM_setValue('areaList', areaListGM)
        clearInterval()
        blockRestart()
        initialize()
    });

    var importConfig = []

    // 导入配置
    $('body').on('click', '#blockLayout .importConfigButton', function() {
        requestConfig(configApi).then(res => {
            importConfig = res
            $('#blockLayout #updateWrap').addClass('show')
            $('#blockLayout #updateWrap .areaBox .areaList').empty()
            let keys = Object.keys(importConfig)
            let name, checked = '', newIcon = ''
            keys.forEach(key => {
                if (/blockTitle/.test(key)) name = toCnName(key) + ' 屏蔽关键词'
                else if (/blockUsersWhite/.test(key)) name = toCnName(key) + ' 作者白名单'
                else if (/blockUsers/.test(key)) name = toCnName(key) + ' 作者黑名单'
                if (str2RegExp('/' + activeDomain + '/').test(key)) checked = 'checked'
                if (importConfig[key] != GMGetValue(key)) newIcon = '<i></i>'
                $('#blockLayout #updateWrap .areaBox .areaList').append('<div class="areaItem"><div class="name" title="' + name + '">' + name + '</div><div class="actions"><div><input id="' + key + '" type="checkbox" ' + checked + '><label for="' + key + '"></label></div><div class="watchButton iconButton" title="查看对比" style="background-image: url(' + images.watchIcon + ')" data-key="' + key + '">' + newIcon + '</div></div></div>')
                checked = ''
                newIcon = ''
            })
        })
    })

    // 导入区域列表配置
    $('body').on('click', '#blockLayout .importAreaButton', function() {
        requestConfig(areaApi).then(res => {
            GM_setValue('areaList', res.arealist)
            clearInterval()
            blockRestart()
            initialize()
        })
    })

    // 查看新旧值对比
    $('body').on('click', '#blockLayout #updateWrap .areaBox .areaList .areaItem .watchButton', function() {
        let oldConfig = GMGetValue($(this).data('key'))
        let newConfig = importConfig[$(this).data('key')]
        $('#blockLayout #compareWrap').addClass('show')
        $('#blockLayout #compareWrap .old').val(oldConfig)
        $('#blockLayout #compareWrap .new').val(newConfig)
    });

    // 全选更新区域按钮
    $('body').on('click', '#blockLayout #updateWrap #checkAllUpdate', function(e) {
        if ($(this).prop('checked')) {
            $('#blockLayout #updateWrap .areaBox .areaList input').prop('checked', true)
        } else {
            $('#blockLayout #updateWrap .areaBox .areaList input').prop('checked', false)
        }
    })

    // 确认更新设置
    $('body').on('click', '#blockLayout .btnGroup .submitButton2', function() {
        clearInterval()
        $('#blockLayout #updateWrap .areaBox .areaList input').each(function() {
            if ($(this).prop('checked')) {
                let key = $(this).attr('id')
                GM_setValue(key, importConfig[key])
                console.log(importConfig[key])
            }
        })
        showMsg('更新成功')
        $('#blockLayout #updateWrap').removeClass('show')
        $('#blockLayout #updateWrap .areaBox .areaList').empty()
        $('#blockLayout #compareWrap').removeClass('show')
        $('#blockLayout #compareWrap textarea').val('')
        $("#blockLayout #updateWrap #checkAllUpdate").prop('checked', false)
        importConfig = []
        blockRestart()
        initialize()
    })

    // 导出配置
    $('body').on('click', '#blockLayout .exportConfigButton', function() {
        var configList = {}
        GM_listValues().forEach(e => {
            configList[e] = GM_getValue(e)
        })
        var text = JSON.stringify(configList, null, "\t");
        var element = document.createElement('a');
        element.style.display = 'none';
        document.body.appendChild(element);
        element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
        element.setAttribute('download', '米哈游内鬼屏蔽插件配置.json');
        element.click();
        document.body.removeChild(element);
    })

    // 清理缓存配置
    $('body').on('click', '#blockLayout .clearConfigButton', function() {
        if (confirm('确认清除本地缓存?')) {
            clearInterval()
            blockRestart()
            GM_listValues().forEach(e => {
                GM_deleteValue(e)
            })
            initialize()
            showMsg('清理缓存成功')
        }
    })

    // 重置初始化设置
    $('body').on('click', '#blockLayout .btnGroup .resetButton', function() {
        if (confirm('确认初始化当前网站配置?')) {
            requestConfig(configApi).then(res => {
                clearInterval()
                GM_setValue(fullBlockTitle, res[fullBlockTitle])
                GM_setValue(fullBlockUsers, res[fullBlockUsers])
                GM_setValue(fullBlockUsersWhite, res[fullBlockUsersWhite])
                showMsg('初始化成功')
                blockRestart()
                initialize()
            })
        }
    })

    // 确认保存设置
    $('body').on('click', '#blockLayout .btnGroup .submitButton', function() {
        clearInterval()
        GM_setValue(fullBlockTitle, $('#blockTitle').val())
        GM_setValue(fullBlockUsers, $('#blockUsers').val())
        GM_setValue(fullBlockUsersWhite, $('#blockUsersWhite').val())
        showMsg('保存成功')
        blockRestart()
        initialize()
    })

    // 获取配置,如不存在则返回默认值
    function GMGetValue(name = '', defaultValue = '') {
        return GM_getValue(name) ? GM_getValue(name) : defaultValue;
    }

    // 监听同域名的其他标签页的修改操作
    function GMChange(name) {
        if (GM_getValue(name)) {
            GM_addValueChangeListener(name, function(Name, old_value, new_value, remote) {
                if (remote === true) {
                    clearInterval()
                    blockRestart()
                    initialize()
                }
            })
        }
    }

    // 显示提示
    function showMsg(msg = '', timeout = 3000) {
        $('#blockMsg').text(msg)
        $('#blockMsg').addClass('active')
        setTimeout(() => {
            $('#blockMsg').removeClass('active')
        }, timeout);
    }

    // 获取屏蔽文本并转成RegExp对象
    function getBlockRegExp(name = '') {
        let str = GM_getValue(name) ? GM_getValue(name) : null
        return new str2RegExp(str)
    }

    // 字符串转RegExp对象
    function str2RegExp(str = '') {
        return new RegExp(str.replace(/^\/|\/[a-z]*$/gi, ''), str.replace(/^\/.*\/[^a-z]*/i, ''))
    }

    // 渲染屏蔽列表表单
    function areaFormInit(data = {}, index = 0) {
        if (data) {
            let dataKeys = Object.keys(data)
            dataKeys.forEach((e, i) => {
                $('#blockLayout #areaForm ' + '[name="' + e + '"').val(data[e])
            })
            $('#blockLayout #areaWrap .areaBox .areaForm .submitArea').attr('data-index', index)
        } else {
            $('#blockLayout #areaWrap .areaBox .areaForm input').val('')
        }
    }

    // 屏蔽设置界面追加
    function addBlockConsole() {
        // 右侧按钮
        const blockOpenButton = "<a id='blockOpenButton'>米哈游内鬼屏蔽</a>";
        $('body').append(blockOpenButton)

        // 区域界面
        const areaWrap = '<div id="areaWrap"><div class="toolerGroup"><a href="javascript:;"class="importAreaButton iconButton"title="导入屏蔽配置"></a><a href="javascript:;"class="closeButton closeButton2 iconButton"title="关闭区域列表"></a></div><div class="areaBox"><h2>区域列表</h2><div class="areaList"></div><form id="areaForm"class="areaForm"><p>名称</p><input type="text"name="name"><p>域名</p><input type="text"name="area"><p>父类</p><input type="text"name="main"><p>目标</p><input type="text"name="item"><p>标题</p><input type="text"name="text"><p>媒体</p><input type="text"name="media"><input type="hidden"name="on"><input type="hidden"name="home"><p>用户名</p><input type="text"name="user"><button type="button"class="backToList">返回列表</button><button type="button"class="submitArea">确认修改</button></form></div></div>'

        // 更新、比较界面
        const updateWrap = '<div id="updateWrap"><div class="toolerGroup"><div><input id="checkAllUpdate" type="checkbox"><label for="checkAllUpdate"></label></div><a href="javascript:;"class="closeButton closeButton3 iconButton"title="关闭更新列表"></a></div><div class="areaBox"><h2>更新列表</h2><div class="areaList"></div><div class="btnGroup"><div class="submitButton2 button" alt=""><div class="icon"><div class="yellow-circle"><div class="black-circle"></div></div></div><div class="text">确认更新</div></div></div></div></div><div id="compareWrap"><div class="toolerGroup"><a href="javascript:;"class="closeButton closeButton4 iconButton"title="关闭比较界面"></a></div><div class="areaBox"><h2>更新比较</h2><p>旧值</p><textarea class="old"rows="5" readonly></textarea><p>新值</p><textarea class="new"rows="5" readonly></textarea></div></div>'

        // 设置全局界面
        const blockLayout = '<div id="blockLayout"><div class="bg"></div><div class="box"><div class="cornerIcon lt"></div><div class="cornerIcon rt"></div><div class="cornerIcon lb"></div><div class="cornerIcon rb"></div><div class="toolerGroup"><a href="javascript:;"class="clearConfigButton iconButton"title="清除缓存"></a><a href="javascript:;"class="exportConfigButton iconButton"title="导出配置"></a><a href="javascript:;"class="importConfigButton iconButton"title="导入区域配置"></a><a href="javascript:;"class="outlinkButton iconButton"target="_blank"title="作者B站主页"></a><a href="javascript:;"class="helpButton iconButton"target="_blank"title="帮助文档"></a><a href="javascript:;"class="closeButton closeButton1 iconButton"title="关闭界面"></a></div><div class="header"><h1>米哈游内鬼屏蔽工具</h1></div><div class="body"><div class="tabs"><div class="tabs-title"><div class="tab"></div></div><div class="tabs-content"><div class="tab-item"><p>屏蔽关键词</p><textarea id="blockTitle"rows="5"></textarea><p>作者黑名单</p><textarea id="blockUsers"rows="5"></textarea><p>作者白名单</p><textarea id="blockUsersWhite"rows="5"></textarea></div></div></div><div class="btnGroup"><div class="listButton button"alt=""><div class="icon listIcon"><span></span><span></span><span></span></div><div class="text">区域列表</div></div><div class="submitButton button"alt=""><div class="icon"><div class="yellow-circle"><div class="black-circle"></div></div></div><div class="text">确认修改</div></div></div><img src=""class="brImg"alt=""></div></div><div class="modulesWrap">' + areaWrap + updateWrap + '</div><div id="blockMsg"></div></div>';

        $('body').append(blockLayout)
    }

    // 追加静态图片
    function initImages() {
        $('#blockOpenButton').css('background-image', 'url(' + images.openIcon + ')')
        $('#blockLayout .box .header').css('background-image', 'url(' + images.layoutHeaderBg + ')')
        $('#blockLayout .cornerIcon').css('background-image', 'url(' + images.cornerIcon + ')')
        $('#blockLayout .outlinkButton').css('background-image', 'url(' + images.outlinkIcon + ')').attr('href', authorLink)
        $('#blockLayout .helpButton').css('background-image', 'url(' + images.helpIcon + ')').attr('href', scriptLink)
        $('#blockLayout .closeButton').css('background-image', 'url(' + images.closeIcon + ')')
        $('#blockLayout .importConfigButton').css('background-image', 'url(' + images.importIcon + ')')
        $('#blockLayout .importAreaButton').css('background-image', 'url(' + images.importIcon + ')')
        $('#blockLayout .exportConfigButton').css('background-image', 'url(' + images.exportIcon + ')')
        $('#blockLayout .clearConfigButton').css('background-image', 'url(' + images.clearIcon + ')')
        $('.brImg').attr('src', images.brImg)
    }

    // 初始化屏蔽界面
    addBlockConsole()

    // 初始化
    initialize()

    // 样式表
    const BLOCK_STYLE = `
        #blockOpenButton {
            position:fixed;
            z-index:99997;
            right:0;
            top:40%;
            width:30px;
            border-top-right-radius:2px;
            border-bottom-right-radius:2px;
            background-color:rgba(0 178 255);
            font-size:12px;
            color:#fff;
            padding:8px 9px;
            line-height:14px;
            box-sizing:border-box;
            text-decoration:none;
            outline:none;
            cursor:pointer;
            background-position: center 5px;
            background-size: 24px;
            background-repeat: no-repeat;
            padding-top: 30px;
            border-top-left-radius: 8px;
            border-bottom-left-radius: 8px;
            transition: all 0.3s;
        }
        #blockOpenButton:hover {
            box-shadow:0 0px 10px 0 rgba(0 178 255 / 40%);
        }
        #blockLayout {
            display: none;
        }
        #blockLayout *::-webkit-scrollbar {
            width: 6px;
            height: 1px;
        }
        #blockLayout *::-webkit-scrollbar-thumb {
            border-radius: 10px;
            -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
            background: #dfd0b3;
        }
        #blockLayout *::-webkit-scrollbar-track {
            -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
            border-radius: 10px;
            background: #ededed;
        }
        #blockLayout * {
            font-family: 'system-ui' !important
        }
        #blockLayout .bg {
            position: fixed;
            inset: 0px;
            background: rgba(0, 0, 0, 0.7);
            animation-name: balh-settings-bg;
            animation-duration: 0.5s;
            z-index: 99997;
            cursor: pointer;
        }
        #blockLayout .box {
            position: fixed;
            background: rgb(59, 67, 84);
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            cursor: default;
            z-index: 99997;
        }
        #blockLayout .box * {
            line-height: 1.5
        }
        #blockLayout .box .header {
            border-top-left-radius: 10px;
            border-top-right-radius: 10px;
            text-align: center;
            background-size: contain;
            background-repeat: no-repeat;
            height: 80px;
        }
        #blockLayout .box .body {
            padding: 20px;
            background-color: #ece5d8;
            border-bottom-right-radius: 10px;
            border-bottom-left-radius: 10px;
            background-size: cover;
        }
        #blockLayout .box img {
            max-width: 100%;
        }
        #blockLayout.active {
            display: block;
        }
        #blockLayout .box h1 {
            color: #d3bc8e;
            font-size: 32px;
            font-weight: bolder;
            line-height: 80px;
            margin: 0;
        }
        #blockLayout .box p {
            color: #323947;
            font-size: 18px;
            margin: 0;
            margin-bottom: 10px;
        }
        #blockLayout .box label {
            font-size: 16px;
        }
        #blockLayout .box .tabs {
            width: 100%;
        }
        #blockLayout .box .tabs-title {
            position: relative;
            height: 40px;
            white-space: nowrap;
            border-bottom: 1px solid #7e7e7e;
            display: flex;
        }
        #blockLayout .box .tabs-title .tab {
            display: inline-block;
            vertical-align: middle;
            font-size: 18px;
            position: relative;
            line-height: 40px;
            padding: 0 15px;
            text-align: center;
            cursor: pointer;
            flex: 1 0 0;
            width: auto;
            color: #7e7e7e;
            color: #323947;
        }
        #blockLayout .box .tabs-title .tab::after {
            position: absolute;
            left: 0;
            top: 0;
            content: "";
            width: 100%;
            height: 41px;
            border-radius: 2px 2px 0 0;
            box-sizing: border-box;
            pointer-events: none;
            border-bottom: 2px solid #323947;
        }
        #blockLayout .box .tabs-content .tab-item {
            padding: 10px 0;
            max-height: 400px;
            overflow-x: hidden;
            padding-right: 8px;
        }
        #blockLayout textarea, #blockLayout input {
            width: 100%;
            box-sizing: border-box;
            resize:none;
            padding: 10px;
            font-size: 16px;
            color: #000;
            height: 120px;
            border-radius: 5px;
            background-color: #fff;
            border: 0;
            margin-bottom: 10px;
        }
        #blockLayout input {
            padding: 4px 5px;
            height: auto;
            font-size: 14px;
        }
        #blockLayout textarea:focus-visible, #blockLayout input:focus-visible {
            outline: 0;
        }
        #blockLayout input[type="checkbox"] {
            padding: 0;
            margin: 0;
            width: auto;
        }
        #blockLayout input[type="checkbox"] + label {
            position: relative;
            margin-right: 10px;
        }
        #blockLayout input[type="checkbox"] + label::before {
            background-color: #ece5d8;
            border-radius: 0.5px;
            color: #FFF;
            content: "\\a0";
            display: inline-block;
            height: 15px;
            text-align: center;
            line-height: 100%;
            width: 15px;
            cursor: pointer;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
        }
        #blockLayout input[type="checkbox"] {
            clip: rect(0, 0, 0, 0);
            position: absolute;
        }
        #blockLayout input[type="checkbox"]:checked + label::before {
            content: "\\2713";
            color: #323947;
        }
        #blockLayout .cornerIcon {
            position: absolute;
            width: 24px;
            height: 24px;
            background-size: 24px 24px;
        }
        #blockLayout .cornerIcon.lt {
            left: -10px;
            top: -10px;
        }
        #blockLayout .cornerIcon.rt {
            right: -10px;
            top: -10px;
            transform: rotate(90deg);
        }
        #blockLayout .cornerIcon.lb {
            left: -10px;
            bottom: -10px;
            transform: rotate(-90deg);
        }
        #blockLayout .cornerIcon.rb {
            right: -10px;
            bottom: -10px;
            transform: rotate(180deg);
        }
        #blockLayout .toolerGroup {
            position: absolute;
            top: 30px;
            right: 20px;
            display: flex;
            align-items: center;
        }
        #blockLayout .iconButton {
            cursor: pointer;
            display: inline-block;
            width: 24px;
            height: 24px;
            background-size: 24px 24px;
            margin-left: 5px;
            position: relative;
        }
        #blockLayout .iconButton.watchButton i {
            position: absolute;
            display: block;
            top: 0;
            right: 0;
            width: 6px;
            height: 6px;
            background: red;
            border-radius: 50%;
        }
        #blockLayout .btnGroup {
            display: flex;
            justify-content: space-evenly;
            margin-top: 10px;
        }
        #blockLayout #blockMsg {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            min-width: 100px;
            border-radius: 2px;
            background-color: rgba(0,0,0,.6);
            color: #fff;
            visibility: hidden;
            transition: all 0.3s;
            padding: 12px 25px;
            text-align: center;
        }
        #blockLayout #blockMsg.active {
            visibility: visible;
            z-index: 99999;
        }
        .blurBlock {
            filter: blur(30px);
        }
        #blockLayout .button {
            background-color: #4a5366;
            border-radius: 50px;
            padding: 5px;
            display: flex;
            align-items: center;
            cursor: pointer;
            transition: all 0.3s;
        }
        #blockLayout .button:hover {
            box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
        }
        #blockLayout .button .icon {
            background: #333333;
            border-radius: 50%;
            position: relative;
            width: 40px;
            height: 40px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        #blockLayout .button .text {
            color: #ece5d8;
            margin: 0 30px;
            font-size: 18px;
        }
        #blockLayout .button .icon span {
            border-radius: 10px;
            width: 20px;
            height: 2px;
        }
        #blockLayout .resetButton span {
            background-color: #38a1e4;
            position: absolute;
        }
        #blockLayout .resetButton span:first-child {
            -webkit-transform: rotate(-45deg);
            transform: rotate(-45deg);
        }
        #blockLayout .resetButton span:last-child {
            -webkit-transform: rotate(45deg);
            transform: rotate(45deg);
        }
        #blockLayout .button .icon.listIcon {
            flex-direction: column;
        }
        #blockLayout .button .icon.listIcon span {
            background-color: #ece5d8;
            margin: 3px 0
        }
        #blockLayout .button .icon .yellow-circle {
            width: 25px;
            height: 25px;
            background-color: #ffcc33;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        #blockLayout .button .icon .black-circle {
            background-color: #333333;
            width: 20px;
            height: 20px;
            border-radius: 50%;
        }
        #blockLayout .modulesWrap {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            z-index: 99998;
            display: flex;
            gap: 10px
        }
        #blockLayout .modulesWrap > * {
            position: relative;
            width: 300px;
            border-radius: 2px;
            background-color: #323947;
            color: #fff;
            display: none;
            text-align: center;
            z-index: 99998;
            border: 5px solid #fff;
            border-radius: 10px;
        }
        #blockLayout .modulesWrap #compareWrap {
            width: 400px
        }
        #blockLayout .modulesWrap > *.show {
            display: block;
        }
        #blockLayout .modulesWrap .toolerGroup {
            top: 12px;
        }
        #blockLayout .modulesWrap .areaBox {
            padding: 12px;
        }
        #blockLayout .modulesWrap .areaBox h2 {
            font-size: 18px;
            font-weight: 400;
            margin: 0;
            color: #fff;
        }
        #blockLayout .modulesWrap .areaBox .areaList, #blockLayout .modulesWrap .areaBox .areaForm {
            margin-top: 10px;
            overflow-x: hidden;
            max-height: 340px;
            padding: 0 2px;
        }
        #blockLayout .modulesWrap #updateWrap .areaBox .areaList {
            overflow: unset;
        }
        #blockLayout .modulesWrap .areaBox .areaList .areaItem {
            padding: 0px 10px;
            margin-bottom: 5px;
            border-radius: 5px;
            background-color: #fff;
            display: flex;
            align-items: center;
            justify-content: space-between;
            color: #323947;
            height: 33px;
        }
        #blockLayout .modulesWrap .areaBox .areaList .areaItem:hover {
            transform: scale(1.01);
        }
        #blockLayout .modulesWrap .areaBox .areaList .areaItem:last-child {
            margin-bottom: 0;
        }
        #blockLayout .modulesWrap .areaBox .areaList .areaItem .name {
            width: 70%;
            text-overflow: ellipsis;
            overflow: hidden;
            white-space: nowrap;
            cursor: pointer;
            text-align: left;
            font-size: 14px;
        }
        #blockLayout .modulesWrap .areaBox .areaList .areaItem .actions {
            width: 20%;
            display: flex;
            align-items: center;
            justify-content: flex-end;
        }
        #blockLayout #areaWrap .areaBox .areaList .areaItem .actions .switchButton {
            position: relative;
            height: 22px;
            line-height: 22px;
            width: 45px;
            border: 1px solid #d2d2d2;
            border-radius: 20px;
            cursor: pointer;
            background-color: #fff;
            -webkit-transition: .1s linear;
            transition: .1s linear;
        }
        #blockLayout #areaWrap .areaBox .areaList .areaItem .actions .switchButton.on {
            border-color: #cfc1a6;
            background-color: #cfc1a6;
        }
        #blockLayout #areaWrap .areaBox .areaList .areaItem .actions .switchButton i {
            position: absolute;
            left: 5px;
            top: 2.5px;
            width: 16px;
            height: 16px;
            border-radius: 20px;
            background-color: #d2d2d2;
            -webkit-transition: .1s linear;
            transition: .1s linear;
        }
        #blockLayout #areaWrap .areaBox .areaList .areaItem .actions .switchButton.on i {
            left: 100%;
            margin-left: -21px;
            background-color: #fff;
        }
        #blockLayout #areaWrap .areaBox .areaForm {
            display: none;
            flex-wrap: wrap;
            justify-content: space-evenly;
            align-items: center;
        }
        #blockLayout #areaWrap .areaBox .areaForm p {
            width: 25%;
            font-size: 14px;
            margin-top: 0;
        }
        #blockLayout #areaWrap .areaBox .areaForm input {
            width: 75%;
            line-height: 0;
        }
        #blockLayout #areaWrap .areaBox .areaForm > * {
            margin-bottom: 10px;
        }
        #blockLayout #areaWrap .areaBox .areaForm button {
            width: 35%;
            margin-top: 10px;
            height: 30px;
            border-radius: 5px;
            border: 0;
            cursor:pointer;
        }
        #blockLayout #areaWrap .areaBox .areaForm button.backToList {
            background: #fff;
            color: #323947;
        }
        #blockLayout #areaWrap .areaBox .areaForm button.submitArea {
            background: #00b2ff;
            color: #fff;
        }
        #blockLayout #compareWrap .areaBox p {
            font-size: 16px;
            text-align: left;
            margin-bottom: 10px;
        }
        @media screen and (max-width: 768px){
            #blockLayout .box {
                width: 95%;
            }
            #blockLayout .box .header {
                height: 50px;
            }
            #blockLayout .box h1 {
                font-size: 18px;
                line-height: 50px;
            }
            #blockLayout .toolerGroup {
                top: 15px;
            }
        }
    `;

    GM_addStyle(BLOCK_STYLE)

})();