Greasy Fork is available in English.

B站自用工具箱

bilibili自用工具箱,清理转发抽奖动态、批量取关、自动签到

// ==UserScript==
// @name         B站自用工具箱
// @namespace    http://tampermonkey.net/
// @version      1.0.4
// @description  bilibili自用工具箱,清理转发抽奖动态、批量取关、自动签到
// @author       Eliauk
// @match        *://*.bilibili.com/*
// @exclude      *://api.bilibili.com/*
// @exclude      *://api.*.bilibili.com/*
// @exclude      *://*.bilibili.com/api/*
// @exclude      *://member.bilibili.com/studio/bs-editor/*
// @exclude      *://t.bilibili.com/h5/dynamic/specification
// @exclude      *://bbq.bilibili.com/*
// @exclude      *://message.bilibili.com/pages/nav/header_sync
// @exclude      *://s1.hdslb.com/bfs/seed/jinkela/short/cols/iframe.html
// @exclude      *://open-live.bilibili.com/*
// @resource     ArcoDesignStyle      https://update.greasyfork.org/scripts/490751/ArcoDesignStyle.user.css
// @icon         https://www.bilibili.com/favicon.ico?v=1
// @icon64       data:image/png;base64,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
// @license      GPL-3.0 License
// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @grant        GM_getResourceText
// @grant        GM_registerMenuCommand
// @require      https://update.greasyfork.org/scripts/493023/1363403/UnaTools.js
// @noframes
// ==/UserScript==

const isDebug = false; // 调试日志用
const debug = isDebug ? log : () => {};
const pathname = /\d+/.exec(window.location.pathname);
const dedeUserID = getCookie("DedeUserID");
const mid = pathname ? +pathname[0] : 0;
const my_mid = dedeUserID ? +dedeUserID : 0;
const url = window.location.href;
const prefix = "eliauk_";
const globalStyle = `.el-hidden{display:none}`;
const ELIAUK_TOOLS_CONFIG = "eliauk_tools_config";
const ELIAUK_DYNAMIC_KEY = "eliauk_dynamic_key";
const ELIAUK_SIGN_TIME = "eliauk_sign_time";
const DefaultConfig = {
    times: 90 * 60 * 60 * 24 * 1000, // 默认动态过期时间
    setting: {
        "dynamic_function": {
            title: "删除转发抽奖动态", enable: true
        }, "follow_function": {
            title: "批量取关", enable: true
        }, "sign_function": {
            title: "自动签到", enable: true
        }
    }
};

/**
 * 动态类型
 * @type {{forward: string, lottery: string}}
 */
const DynamicType = {
    forward: "DYNAMIC_TYPE_FORWARD", lottery: "RICH_TEXT_NODE_TYPE_LOTTERY"
};

/**
 * 获取cookie的值
 * @param e
 * @returns { string | null }
 */
function getCookie(e) {
    return decodeURIComponent(document.cookie.replace(new RegExp(`(?:(?:^|.*;)\\s*${encodeURIComponent(e).replace(/[\-.+*]/g, "\\$&")}\\s*=\\s*([^;]*).*$)|^.*$`), "$1")) || null;
}

/**
 * 获取token
 * @returns { string | null }
 */
function getUserCSRF() {
    return getCookie("bili_jct");
}

