⎗✓1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102// ==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(); }); } })();