// ==UserScript== // @name 智能全站广告拦截器 (安全兼容版) // @version 2.0 // @description 精准广告拦截,保护搜索引擎核心元素,支持现代Web框架 // @author little fool // @match *://*/* // @grant unsafeWindow // @run-at document-start // @namespace https://yournamespace.com // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 安全配置中心 const SecurityConfig = { // 关键域名白名单 protectedDomains: { 'baidu.com': { selectors: [ '#kw', '#form', '.s_ipt', '.s_btn', '.bdsug', '.s_form_wrapper', '.bdlayer', '[name="wd"]' ], containers: ['#form', '.s_form_wrapper'] }, 'google.com': { selectors: [ 'input[name="q"]', '.gLFyf', '[aria-label="搜索"]', '.UUbT9' // 搜索建议框 ], containers: ['#searchform'] } }, // 通用广告特征 adPatterns: { selectors: [ // 通用广告选择器 (带精确排除) 'div[data-ad]:not([data-adtype="content"])', 'iframe[src*="/ad/"]:not([src*="/adapter/"])', '[class*="ad-"]:not(.admin):not(.adaptive)', '[id^="ad-"]:not([id^="admin-"])', // YouTube专用 'ytd-display-ad-renderer', '#player-ads', '.ytp-ad-module', 'ytd-promoted-sparkles-web-renderer' ], urlPatterns: [ /\/ad[s]?\//i, /doubleclick\.net/i, /adservice\.google/i, /adsystem\.com/i, /adserver\.+/i ] } }; // 智能防护系统 class AdBlocker { constructor() { this.currentDomain = window.location.hostname; this.protectedRules = this.getDomainProtection(); this.scanThrottle = this.createThrottle(500); this.init(); } // 初始化核心模块 init() { this.setupNetworkInterceptor(); this.setupDOMObserver(); this.setupSPAWatch(); this.safeScan(); this.antiDetection(); } // 获取当前域名保护规则 getDomainProtection() { for (const domain in SecurityConfig.protectedDomains) { if (this.currentDomain.includes(domain)) { return SecurityConfig.protectedDomains[domain]; } } return null; } // 创建节流函数 createThrottle(delay) { let lastExec = 0; return (fn) => { const now = Date.now(); if (now - lastExec >= delay) { fn(); lastExec = now; } }; } // DOM安全扫描 safeScan(root = document) { try { // 步骤1:扫描可见广告 this.scanElements(root); // 步骤2:处理Shadow DOM this.scanShadowDOM(root); // 步骤3:处理iframe内容 this.scanIframes(root); // 步骤4:特殊域名保护 if (this.protectedRules) { this.protectElements(root); } } catch (e) { console.warn('[AdBlocker] 扫描异常:', e); } } // 元素扫描核心 scanElements(root) { const adSelectors = SecurityConfig.adPatterns.selectors.join(', '); root.querySelectorAll(adSelectors).forEach(el => { if (!this.isProtected(el)) { this.removeElement(el); } }); } // Shadow DOM处理 scanShadowDOM(root) { const scanNode = (node) => { if (node.shadowRoot) { this.safeScan(node.shadowRoot); node.shadowRoot.querySelectorAll('*').forEach(scanNode); } }; root.querySelectorAll('*').forEach(scanNode); } // iframe处理 scanIframes(root) { root.querySelectorAll('iframe').forEach(frame => { try { const frameDoc = frame.contentDocument || frame.contentWindow?.document; if (frameDoc) this.safeScan(frameDoc); } catch (e) { // 跨域安全限制 } }); } // 保护关键元素 protectElements(root) { this.protectedRules.selectors.forEach(selector => { root.querySelectorAll(selector).forEach(el => { el.style.cssText += 'important;'; }); }); } // 元素移除安全验证 removeElement(el) { try { if (el && el.parentNode && !this.isProtected(el)) { el.parentNode.removeChild(el); } } catch (e) { console.warn('[AdBlocker] 元素移除失败:', e); } } // 保护元素检测 isProtected(el) { if (!this.protectedRules) return false; return ( this.protectedRules.selectors.some(s => el.matches(s)) || this.protectedRules.containers.some(c => el.closest(c)) ); } // 网络请求拦截 setupNetworkInterceptor() { // Fetch拦截 const originalFetch = window.fetch; window.fetch = async (input, init) => { const url = typeof input === 'string' ? input : input.url; if (this.isAdRequest(url)) { console.log('[AdBlocker] 拦截请求:', url); return new Response(null, { status: 403 }); } return originalFetch(input, init); }; // XHR拦截 const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { this._url = url; return originalOpen.apply(this, arguments); }; XMLHttpRequest.prototype.send = function(...args) { if (this._url && this.isAdRequest(this._url)) { console.log('[AdBlocker] 拦截XHR:', this._url); this.abort(); return; } return XMLHttpRequest.prototype.send.apply(this, args); }; } // 广告请求检测 isAdRequest(url) { return SecurityConfig.adPatterns.urlPatterns.some(p => p.test(url)); } // DOM动态监控 setupDOMObserver() { new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.nodeType === 1) this.scanThrottle(() => this.safeScan(node)); }); }); this.scanThrottle(() => this.safeScan()); }).observe(document, { childList: true, subtree: true, attributes: false }); } // SPA路由监控 setupSPAWatch() { let lastURL = location.href; new MutationObserver(() => { if (location.href !== lastURL) { lastURL = location.href; setTimeout(() => this.safeScan(), 800); } }).observe(document, { subtree: true, childList: true }); } // 反检测机制 antiDetection() { Object.defineProperties(window, { fetch: { configurable: false, writable: false }, XMLHttpRequest: { configurable: false } }); } } // 启动广告拦截 new AdBlocker(); })();