(function () {
    'use strict';
    let SConfig = {};

    /**
     * 主方法
     */
    function main() {
        load_config();
        preload_style();
        setting_modal();
        Object.entries(SConfig.setting).forEach(([fun, config]) => {
            if (config.enable) {
                if (eval(`typeof ${fun}`) === 'function') {
                    eval(`${fun}();`);
                } else {
                    log("El", `${fun} not found`);
                }
            }
        });
        // dynamic_function();
        // follow_function();
        // sign_function();
    }

    /**
     * 保存配置
     */
    function save_config() {
        GM_setValue(ELIAUK_TOOLS_CONFIG, JSON.stringify(SConfig));
        debug(SConfig);
    }

    /**
     * 加载配置
     */
    function load_config() {
        const res = GM_getValue(ELIAUK_TOOLS_CONFIG);
        if (res && (res !== 'undefined' && res !== 'null')) {
            try {
                SConfig = JSON.parse(res);
            } catch (e) {
                SConfig = res;
            }
        } else {
            SConfig = DefaultConfig;
            debug("default", SConfig);
        }
    }

    /**
     * 预加载样式
     */
    function preload_style() {
        function loadResource(resourceName) {
            const data = GM_getResourceText(resourceName);
            GM_addStyle(data);
        }

        loadResource("ArcoDesignStyle");
        // 添加全局样式
        GM_addStyle(aniStyle);
        GM_addStyle(toastStyle);
        GM_addStyle(globalStyle);
    }

    /**
     * 控制面板
     */
    function setting_modal() {
        const id = prefix + generateMixed(8).toLocaleLowerCase();
        safeFunction("body", () => {
            retryInterval(() => {
                if (!render()) return false;
                register_menu();
                add_event_listener();
                debug("mount success");
                return true;
            });
        });


        /**
         * 改变设置
         * @param e
         */
        function setting_change(e) {
            const $ev = e || window.event;
            const target = $ev.target || $ev.srcElement;
            const enable = parseBoolean(target.getAttribute("aria-checked"));
            const data_id = target.dataset.id;
            SConfig.setting[data_id].enable = enable;
            save_config();
        }

        /**
         * 设置列表
         * @returns { string }
         */
        function setting_list() {
            const setting = SConfig.setting;
            debug(SConfig);
            return Object.entries(setting).reduce((list, [id, config]) => {
                return list.concat(`<div class="arco-collapse-item""><div class="arco-collapse-item-header arco-collapse-item-header-left""><div class="arco-collapse-item-header-title"">${config?.title}</div><div class="arco-collapse-item-header-extra"><button type="button" role="switch" title="${config?.title}" aria-checked="${!!config?.enable}" class="setting-switch arco-switch arco-switch-type-circle arco-switch-small${!!config?.enable ? " arco-switch-checked" : " "}" data-id="${id}""><span class="arco-switch-handle""><span class="arco-switch-handle-icon""></span></span></button></div></div></div>`);
            }, '');
        }

        /**
         * 添加事件监听
         */
        function add_event_listener() {
            $all(`#${id} .close-button`).forEach((element) => {
                element.addEventListener("click", hide);
            });
            $all(".arco-modal-body .page-body .arco-switch").forEach(ele => {
                ele.addEventListener("click", arcoSwitchChange);
            });
            // $one(`#${id}`).addEventListener("blur", hide);
            window.addEventListener('beforeunload', (e) => {
                $all(`#${id} .setting-switch`).forEach(ele => {
                    ele.removeEventListener("change", setting_change);
                });
                hide();
            });
        }

        /**
         * 设置列表监听
         */
        function setting_list_listen() {
            $all(`#${id} .setting-switch`).forEach(ele => {
                ele.addEventListener("change", setting_change);
            });
        }

        /**
         * 显示
         */
        function show() {
            document.addEventListener('mousedown', inside_check);
            fadeInShow($one(`#${id}`));
        }

        /**
         * 隐藏
         */
        function hide() {
            fadeOutHide($one(`#${id}`));
            document.removeEventListener('mousedown', inside_check);
        }

        /**
         * 注册菜单
         */
        function register_menu() {
            GM_registerMenuCommand(`⚙️控制面板`, () => {
                show();
            });
            GM_registerMenuCommand(`🔄脚本重置 - 修复脚本`, () => {
                GM_deleteValue(ELIAUK_TOOLS_CONFIG);
                location.reload();
            });
        }

        /**
         * 内部检查
         * @param e
         */
        function inside_check(e) {
            debug("inside check");
            if (!insideCheck(e, `#${id}`)) {
                hide();
            }
        }
        

        /**
         * 样式
         * @param id
         * @returns { string }
         */
        function globalStyle(id) {
            return `#${id} a,#${id} abbr,#${id} address,#${id} blockquote,#${id} caption,#${id} cite,#${id} code,#${id} dd,#${id} del,#${id} dfn,#${id} dl,#${id} dt,#${id} em,#${id} fieldset,#${id} form,#${id} h1,#${id} h2,#${id} h3,#${id} h4,#${id} h5,#${id} h6,#${id} iframe,#${id} img,#${id} ins,#${id} label,#${id} legend,#${id} li,#${id} object,#${id} ol,#${id} p,#${id} pre,#${id} q,#${id} small,#${id} strong,#${id} sub,#${id} sup,#${id} table,#${id} tbody,#${id} td,#${id} tfoot,#${id} th,#${id} thead,#${id} tr,#${id} ul{border:0;margin:0;padding:0}#${id} {position:fixed;top:3.9vw;right:12.5vw;z-index:999999;box-shadow:-2px 2px 5px rgb(0 0 0 / 30%);border-radius:var(--border-radius-medium);font-family:HarmonyOS Sans SC,Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Hiragino Sans GB,noto sans,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif}#${id} .arco-modal{position:static;width:265px}#${id} .arco-collapse-item-header-left{padding-right:13px;padding-left:13px;cursor:default}#${id} .arco-modal-header{border-bottom:none;height:40px}#${id} .arco-divider-horizontal.arco-divider-with-text{margin:26px 0}#${id} .arco-modal-body{padding-top:0;padding-bottom:0;overflow:visible;margin-bottom:28px}#${id} .arco-modal-body .arco-divider-horizontal.arco-divider-with-text:first-child{margin-top:0}#${id} .arco-collapse-item .arco-collapse-item-header .arco-collapse-item-header-title{font-weight:500}#${id} div::-webkit-scrollbar{width:10px;background:transparent}#${id} div::-webkit-scrollbar-thumb{background:var(--color-fill-3) content-box;border:2px solid transparent;border-radius:5px}`;
        }

        /**
         * 渲染
         * @returns { boolean }
         */
        function render() {
            if (!document.body) return false;
            if (!!$one(`#${id}`)) return true;
            try {
                const modal = document.createElement("div");
                modal.id = id;
                modal.tabIndex = "-1";
                modal.outline="0";
                modal.hidefocus="true"
                modal.className = "el-hidden eliauk-container";
                modal.innerHTML = `<div class="arco-modal"><div class="arco-modal-header"><div class="arco-modal-title arco-modal-title-align-center"></div><div tabindex="-1" role="button" aria-label="Close" class="close-button arco-modal-close-btn"><span class="arco-icon-hover"><svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" class="arco-icon arco-icon-close" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path d="M9.857 9.858 24 24m0 0 14.142 14.142M24 24 38.142 9.858M24 24 9.857 38.142"></path></svg></span></div></div><div class="arco-modal-body"><div class="arco-divider arco-divider-horizontal arco-divider-with-text"><span id="page-title" class="arco-divider-text arco-divider-text-left">控制面板</span></div><div class="page-body"><div id="rule-list-config-collapse" class="arco-collapse">${setting_list()}</div></div></div></div>`;
                document.body.appendChild(modal);
                setting_list_listen();
                GM_addStyle(globalStyle(id));
                return true;
            } catch (e) {
                log(e);
                return false;
            }
        }
    }

    /**
     * 动态
     * @returns { void }
     */
    function dynamic_function() {
        debug("dynamic function loading");
        if (!/https?:\/\/space\.bilibili\.com\/(\d+)\/dynamic(?=\/|\?|$)/.test(url)) {
            debug("动态", "该页面不适用");
            return;
        }
        if (!(mid && my_mid && mid === my_mid)) {
            return;
        }
        let group, buttongroup;
        const id = prefix + generateMixed(8).toLocaleLowerCase();

        class Group {
            constructor(key, id, load) {
                this.key = key;
                this.load = load;
                this.target = $one(`#${id} .target`);
                this.clean = $one(`#${id} .target .clean`);
                this.cleanEnter = $one(`#${id} .target .clean-enter`);
                this.children = $all(`#${id} .target .clean-children`);
            }

            status() {
                return !GM_getValue(this.key);
            }

            enable() {
                GM_deleteValue(this.key);
                if (this.load) {
                    this.clean.classList.remove("clean-loading");
                }
            }

            disable() {
                GM_setValue(this.key, true);
                if (this.load) {
                    this.clean.classList.add("clean-loading");
                }
            }

            buttongroup() {
                return {
                    target: this.target, clean: this.clean, cleanEnter: this.cleanEnter, children: this.children
                };
            }
        }

        /**
         * @returns { void }
         */
        function initial() {
            render();
            group = new Group(ELIAUK_DYNAMIC_KEY, id, true);
            buttongroup = group.buttongroup();
        }

        /**
         * 历史动态api
         * @param offset
         * @returns { Promise<any> }
         */
        function space_dynamic_api(offset = null) {
            return request('https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space', 'GET', filterNullUndefined({
                host_mid: mid, offset: offset, timezone_offset: '-480', features: 'itemOpusStyle'
            }));
        }

        /**
         * 历史动态
         * @param dynamic_id
         * @returns { Promise<any> }
         */
        function lottery_notice_api(dynamic_id) {
            return request('https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice', 'GET', {
                business_type: 4, business_id: dynamic_id
            });
        }

        /**
         * 删除动态api
         * @param dynamic_id
         * @returns { Promise<any> }
         */
        function rm_dynamic_api(dynamic_id) {
            return request('https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic', "POST", {
                dynamic_id, csrf_token: getUserCSRF()
            });
        }

        /**
         * 是否为抽奖动态
         * @param summary
         * @returns { boolean }
         */
        function is_lottery_dynamic(summary) {
            let rich_text_nodes = summary["rich_text_nodes"] ?? [];
            return rich_text_nodes.some(tag => tag.type === DynamicType.lottery);
        }

        /**
         * 空间动态
         * @returns { Promise<any[]> }
         */
        async function space_dynamic() {
            let offset = null;
            let results = [];
            for (let has_more = 1; has_more;) {
                const res = await space_dynamic_api(offset);
                debug("space items", res);
                if (!res || res.code || !res.data) {
                    break;
                }
                const data = res.data;
                const items = data["items"];
                offset = data["offset"];
                has_more = data["has_more"];
                if (!items || items.length < 1) {
                    continue;
                }
                results = results.concat(items);
            }
            return results;
        }

        /**
         * 删除动态
         * @param dynamic_id
         * @returns { Promise<boolean> }
         */
        async function rm_dynamic(dynamic_id) {
            if (!dynamic_id) return false;
            const result = await rm_dynamic_api(dynamic_id);
            debug(result);
            return !(!result || result.code || !result.data);
        }

        /**
         * 抽奖结果是否已出
         * @param dynamic_id
         * @returns { Promise<boolean> }
         */
        async function has_lottery_result(dynamic_id) {
            const result = await lottery_notice_api(dynamic_id);
            if (!result || result.code || !result.data) {
                return false;
            }
            const notice = result.data;
            return !!notice["lottery_result"];
        }

        /**
         * 删除动态主方法
         * @param dynamic
         * @returns { Promise<number> }
         */
        async function rm_dynamic_item(dynamic) {
            // 转发动态
            if (DynamicType.forward !== dynamic["type"]) {
                debug("该动态非转发动态");
                return 0;
            }
            debug(dynamic);
            // 该动态是转发动态
            const origin_dynamic = dynamic["orig"];
            if (!origin_dynamic) {
                debug("orig is null");
                return 0;
            }
            const modules = origin_dynamic["modules"];
            if (!modules) {
                debug("modules is null");
                return 0;
            }
            const summary = acquireChain(["module_dynamic", "major", "opus", "summary"], modules);
            if (is_lottery_dynamic(summary)) {
                // 原始动态id
                const origin_id = origin_dynamic["id_str"];
                const pub_ts = acquireChain(["module_author", "pub_ts"], modules);
                // 是互动抽奖
                if (!isExpired(pub_ts, SConfig.times) && !await has_lottery_result(origin_id)) {
                    debug("未过指定天数且未出结果", summary["text"]);
                    return 0;
                }
                return (await rm_dynamic(dynamic["id_str"])) ? 1 : 0;
            } else {
                debug("不是抽奖动态");
            }
            return 0;
        }

        /**
         * @returns { void }
         */
        function render() {
            if ($one(`#${id}`)) {
                return;
            }
            const ele = document.createElement("div");
            ele.id = id;
            ele.innerHTML = `<svg width="0" height="0" style="position: absolute;"><defs><filter id="goo"><feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur"/><feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 19 -9" result="goo"/><feComposite in="SourceGraphic" in2="goo" operator="atop"/></filter></defs></svg><div class="target noselect"><div class="clean clean-box">清理</div><span class="clean-children clean-box icon-clean-left">取消</span><span class="clean-children clean-box icon-clean-right clean-enter">确定</span></div>`;
            $one("#page-dynamic .section.user-info").appendChild(ele);
            // 添加全局样式
            GM_addStyle(globalStyle(id));
        }

        /**
         * @returns { void }
         */
        function childrenClick() {
            buttongroup.target.classList.remove("checked");
            buttongroup.clean.addEventListener("click", cleanClick);
            buttongroup.children.forEach(ele => {
                ele.removeEventListener("click", childrenClick);
            });
        }

        /**
         * @returns { void }
         */
        function cleanClick() {
            if (!group.status()) return;
            buttongroup.target.classList.add("checked");
            buttongroup.children.forEach(ele => {
                ele.addEventListener("click", childrenClick);
            });
            buttongroup.clean.removeEventListener("click", cleanClick);
        }

        /**
         * @returns { Promise<any> }
         */
        async function cleanEnterClick() {
            if (!group.status()) return;
            try {
                group.disable();
                debug("remove start");
                const dynamics = await space_dynamic();
                debug("space dynamic list", dynamics);
                let success = await dynamics.reduce(async (cnt, dynamic) => await cnt + await rm_dynamic_item(dynamic), 0);
                debug(`共有${dynamics.length}条动态, 已成功删除${success}条`);
                toast(`共有${dynamics.length}条动态, 已成功删除${success}条`, ToastType.success, 2000);
            } catch (e) {
                log(`删除失败, ${e.message}`);
                toast(`删除失败, ${e.message}`, ToastType.error, 2000);
            } finally {
                debug("remove end");
                group.enable();
            }
        }

        /**
         * 全局样式
         * @param id
         * @returns { string }
         */
        function globalStyle(id) {
            return `.clean-loading::after {content:'';position:absolute;top:0;left:0;right:0;bottom:0;margin:auto;border:5px solid transparent;border-left:5px solid #8f41e9;border-right:5px solid #8f41e9;border-radius:50%;animation:spin 1s linear infinite;}#${id}{padding-top:18px;border-top:1px solid #e5e9ef;margin-top:10px}#${id}.join-button{position:relative;display:inline;cursor:pointer;height:20px;width:20px}#${id}.join-button__btn{color:#23c9ed;font-size:20px;text-align:center;border:none;font-size:20px;border-radius:4px}#${id}.join-button__btn.checked{background:#019cd3}#${id}.join-button__btn:active{color:#4FD4F1}#${id}.join-button__btn:after{content:attr(data-tips);position:absolute;white-space:nowrap;opacity:0;left:50%;transform:translateX(-50%);transition:.1s;font-size:16px;background-image:-webkit-linear-gradient(left,#00e0ee,#2d97ff);-webkit-background-clip:text;-webkit-text-fill-color:transparent;pointer-events:none}#${id}.join-button:hover .join-button__btn:after{opacity:1 !important;transform:translate(-50%,-150%)}.noselect{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.target{max-width:200px;filter:url("#goo");text-align:center;margin:auto;position:relative}.clean{display:block;position:relative;z-index:1;scale:1}.clean-box{font-size:12px;color:#fff;background-image:linear-gradient(0deg,rgb(255 186 251),rgb(41 201 255));border-radius:50%;width:45px;line-height:45px;margin:auto;cursor:pointer;transition:1s ease}.clean-children{position:absolute;top:0;left:0;right:0}.target.checked .icon-clean-left{-ms-transform:translateX(-45px);-webkit-transform:translateX(-45px);transform:translateX(-45px)}.target.checked .icon-clean-right{-ms-transform:translateX(45px);-webkit-transform:translateX(45px);transform:translateX(45px)}.target.checked .clean{opacity:0;scale:0;cursor:default}`;
        }

        safeWaitFunc("#page-dynamic .section.user-info", () => {
            initial();
            buttongroup.clean.addEventListener("click", cleanClick);
            buttongroup.cleanEnter.addEventListener("click", cleanEnterClick);
            window.addEventListener('beforeunload', (e) => {
                group.enable();
                buttongroup.clean.removeEventListener("click", cleanClick);
                buttongroup.cleanEnter.removeEventListener("click", cleanEnterClick);
            });
        });
    }

    /**
     * 关注
     * @returns { void }
     */
    function follow_function() {
        if (!/https?:\/\/space\.bilibili\.com\/(\d+)\/fans\/follow(?=\/|\?|$)/.test(url)) {
            debug("关注", "该页面不适用");
            return;
        }
        if (!(mid && my_mid && mid === my_mid)) {
            return;
        }
        const id = prefix + generateMixed(8).toLocaleLowerCase();
        let eliauk_model;

        /**
         * 初始化消息框
         */
        function init_message_box() {
            if (!!$one(`#${id}`)) return;
            let modal = document.createElement('div');
            modal.className = 'modal-container el-hidden';
            modal.id = id;
            modal.innerHTML = `<div class="modal-mask"></div><div class="modal-wrapper eliauk-message-wrapper"><div class="modal"><div class="modal-header"><i id="message-box-close" class="modal-header-close iconfont icon-ic_close"></i><div class="eliauk-modal-title modal-title"><p id="message-box-title">取消关注</p></div></div><div class="modal-body message-box-body"><div class="message-box-content"></div></div><div class="btn-container modal-footer"><button type="button" class="message-box-button" id="message-box-cancel"><span class="message-box-button-span">取消</span></button><button type="button" class="message-box-button" id="message-box-action"><span class="message-box-button-span">确定</span></button></div></div></div>`;
            document.body.appendChild(modal);

            eliauk_model = $one(`#${id}`);
            // 添加全局样式
            GM_addStyle(globalStyle(id));
        }

        /**
         * 消息框确定事件
         * @param e
         * @returns { Promise<void> }
         */
        async function message_box_enter(e) {
            e.preventDefault();
            debug(this._param);
            await unfollows(this._param?.tag_id);
        }

        /**
         * 打开消息框
         * @param tag_id
         */
        function load_message_box(tag_id) {
            const box = $one('.message-box-content');
            box.innerHTML = '确定取消本分组下所有关注?';
            fadeInShow(eliauk_model);
            const button = $one('#message-box-action');
            button._param = { tag_id };
            button.addEventListener('click', message_box_enter);
            $one('#message-box-close').addEventListener('click', exit_message_box);
            $all('.message-box-button').forEach(ele => {
                ele.addEventListener('click', exit_message_box);
            });
        }

        /**
         * 退出消息框
         */
        function exit_message_box() {
            fadeOutHide(eliauk_model);
            $one('#message-box-action').removeEventListener('click', message_box_enter);
            $all('.message-box-button').forEach(ele => {
                ele.removeEventListener('click', exit_message_box);
            });
            $one('#message-box-close').removeEventListener('click', exit_message_box);
        }


        /**
         * 获取该分组下的关注列表
         * @param tag_id
         * @returns { Promise<[]> }
         */
        async function tag_follow(tag_id) {
            const size = 20;
            let page = 1;
            let results = [];
            let length = 0;
            do {
                const res = await tag_follow_api(tag_id, page++, size);
                debug("tag follow list", res);
                if (!res || res.code || !res.data) {
                    break;
                }
                const data = res.data;
                length = data.length;
                results = results.concat(data);
            } while (length === size);
            return results;
        }

        /**
         * 获取该分组关注api
         * @param tag_id
         * @param pn
         * @param ps
         * @returns { Promise<*> }
         */
        function tag_follow_api(tag_id, pn, ps) {
            return request("https://api.bilibili.com/x/relation/tag", 'GET', {
                mid: mid, tagid: tag_id, pn: pn, ps: ps
            });
        }

        /**
         * @returns { void }
         */
        function render() {
            $all(".follow-list-container .follow-item.custom-group").forEach((ele) => {
                const dropdown_menu = $one(".be-dropdown-menu", ele);
                const cancel_follows = $all("cancel-follows", dropdown_menu);
                if (!!cancel_follows && cancel_follows.length > 0) {
                    debug("该分组下已经存在");
                    return;
                }
                const dropdown_cancel = document.createElement("li");
                dropdown_cancel.className = "be-dropdown-item be-dropdown-item-delimiter cancel-follows";
                dropdown_cancel.innerHTML = "取消关注";
                const tag_id = ele.getAttribute('tagid');
                dropdown_menu.insertBefore(dropdown_cancel, dropdown_menu.children[0]);
                dropdown_cancel.addEventListener("click", async () => {
                    load_message_box(tag_id);
                });
            });
        }

        /**
         * 取关用户api
         * @param uid
         * @returns { Promise<*> }
         */
        function unfollow_api(uid) {
            return request("https://api.bilibili.com/x/relation/modify", "POST", {
                fid: uid, act: 2, re_src: 11, csrf: getUserCSRF()
            });
        }

        /**
         * 取关用户
         * @param uid
         * @returns { Promise<number> }
         */
        async function unfollow(uid) {
            const res = await unfollow_api(uid);
            debug("unfollow", res);
            if (!res || res.code) {
                return 0;
            }
            return 1;
        }

        /**
         * 分组取关
         * @param tag_id
         * @returns { Promise<void> }
         */
        async function unfollows(tag_id) {
            let action, cancel_item;
            try {
                debug("unfollow start");
                debug("tag id", tag_id);
                action = $one(`li[tagid="${tag_id}"]`);
                cancel_item = $one(".cancel-follows", action);
                cancel_item.classList.add("el-disabled");
                const follows = await tag_follow(tag_id);
                if (follows?.length < 1) {
                    toast('没有需要取消关注的up主', ToastType.info, 2000);
                    return;
                }
                const unfollow_list = follows.map(f => f.mid);
                let success = await unfollow_list.reduce(async (cnt, uid) => cnt + await unfollow(uid), 0);
                debug(`共有${unfollow_list.length}位up主需要取关, 已成功取关${success}位`);
                toast(`共有${unfollow_list.length}位up主需要取关, 已成功取关${success}位`, ToastType.success, 2000);
                location.reload();
            } catch (e) {
                log(`取关失败, ${e.message}`);
                toast(`取关失败, ${e.message}`, ToastType.error, 2000);
            } finally {
                debug("unfollow end");
                cancel_item.classList.remove("el-disabled");
            }
        }

        /**
         * 全局样式
         * @param id
         * @returns { string }
         */
        function globalStyle(id) {
            return `#${id} .eliauk-message-wrapper{width:420px}#${id} .eliauk-modal-title{padding:0 !important}#${id} .modal-wrapper .modal-footer{padding:5px 15px 10px;text-align:right}#${id} #message-box-title{text-align:left;padding:15px 15px 10px;margin-bottom:0;font-size:18px;line-height:1;color:#303133}#${id} .message-box-body{position:relative;color:#606266;padding:10px 15px !important}#${id} .message-box-content{position:relative;overflow:auto;text-align:left;height:auto !important}#${id} .message-box-button{margin-right:0;display:inline-block;padding:9px 15px;line-height:1;transition:all .2s ease;text-align:center;vertical-align:middle;outline:none;border-radius:3px;cursor:pointer;white-space:nowrap;box-sizing:border-box;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}#${id} #message-box-action{color:#fff;margin-left:10px;background-color:#00a1d6;border:1px solid #00a1d6}#${id} #message-box-cancel{background:#fff;border:1px solid #dcdfe6;color:#606266}#${id} #message-box-action:hover,#${id} #message-box-action:focus{color:#fff;background-color:#00b5e5;border-color:#00b5e5}#${id} #message-box-cancel:hover,#${id} #message-box-cancel:focus{color:#00a1d6;border-color:#c6e2ff;background-color:#ecf5ff}#${id} .el-disabled{cursor:not-allowed;color:#cfd0d3;pointer-events:none;}`;
        }

        /**
         * @returns { void }
         */
        function initial() {
            render();
            init_message_box();
        }

        safeWaitFunc(".follow-list-container .follow-item.custom-group .be-dropdown-menu", () => {
            initial();
        });
    }

    /**
     * 签到
     * @returns { void }
     */
    function sign_function() {
        if (!dedeUserID) {
            log("请先进行登录~");
            toast("🎉请先进行登录~", ToastType.warn, 2000);
            return;
        }

        /**
         * 是否为今天
         * @param t
         * @returns { boolean }
         */
        function same_day(t) {// 是否同一天
            return t === new Date().toDateString();
        }

        /**
         * 签到api
         * @returns { Promise<*> }
         */
        function sign_api() {
            return request("https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign", "GET");
        }

        /**
         * 签到
         * @returns { Promise<void> }
         */
        async function sign() {
            const { code, message } = await sign_api();
            if (code === 0) {
                toast("🎉签到成功!", ToastType.success, 5000);
                GM_setValue(ELIAUK_SIGN_TIME, new Date().toDateString());
            } else if (code === 1011040) {
                log(message);
                GM_setValue(ELIAUK_SIGN_TIME, new Date().toDateString());
            } else {
                toast(message, ToastType.error, 2000);
            }
        }

        const time = GM_getValue(ELIAUK_SIGN_TIME);
        if (!time || !same_day(time)) {
            sign().then();
        } else {
            log("🎉已经签到过了~");
        }
    }
    safeFunction(main, (e) => {
        log(e);
    })
})();