去除ChatGPT Articles

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

目前为 2025-04-09 提交的版本。查看 最新版本

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

(function() {
    'use strict';

    // 定义网址黑名单
    const blacklist = [
        'https://chatgpt.com',// 这里可以添加更多网址
        'https://www.sinbyte.com.cn'
    ];

    // 获取当前页面的完整 URL
    const currentUrl = window.location.href;

    // 检查当前 URL 是否在黑名单中
    const isInBlacklist = blacklist.some(blacklistedUrl => currentUrl.startsWith(blacklistedUrl));

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

    console.log('当前网址在黑名单中,脚本开始执行...');

    // 定义删除多余文章的函数
    function removeExcessArticles() {
        // 精确匹配具有指定 class 和 data-testid 前缀的 <article> 元素
        const articles = document.querySelectorAll('article.w-full.text-token-text-primary.focus-visible\\:outline-2.focus-visible\\:outline-offset-\\[-4px\\][data-testid^="conversation-turn-"]');

        // 检查文章数量是否大于22
        if (articles.length > 30) {
            console.log(`共找到 ${articles.length} 个 <article> 元素,开始删除操作...`);

            // 保留前2个和最后8个,其他删除
            const toRemove = Array.from(articles).slice(2, -30);
            toRemove.forEach(article => {
                article.remove();
                // console.log('已删除 <article class="w-full text-token-text-primary ...">');
            });
        } else {
            //console.log('文章数量少于30..无需删除。');
        }
    }

    // 页面加载后立即执行一次清理操作
    window.addEventListener('load', removeExcessArticles);

    // 每分钟定时执行一次清理操作
    setInterval(removeExcessArticles, 5000); // 每5秒触发一次

    // 监听特定 DOM 元素的变化,以捕捉对话切换或新对话的加载
    const targetNode = document.querySelector('main .react-scroll-to-bottom--css-sznur-1n7m0yu');
    if (targetNode) {
        const observer = new MutationObserver(removeExcessArticles);
        observer.observe(targetNode, { childList: true, subtree: true });
    } else {
        console.warn('未找到指定的 DOM 元素,MutationObserver 未启动');
    }
})();