// ==UserScript== // @name 硬核YouTube广告拦截器Pro // @version 3.2.0 // @icon https://www.youtube.com/favicon.ico // @author little fool // @match *://*.youtube.com/* // @grant none // @run-at document-start // @namespace https://direct.blocker // @description 无API依赖的极简高效广告拦截方案 // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 增强版广告特征库 const AD_SIGNATURES = { dom: [ 'ytd-ad-', 'ytm-ad-', '[id*="-ad-"]', '[class*="-ad-"]', '#player-ads', '.ytp-ad-', '[aria-label*="广告"i]', // 不区分大小写 'ytd-promoted-', 'ytd-companion-ad', 'div[data-ad-target]', 'ytd-rich-section-renderer' // 新版信息流广告 ], network: [ /\/ad(s|server|vert)/i, /(doubleclick|googleads|googlesyndication)\./i, /\/pagead\//i, /\/log_event\?.*\bad_/i, /\/get_(midroll|preroll)_/i, /\/ptracking\?/i, // 广告追踪参数 /\/get_video_ad/i ] }; // 高效DOM清理系统 const domHunter = { observer: null, scan() { // 初始化立即清理 this.clean(document.documentElement); // 智能扫描间隔(动态调整) let scanInterval = 3000; const scanner = setInterval(() => { this.clean(document.documentElement); scanInterval = Math.min(10000, scanInterval + 500); }, scanInterval); // 优化版MutationObserver this.observer = new MutationObserver(muts => { scanInterval = 1500; // 检测到变动时加快扫描 muts.forEach(mut => { [...mut.addedNodes].forEach(node => { if(node.nodeType === 1) this.clean(node); }); }); }); this.observer.observe(document, { childList: true, subtree: true, attributeFilter: ['id', 'class', 'style'] }); }, clean(root) { // 批量选择器查询 const selector = AD_SIGNATURES.dom.join(','); root.querySelectorAll(selector).forEach(ad => { // 彻底移除元素及关联数据 ad.remove(); this.cleanAdResidue(ad); }); this.fixLayout(); }, cleanAdResidue(ad) { // 处理广告占位元素 const parent = ad.parentElement; if(parent && parent.childElementCount === 0) { parent.remove(); } }, fixLayout() { // 视频播放器修复(节流版) const now = Date.now(); if(now - this.lastFix > 1000) { const player = document.querySelector('#movie_player, .html5-video-player'); if(player) { player.style.cssText = 'height:100vh !important; width:100% !important;'; } this.lastFix = now; } }, lastFix: 0 }; // 增强版网络拦截 const networkInterceptor = { init() { this.hijackFetch(); this.hijackXHR(); this.hijackWebSocket(); }, hijackFetch() { const nativeFetch = window.fetch; window.fetch = (input, init) => { const url = input.url || input.toString(); return this.isAdRequest(url) ? this.blockResponse() : nativeFetch(input, init); }; }, hijackXHR() { const nativeOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(_, url) { this._url = url; nativeOpen.apply(this, arguments); }; const nativeSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function() { this.isAdRequest() ? this.abort() : nativeSend.apply(this, arguments); }; XMLHttpRequest.prototype.isAdRequest = function() { return networkInterceptor.isAdRequest(this._url); }; }, hijackWebSocket() { const nativeWS = WebSocket; WebSocket = class extends nativeWS { constructor(url) { networkInterceptor.isAdRequest(url) ? super('ws://localhost') // 重定向到无效地址 : super(url); } }; }, isAdRequest(url) { return AD_SIGNATURES.network.some(regex => regex.test(url)); }, blockResponse() { return new Response(null, { status: 403, headers: { 'Blocked-By': 'AdBlockerPro' } }); } }; // 即时样式注入 const style = document.createElement('style'); style.textContent = ` ${AD_SIGNATURES.dom.join(',')} { display: none !important; height: 0 !important; opacity: 0 !important; pointer-events: none !important; margin: 0 !important; padding: 0 !important; } #movie_player, .html5-video-player { height: 100vh !important; width: 100% !important; } .ytp-ad-progress, .ytp-ad-skip-button { display: none !important; } ytd-rich-section-renderer { min-height: 0 !important; } `; document.head.appendChild(style); // 初始化 domHunter.scan(); networkInterceptor.init(); })();