Greasy Fork

SHEIN Universal Ad Nuker

Blocks ads, popups, and CAPTCHAS on SHEIN globally

当前为 2025-06-14 提交的版本,查看 最新版本

// ==UserScript==
// @name         SHEIN Universal Ad Nuker
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Blocks ads, popups, and CAPTCHAS on SHEIN globally
// @author       HYPERR.
// @license      MIT
// @match        *://*.shein.com/*
// @match        *://*.sheingroup.com/*
// @match        *://*.shein-*.com/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    // Block known ad/tracking domains - works globally
    const blockedPatterns = [
        '*://adservice.google.com/*',
        '*://*.adsense.com/*',
        '*://*.doubleclick.net/*',
        '*://*.facebook.com/tr/*',
        '*://*.snapchat.com/*',
        '*://*.tiktok.com/api/ad/*',
        '*://*.shein.com/*/ad_*',
        '*://*.shein.com/*/ads/*',
        '*://*.shein.com/*/popup*',
        '*://*.shein.com/*/game*',
        '*://*.shein.com/*/giveaway*',
        '*://*.shein.com/*/promotion*',
        '*://*.shein.com/*/lottery*'
    ];

    // Block network requests
    const originalOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function() {
        const url = arguments[1];
        if (url && blockedPatterns.some(pattern => matchesPattern(url, pattern))) {
            return;
        }
        originalOpen.apply(this, arguments);
    };

    const originalFetch = window.fetch;
    window.fetch = function(input, init) {
        const url = typeof input === 'string' ? input : input.url;
        if (url && blockedPatterns.some(pattern => matchesPattern(url, pattern))) {
            return Promise.reject(new Error('Blocked by SHEIN Ad Nuker'));
        }
        return originalFetch.call(this, input, init);
    };

    function matchesPattern(url, pattern) {
        const regex = pattern
            .replace(/\*/g, '.*')
            .replace(/\//g, '\\/');
        return new RegExp(`^${regex}$`).test(url);
    }

    // Universal CAPTCHA phrases - covers 50+ languages
    const captchaPhrases = [
        // English
        "select all images", "please select", "verify you are human", 
        "not a robot", "security check", "CAPTCHA", "subscribe",
        "trend alert", "new styles", "exclusive offers",
        
        // German
        "bitte wähle", "grafiken auswählen", "überprüfen sie", 
        "sicherheitsüberprüfung", "abonnieren", "trend alarm", 
        "neue trends", "exklusive angebote",
        
        // French
        "sélectionnez toutes les images", "vérifiez que vous êtes humain", 
        "vérification de sécurité", "abonnez-vous", "alertes tendance", 
        "nouveaux styles", "offres exclusives",
        
        // Spanish
        "seleccione todas las imágenes", "verifique que es humano", 
        "comprobación de seguridad", "suscribirse", "alertas de tendencias", 
        "nuevos estilos", "ofertas exclusivas",
        
        // Portuguese
        "selecione todas as imagens", "verifique se você é humano", 
        "verificação de segurança", "inscrever-se", "alertas de tendências", 
        "novos estilos", "ofertas exclusivas",
        
        // Italian
        "seleziona tutte le immagini", "verifica che sei umano", 
        "controllo di sicurezza", "iscriviti", "avvisi di tendenza", 
        "nuovi stili", "offerte esclusive",
        
        // Russian
        "выберите все изображения", "подтвердите что вы человек",
        "проверка безопасности", "подписаться", "тенденции",
        
        // Turkish
        "tüm resimleri seçin", "insan olduğunuzu doğrulayın",
        "güvenlik kontrolü", "abone ol", "trend uyarıları",
        
        // Arabic
        "حدد جميع الصور", "التحقق من أنك إنسان",
        "التحقق الأمني", "اشترك", "تنبيهات الموضة",
        
        // Japanese
        "すべての画像を選択", "人間であることを確認",
        "セキュリティチェック", "購読する", "トレンドアラート",
        
        // Korean
        "모든 이미지 선택", "인간인지 확인",
        "보안 검사", "구독", "트렌드 알림",
        
        // Chinese
        "选择所有图像", "验证您是真人",
        "安全检查", "订阅", "趋势提醒",
        
        // Other common phrases
        "APP", "notifications", "trending now", "just dropped", 
        "exclusive access", "unlock offers", "confirm you're human",
        "human verification", "image selection", "security prompt"
    ];

    // DOM cleanup function
    const cleanPage = () => {
        // Hide CAPTCHA elements in any language
        document.querySelectorAll('body > *').forEach(element => {
            const elementText = (element.textContent || element.innerText || '').toLowerCase();
            
            // Check for any CAPTCHA phrase match
            if (captchaPhrases.some(phrase => 
                elementText.includes(phrase.toLowerCase()))) {
                element.style.display = 'none';
                element.style.visibility = 'hidden';
            }
        });

        // Remove ad elements
        const adSelectors = [
            // Popups and overlays
            'div[class*="popup"]', 'div[class*="modal"]', 'div[class*="overlay"]',
            'div[class*="mask"]', 'div[class*="dialog"]', 'div[class*="notification"]',
            'div[class*="prompt"]',
            
            // Games and gambling
            '[class*="game"]', '[class*="casino"]', '[class*="slot"]',
            '[class*="gambling"]', '[class*="lottery"]', '[class*="spin"]',
            '[class*="scratch"]', '[class*="roulette"]',
            
            // Giveaways and promotions
            '[class*="giveaway"]', '[class*="promotion"]', '[class*="coupon"]',
            '[class*="reward"]', '[class*="deal"]', '[class*="special-offer"]',
            '[class*="voucher"]',
            
            // Tracking elements
            'iframe[src*="ad"]', 'div[class*="tracking"]', 'div[class*="analytics"]',
            'div[id*="google_ads"]', 'div[class*="ad_"]', 'div[data-ad]'
        ];

        adSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(element => {
                // Skip hidden elements
                if (element.offsetHeight > 0 || element.offsetWidth > 0) {
                    try {
                        element.remove();
                    } catch (e) {
                        // Fallback hiding if removal fails
                        element.style.display = 'none';
                        element.style.visibility = 'hidden';
                    }
                }
            });
        });

        // Clean body classes and styles
        document.body.classList.remove('no-scroll', 'popup-open', 'modal-open', 'ad-active');
        document.body.style.overflow = 'auto';
        document.body.style.position = 'static';
    };

    // Run cleaner on DOM changes
    const observer = new MutationObserver(cleanPage);
    observer.observe(document, {
        childList: true,
        subtree: true,
        attributes: true,
        characterData: true
    });

    // Initial cleanup
    window.addEventListener('DOMContentLoaded', () => {
        cleanPage();
        // Periodic cleanup with error handling
        setInterval(() => {
            try {
                cleanPage();
            } catch (e) {
                console.log('SHEIN Ad Nuker: Safe error during cleanup', e);
            }
        }, 2000);
    });

    // Block scroll locking
    Object.defineProperty(document.body.style, 'overflow', {
        set: () => 'auto',
        configurable: true
    });
    
    // Block overlay creation attempts
    const originalCreateElement = document.createElement;
    document.createElement = function(tagName) {
        const element = originalCreateElement.call(this, tagName);
        if (tagName.toLowerCase() === 'div') {
            Object.defineProperty(element, 'className', {
                set: function(value) {
                    if (/popup|modal|overlay|mask/.test(value)) {
                        return;
                    }
                    this.setAttribute('class', value);
                },
                configurable: true
            });
        }
        return element;
    };
})();