【中羽在线】新闻过滤与自动展开

多合一功能脚本:1. 过滤低评论新闻 2. 过滤疑似广告 3. 智能后台加载(5次/轮) 4. 新标签页打开新闻详情。5. 光标悬停新闻卡片显示手型

// ==UserScript==
// @name         【中羽在线】新闻过滤与自动展开
// @namespace   https://github.com/realSilasYang
// @version         2025-9-13
// @description    多合一功能脚本:1. 过滤低评论新闻 2. 过滤疑似广告 3. 智能后台加载(5次/轮)  4. 新标签页打开新闻详情。5. 光标悬停新闻卡片显示手型
// @author          阳熙来
// @match          https://www.badmintoncn.com/*
// @icon            data:image/png;base64,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
// @license      GNU GPLv3
// @grant        GM_openInTab
// @grant        GM_addStyle
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';

    // --------------------------------------------------------------------------------
    // 模块0: 添加自定义样式
    // 作用:让新闻列表和热点新闻在鼠标悬停时显示为可点击状态
    // --------------------------------------------------------------------------------
    GM_addStyle(`
        .news_list, .newst.hot {
            cursor: pointer;
        }
    `);

    // --------------------------------------------------------------------------------
    // 模块1: 新闻过滤 (评论数)
    // 作用:只保留评论数 >= 20 的新闻,低于此数的直接移除
    // --------------------------------------------------------------------------------
    function shouldKeep(box) {
        // 找到评论图标
        const pjImg = box.querySelector('img.news_pj');
        if (!pjImg) return false;

        // 评论数在图标的下一个文本节点
        const nextNode = pjImg.nextSibling;
        if (!nextNode || nextNode.nodeType !== 3 || !nextNode.nodeValue) return false;

        // 转换为数字
        const commentNum = parseInt(nextNode.nodeValue.trim(), 10);

        // 保留评论数 >= 20 的新闻
        return !isNaN(commentNum) && commentNum >= 20;
    }

    // 过滤单条新闻
    function filterSingle(box) {
        if (!shouldKeep(box)) {
            box.remove();
        }
    }

    // 过滤整个页面的新闻
    function filterAll(root = document) {
        root.querySelectorAll('.news_list').forEach(filterSingle);
    }

    // 监听 DOM 变化,动态过滤新加载的新闻
    const newsObserver = new MutationObserver(mutations => {
        for (const m of mutations) {
            for (const node of m.addedNodes) {
                if (node.nodeType !== 1) continue; // 只处理元素节点
                if (node.classList && node.classList.contains('news_list')) {
                    filterSingle(node);
                } else {
                    filterAll(node);
                }
            }
        }
    });

    // --------------------------------------------------------------------------------
    // 模块2: 过滤疑似广告内容
    // 作用:移除包含特定广告关键词的新闻
    // --------------------------------------------------------------------------------
    function filterExclamationNews() {
        const mainNewsContainer = document.querySelector('div.news.main');
        if (!mainNewsContainer) return;

        // 定义广告关键词(大小写不敏感)
        const adKeywords = [
            '!', '品牌', '胜利', 'VICTOR', 'YONEX', '尤尼克斯', '李宁', '薰风', '薰',
            'KUMPOOO', '川崎', 'Kawasaki', '得物', '波力', 'BONNY', '极光', '亚瑟士',
            'ASICS', '耐克', '欧击', '蟹羽', '球拍', '球鞋', '羽鞋', '球线', '新品',
            '产品', '上市', '发布', '评测', '测评', '赏析', '试打', '试穿', '上手',
            '限量', '抢先', '纪念', '隆重', '报名', '签约', '代言'
        ];

        // 转换为正则(忽略大小写)
        const adRegex = new RegExp(adKeywords.join('|'), 'i');

        // 遍历新闻列表
        const listItems = mainNewsContainer.querySelectorAll('li');
        listItems.forEach(li => {
            if (li.textContent && adRegex.test(li.textContent)) {
                li.remove(); // 删除匹配的新闻
            }
        });
    }

    // --------------------------------------------------------------------------------
    // 模块3: 混合模式自动点击展开
    // 作用:自动点击“加载更多”按钮,最多点击5次
    // --------------------------------------------------------------------------------
    let isInitialLoad = true;

    // 延迟函数
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    // 批量点击“加载更多”
    async function performClickBatch() {
        console.log('开始新一轮自动加载(最多5次)...');
        const CLICK_LIMIT = 5;
        const CLICK_DELAY = 500; // 每次点击间隔 0.5 秒

        for (let i = 0; i < CLICK_LIMIT; i++) {
            const currentButton = document.getElementById('loadingButton');
            if (currentButton && currentButton.offsetParent !== null) {
                currentButton.click();
                console.log(`后台自动点击第 ${i + 1} 次。`);
                await sleep(CLICK_DELAY);
            } else {
                console.log('“加载更多”按钮消失,提前结束本轮。');
                break;
            }
        }
        console.log('本轮点击完成。');
    }

    // 监听“加载更多”按钮是否进入视口
    const buttonObserver = new IntersectionObserver(async (entries) => {
        const buttonEntry = entries[0];
        if (!isInitialLoad && buttonEntry.isIntersecting) {
            console.log('检测到您已滚动到底部,再次启动自动加载...');
            const button = buttonEntry.target;
            buttonObserver.unobserve(button);
            await performClickBatch();

            const buttonAfterClick = document.getElementById('loadingButton');
            if (buttonAfterClick) {
                 console.log('加载完成,进入“待命”状态,等待您下一次滚动...');
                 buttonObserver.observe(buttonAfterClick);
            } else {
                 console.log('所有内容已加载完毕。');
            }
        }
    }, { threshold: 0.1 });

    // --------------------------------------------------------------------------------
    // 模块4: 点击新闻区域打开新标签页
    // 作用:点击新闻列表项时,在新标签页打开新闻详情
    // --------------------------------------------------------------------------------
    function handleNewsClick(event) {
        const newsList = event.target.closest('.news_list');
        if (!newsList) return;

        // 如果点击的是标签(如分类标签),则不触发
        if (event.target.closest('.gray_label')) return;

        // 获取新闻 ID
        const newsIdElement = newsList.querySelector('.newst');
        if (!newsIdElement) return;

        const newsId = newsIdElement.getAttribute('title');
        if (newsId) {
            event.preventDefault();
            event.stopPropagation();
            const url = `https://www.badmintoncn.com/newsm.php?a=view&id=${newsId}&mag_hide_progress=1`;
            console.log(`打开新标签页: ${url}`);
            GM_openInTab(url, { active: true });
        }
    }

    // --------------------------------------------------------------------------------
    // 模块5: 脚本初始化
    // --------------------------------------------------------------------------------
    document.addEventListener('DOMContentLoaded', async () => {
        // 1. 启动两种新闻过滤
        filterAll(); // 过滤低评论新闻
        filterExclamationNews(); // 过滤疑似广告新闻
        newsObserver.observe(document.documentElement, { childList: true, subtree: true });

        // 2. 启动点击打开新标签页功能
        document.body.addEventListener('click', handleNewsClick, true);

        // 3. 启动混合模式加载
        let loadButton = document.getElementById('loadingButton');
        while (!loadButton) {
            await sleep(500);
            loadButton = document.getElementById('loadingButton');
        }

        if (isInitialLoad) {
            await performClickBatch();
            isInitialLoad = false;
        }

        const buttonToObserve = document.getElementById('loadingButton');
        if (buttonToObserve) {
             console.log('首次加载完成,进入“待命”状态,等待您滚动到底部...');
             buttonObserver.observe(buttonToObserve);
        }
    });
})();