// ==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 // @downloadURL none // ==/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; }; })();