B站评论区过滤(诛九族版)

隐藏包含“@”且字符数少于100的B站评论

// ==UserScript==
// @name         B站评论区过滤(诛九族版)
// @namespace    dreamcenter
// @version      1.0.0
// @description  隐藏包含“@”且字符数少于100的B站评论
// @match        *://*.bilibili.com/video/*
// @match        *://*.bilibili.com/opus/*
// @match        *://space.bilibili.com/*/dynamic
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // 判断条件:包含 @ 且纯文本长度小于 100
    function judgeIfFiltered(raw) {
        const text = raw.replace(/<[^>]+>/g, ""); // 去除HTML标签
        return text.includes("@") && text.length < 100;
    }

    window.onload = function () {
        let startMark = false;

        setInterval(function () {
            if (startMark) {
                runCore();
            } else {
                startMark = document.querySelector("bili-comments") != null;
            }
        }, 100);
    };

    function runCore() {
        const root = document.querySelector("bili-comments")?.shadowRoot;
        if (!root) return;

        let deletedMainCount = 0;
        let deletedReplyCount = 0;

        const reviews = root.querySelectorAll("#feed > bili-comment-thread-renderer");
        for (let review of reviews) {
            if (review.getAttribute('filtered') == null) {
                try {
                    const comment = review.shadowRoot.querySelector('#comment');
                    const commentText = comment.shadowRoot
                        .querySelector("#content > bili-rich-text").shadowRoot
                        .querySelector("#contents").innerHTML;

                    review.setAttribute('filtered', true);
                    if (judgeIfFiltered(commentText)) {
                        review.style.display = "none";
                        deletedMainCount++;
                    }
                } catch (e) {
                    // 跳过未加载的项
                }
            }

            // 子评论过滤
            try {
                const replies = review.shadowRoot
                    .querySelector("#replies > bili-comment-replies-renderer")
                    ?.shadowRoot.querySelectorAll("#expander-contents > bili-comment-reply-renderer:not([filtered])");

                if (!replies) continue;

                for (let reply of replies) {
                    try {
                        const replyText = reply.shadowRoot
                            .querySelector("#main > bili-rich-text").shadowRoot
                            .querySelector("#contents").innerHTML;

                        reply.setAttribute('filtered', true);
                        if (judgeIfFiltered(replyText)) {
                            reply.style.display = "none";
                            deletedReplyCount++;
                        }
                    } catch (e) { }
                }
            } catch (e) { }
        }

        // 控制台输出本轮删除结果
        if (deletedMainCount > 0 || deletedReplyCount > 0) {
            console.log(`[bili过滤器] 删除主评论 ${deletedMainCount} 条,子评论 ${deletedReplyCount} 条`);
        }
    }
})();