// ==UserScript== // @name 4khd 广告屏蔽 // @namespace https://viayoo.com // @version 0.42 // @description 移除4khd广告。 // @author Via // @license MIT // @match *://*.4khd.com/* // @match *://*.xxtt.ink/* // @match *://*.uuss.uk/* // @run-at document-start // @grant none // ==/UserScript== (function() { 'use strict'; const AD_SELECTORS = '.exo_wrapper,.popup,.centbtd,.exo-native-widget,.exo-native-widget-outer-container,ins[data-processed="true"]'; const BLOCK_URL_PATTERNS = [/(magsrv|pemsrv)\.com/i, /\.js$/i]; const BLOCK_CONTENT_PATTERNS = [/(magsrv|pemsrv)\.com/i, /ad-provider\.js/i]; window.fetch = function(...args) { let url = ''; if (typeof args[0] === 'string') { url = args[0]; } else if (args[0] instanceof Request) { url = args[0].url; } return BLOCK_URL_PATTERNS.some(p => p.test(url)) ? Promise.resolve(new Response('', { status: 200 })) : window.originalFetch.apply(this, args); }; window.originalFetch = window.fetch; const origOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { if (typeof url === 'string' && BLOCK_URL_PATTERNS.some(p => p.test(url))) return; return origOpen.apply(this, arguments); }; const origOpenWin = window.open; window.open = function(...args) { const url = args[0] || ''; return /magsrv|ads|pop/i.test(url) ? null : origOpenWin.apply(this, args); }; const blockScript = node => { if (node.tagName !== 'SCRIPT') return; const src = node.src || ''; const txt = node.textContent || ''; if (BLOCK_CONTENT_PATTERNS.some(re => re.test(src) || re.test(txt))) node.remove(); }; const removeAds = () => { document.querySelectorAll(AD_SELECTORS).forEach(el => el.remove()); }; const debouncedRemoveAds = (() => { let timer; return () => { clearTimeout(timer); timer = setTimeout(removeAds, 100); }; })(); new MutationObserver(muts => { for (const m of muts) { for (const n of m.addedNodes) { if (n.nodeType !== 1) continue; blockScript(n); const scripts = n.querySelectorAll ? n.querySelectorAll('script') : []; scripts.forEach(blockScript); debouncedRemoveAds(); } } }).observe(document, { childList: true, subtree: true }); const init = () => { removeAds(); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();