去除ChatGPT Articles Adjusted

删除页面上多余的 <article> 标签,只保留前2个和最后8个元素

// ==UserScript==
// @name         去除ChatGPT Articles Adjusted
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  删除页面上多余的 <article> 标签,只保留前2个和最后8个元素
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 配置参数
    const KEEP_FRONT = 2;// 保留前2个元素
    const KEEP_END = 8; // 保留后8个元素
    const CHECK_INTERVAL_MS = 60000; // 每60秒执行一次检测

    // 定义黑名单域名(仅在这些域名下执行脚本)
    const blacklistDomains = ['chatgpt.com', 'www.sinbyte.com.cn'];
    const currentHostname = window.location.hostname;
    const isInBlacklist = blacklistDomains.some(domain => currentHostname.includes(domain));

    if (!isInBlacklist) {
        console.log('当前网址不在黑名单中,脚本已跳过。');
        return;
    }
    console.log('当前网址在黑名单中,脚本开始执行...');

    // 删除多余文章的函数
    function removeExcessArticles() {
        // 使用更宽松的选择器,匹配所有 data-testid 属性以 "conversation-turn-" 开头的 <article> 元素
        const selector = 'article[data-testid^="conversation-turn-"]';
        const articles = document.querySelectorAll(selector);
        console.log(`匹配到 ${articles.length} 个 <article> 元素.`);

        if (articles.length > (KEEP_FRONT + KEEP_END)) {
            console.log(`开始删除中间多余文章,仅保留前 ${KEEP_FRONT} 个和最后 ${KEEP_END} 个`);
            const articlesArray = Array.from(articles);
            const toRemove = articlesArray.slice(KEEP_FRONT, articlesArray.length - KEEP_END);
            toRemove.forEach(article => article.remove());
        } else {
            console.log('文章数量不足,无需删除。');
        }
    }

    // 页面加载完成后延时1秒执行清理操作(确保页面动态内容加载完毕)
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
            setTimeout(removeExcessArticles, 1000);
        });
    } else {
        setTimeout(removeExcessArticles, 1000);
    }

    // 定时触发清理操作
    setInterval(removeExcessArticles, CHECK_INTERVAL_MS);

    // 监听 DOM 变化,若指定区域未找到则降级为监听整个 document.body
    let observerTarget = document.querySelector('main .react-scroll-to-bottom--css-sznur-1n7m0yu');
    if (!observerTarget) {
        observerTarget = document.body;
        console.log('未找到特定的 MutationObserver 目标元素,改为监听 document.body');
    }

    let debounceTimer = null;
    const observer = new MutationObserver(() => {
        if (debounceTimer) clearTimeout(debounceTimer);
        debounceTimer = setTimeout(() => {
            removeExcessArticles();
        }, 200);
    });
    observer.observe(observerTarget, { childList: true, subtree: true });
    console.log('MutationObserver 已启动');
})();