Greasy Fork

Greasy Fork is available in English.

推特只看原创内容

在网页版推特中只查看原创内容

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         推特只看原创内容
// @namespace    https://github.com/ssoda01
// @version      1.2
// @description  在网页版推特中只查看原创内容
// @author       sodakoo
// @match        https://twitter.com/*
// @match        https://x.com/*
// @license      GPL-3.0-only
// @grant        none
// ==/UserScript==

(function () {
    'use strict';
    let stylePC = document.createElement('style');
    let styleMobile = document.createElement('style');
    let isMobile = false;
    if (window.screen.width <= 768) {
        isMobile = true
    }
    else {
        isMobile = false
    }
    stylePC.innerHTML = `
        .yellow-btn-common {
            position: fixed;
            top: 10px;
            right: 20px;
            z-index: 9999;
            border-radius: 20px;
            background: #fff;
            box-shadow: 5px 5px #eff3f4;
            width: 180px;
            padding: 0 8px;
            border: 2px solid;
            transition: .3s;
            cursor: pointer;
        }

        .yellow-btn-common:hover {
            background: rgba(0,0,0,0.45);
            color: #fff;
        }
        .yellow-btn-common:active {
            background: #000;
            color: #fff;
        }

        .yellow-btn-off {
            color: #c3c3c3;
            border-color: #c3c3c3;
        }
        .yellow-btn-on {
            color: #000;
            border-color: #000;
        }
    `;
    styleMobile.innerHTML = `
        .yellow-btn-common {
            opacity: .3;
            position: fixed;
            bottom: 42px;
            right: 16px;
            z-index: 9999;
            border-radius: 20px;
            background: #fff;
            box-shadow: 5px 5px #eff3f4;
            width: 48px;
            border: 2px solid;
            transition: .3s;
        }

        .yellow-btn-common:hover {
            background: rgba(0,0,0,0.45);
            color: #fff;
        }
        .yellow-btn-common:active {
            background: #000;
            color: #fff;
        }

        .yellow-btn-off {
            color: #c3c3c3;
            border-color: #c3c3c3;
        }
        .yellow-btn-on {
            color: #000;
            border-color: #000;
        }
    `;
    // 将样式节点添加到文档头部

    document.head.appendChild(isMobile ? styleMobile : stylePC);

    // 开关状态 0已关闭 1已开启
    let status = 0;
    let observer = undefined;
    let getBtnText = (status) => {
        if (status === 0) { return isMobile ? 'OFF' : '只看原创内容 OFF' }
        else { return isMobile ? 'ON' : '只看原创内容 ON' }
    }
    // 监听页面加载完成事件
    // 创建悬浮按钮
    let button = document.createElement('button');
    button.classList.add('yellow-btn-common');
    button.classList.add('yellow-btn-off');
    button.textContent = getBtnText(status);
    document.body.appendChild(button);

    // 隐藏非原创推文的函数
    function hideNonOriginalTweets() {
        // 获取所有 article[data-testid="tweet"] 元素
        let tweetElements = document.querySelectorAll('article[data-testid="tweet"]');

        // 遍历推文元素
        for (let i = 0; i < tweetElements.length; i++) {
            let tweetElement = tweetElements[i];

            // 检查是否存在后代子元素 <span data-testid="socialContext">
            let socialContextElement = tweetElement.querySelector('span[data-testid="socialContext"]');
            if (socialContextElement) {
                // 隐藏包含后代子元素的 article 元素
                tweetElement.style.display = 'none';
            }
        }
        // 创建一个 MutationObserver 实例
        observer = new MutationObserver(function (mutationsList) {
            for (let i = 0; i < mutationsList.length; i++) {
                let mutation = mutationsList[i];
                if (mutation.type === 'childList') {
                    // 检查是否还有需要删除的元素
                    console.log("检查是否还有需要删除的元素>>")
                    let remainingElements = document.querySelectorAll('article[data-testid="tweet"]');
                    for (let i = 0; i < remainingElements.length; i++) {
                        let remainingElement = remainingElements[i];
                        // 检查是否存在后代子元素 <span data-testid="socialContext">
                        let socialContextElement = remainingElement.querySelector('span[data-testid="socialContext"]');
                        if (socialContextElement) {
                            // 隐藏包含后代子元素的 article 元素
                            remainingElement.style.display = 'none';
                        }
                    }
                    // if (remainingElements.length === 0) {
                    //     // 停止观察
                    //     observer.disconnect();
                    // }
                }
            }
        });

        // 开始观察 document.body 的子节点变化
        observer.observe(document.body, { childList: true, subtree: true });
    }

    // 按钮点击事件处理程序
    button.addEventListener('click', function () {
        status = status === 0 ? 1 : 0
        button.textContent = getBtnText(status);
        if (status === 0) {
            button.classList.remove('yellow-btn-on');
            button.classList.add('yellow-btn-off');
            if (observer) {
                observer.disconnect();
            }
        } else {
            button.classList.remove('yellow-btn-off');
            button.classList.add('yellow-btn-on');
            hideNonOriginalTweets();
        }

    });
})();