Sleazy Fork is available in English.

Hide Duplicate Posts and Ads on Twitter 1.2

This script optimizes your feed on the X platform by hiding promoted posts, verified tweets, and duplicates to create a clean and relevant feed.

// ==UserScript==
// @name         Hide Duplicate Posts and Ads on Twitter 1.2
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  This script optimizes your feed on the X platform by hiding promoted posts, verified tweets, and duplicates to create a clean and relevant feed.
// @author       Gullampis810
// @match        https://x.com/*
// @icon         https://img.icons8.com/?size=100&id=2pPtAXbhG5D2&format=png&color=000000
// @grant        none
// @license      MIT
// ==/UserScript==



(function () {
    'use strict';

    const seenTweets = new Set();

    function isVerifiedAccount(tweet) {
        return !!tweet.querySelector('svg[aria-label="Verified account"], svg[aria-label="Подлинная учетная запись"]');
    }

    function isPromotedTweet(tweet) {
        return tweet.innerText.includes("Реклама") || tweet.innerText.includes("Promoted");
    }

    function containsUkraineFlag(tweet) {
        return !!tweet.querySelector('img[alt="🇺🇦"]');
    }

    function processTweets() {
        const tweets = document.querySelectorAll('article:not([data-processed])'); // Только не обработанные

        tweets.forEach(tweet => {
            // Устанавливаем флаг "обработано"
            tweet.setAttribute('data-processed', 'true');

            const tweetTextElement = tweet.querySelector('div[lang]');
            const tweetText = tweetTextElement ? tweetTextElement.innerText.trim() : '[No text]';
            const tweetLinkElement = tweet.querySelector('a[role="link"]');
            const tweetLink = tweetLinkElement ? tweetLinkElement.href : '[No link]';
            const uniqueId = `${tweetText}_${tweetLink}`;

            if (isPromotedTweet(tweet)) {
                console.log('[DEBUG] Promoted Tweet:', tweetText);
                tweet.style.display = 'none'; // Скрыть рекламу
                return;
            }

            if (isVerifiedAccount(tweet)) {
                console.log('[DEBUG] Verified Account Tweet:', tweetText);
                tweet.style.display = 'none'; // Скрыть верифицированные твиты
                return;
            }

            if (containsUkraineFlag(tweet)) {
                console.log('[DEBUG] Tweet with Ukraine Flag:', tweetText);
                tweet.style.display = 'none'; // Скрыть твиты с флагом Украины
                return;
            }

            if (seenTweets.has(uniqueId)) {
                console.log('[DEBUG] Duplicate Tweet:', tweetText);
                tweet.style.display = 'none'; // Скрыть дубликаты
            } else {
                seenTweets.add(uniqueId);
                console.log('[DEBUG] Unique Tweet:', tweetText);
            }
        });
    }

    const observer = new MutationObserver(() => {
        processTweets();
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true,
    });

    console.log('Optimized Twitter Filter active');

    const hideTweets = () => {
        const tweets = document.querySelectorAll('article');

        tweets.forEach(tweet => {
            const userVerified = tweet.querySelector('.r-18u37iz.r-1wbh5a2') || tweet.querySelector('.r-1e6y48k');
            const promotedTweet = tweet.querySelector('.r-1wbh5a2'); // Пример для рекламных твитов
            const userHandle = tweet.querySelector('div[role="link"] span');
            const tweetText = tweet.querySelector('div[lang]');

            if (userHandle && tweetText) {
                const userName = userHandle.textContent;
                const tweetContent = tweetText.textContent;

                if (
                    (userVerified && !tweet.classList.contains('hidden')) ||
                    promotedTweet ||
                    /duplicate pattern/i.test(tweetContent) ||
                    containsUkraineFlag(tweet)
                ) {
                    tweet.remove(); // Полностью удаляем твит
                }
            }
        });
    };
})();