// ==UserScript==
// @name         2ch Автоскрытие постов без стикеров
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Фильтрует посты, оставляя только посты со стикерами
// @match        *://2ch.hk/gacha/*
// @match        *://2ch.su/gacha/*
// @match        *://2ch.life/gacha/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Проверяем, является ли текущий URL исключением
    const currentUrl = window.location.href;
    const excludedThreads = [
        ""
        // Можно добавить другие URL для исключения
    ];

    // Если текущий URL в списке исключений, прекращаем выполнение скрипта
    if (excludedThreads.some(url => currentUrl.includes(url))) {
        console.log("Тред в списке исключений, фильтрация отключена.");
        return;
    }

    // Функция для проверки, содержит ли пост 4+ цифры в номере
    function isOldPost(post) {
        const numberElement = post.querySelector('.post__number');
        return numberElement && /\d{4,}/.test(numberElement.textContent);
    }

    // Проверка на стикеры
    function hasSticker(post) {
        return post.querySelector('.post__image-link img[data-title="Стикер"]');
    }

    // Список фраз для фильтрации (регулярное выражение)
    const bannedPhrases = [
        /слово1/i, /слово2/i,  /слово-n/i,
    ];

    // Основная функция фильтрации
    function filterPosts() {
        const posts = document.querySelectorAll('div.post_type_reply');
        posts.forEach(post => {
            if (isOldPost(post)) return; // Пропускаем старые посты

            // Проверяем стикеры для разных доменов
            const host = window.location.host;
            const hasValidSticker = (
                (host === '2ch.hk' && hasSticker(post)) ||
                ((host === '2ch.su' || host === '2ch.life') && hasSticker(post))
            );

            // Проверяем текст поста на запрещенные фразы
            const message = post.querySelector('article.post__message');
            let hasBannedPhrase = false;
            if (message) {
                const text = message.textContent;
                hasBannedPhrase = bannedPhrases.some(regex => regex.test(text));
            }

            // ЛОГИКА ИЗМЕНЕНА:
            // Скрываем пост только если НЕТ стикера ИЛИ есть запрещенная фраза
            if (!hasValidSticker || hasBannedPhrase) {
                post.style.display = 'none';
            } else {
                post.style.display = ''; // Показываем посты со стикерами и без запрещенных фраз
            }
        });
    }

    // Оптимизация: MutationObserver с debounce, чтобы избежать лагов
    let observer;
    let timeoutId;

    function startObserver() {
        observer = new MutationObserver(() => {
            // Задержка перед повторной фильтрацией (debounce)
            clearTimeout(timeoutId);
            timeoutId = setTimeout(filterPosts, 300);
        });

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

    // Запускаем фильтрацию при загрузке и наблюдаем за изменениями
    if (document.readyState === 'complete') {
        filterPosts();
        startObserver();
    } else {
        window.addEventListener('load', () => {
            filterPosts();
            startObserver();
        });
    }
})();
Edit
Pub: 28 Nov 2025 19:28 UTC
Update: 28 Nov 2025 19:32 UTC
views: 55

New· How· IP.im· T.im· W.is· Base64.is· Favicon.is· PDF.is· Date.is· TrueURL.com· Portcheck.ing· TLDhub.com· Contact· Issue

text.is - Markdown Pastebin.