AD block(Weiren)

拋棄雜七雜八的廣吿攔截器,試試這款輕量級 屏蔽廣告、彈窗、追蹤器

目前為 2025-01-03 提交的版本,檢視 最新版本

// ==UserScript==
// @name         AD block(Weiren)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  拋棄雜七雜八的廣吿攔截器,試試這款輕量級 屏蔽廣告、彈窗、追蹤器
// @author       Weiren
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 常見的廣告選擇器
    const adSelectors = [
        'iframe[src*="ads"]',
        '[id^="ad"]',
        '[class^="ad"]',
        '[id*="advert"]',
        '[class*="advert"]',
        '[id*="sponsor"]',
        '[class*="sponsor"]',
        '[id*="banner"]',
        '[class*="banner"]',
        '[id*="popup"]',
        '[class*="popup"]',
        '[id*="promo"]',
        '[class*="promo"]',
        '[id*="commercial"]',
        '[class*="commercial"]',
        '[id*="tracker"]',
        '[class*="tracker"]',
        '[id*="tracking"]',
        '[class*="tracking"]',
        'script[src*="analytics"]',
        'script[src*="track"]',
        'script[src*="pixel"]'
    ];

    // 屏蔽廣告和追蹤器
    function removeAdsAndTrackers() {
        adSelectors.forEach(selector => {
            const elements = document.querySelectorAll(selector);
            elements.forEach(el => el.remove());
        });

        // 屏蔽全屏覆蓋的彈窗
        const popups = document.querySelectorAll('*');
        popups.forEach(popup => {
            const styles = window.getComputedStyle(popup);
            if (
                (styles.position === 'fixed' || styles.position === 'absolute') &&
                (parseInt(styles.width) > window.innerWidth * 0.5 ||
                 parseInt(styles.height) > window.innerHeight * 0.5) &&
                (popup.innerHTML.includes('關閉') || popup.innerText.length < 500)
            ) {
                popup.remove();
            }
        });

        // 自動點擊 "關閉" 按鈕
        const closeButtons = document.querySelectorAll('button, a, div');
        closeButtons.forEach(button => {
            if (
                button.innerText.includes('關閉') ||
                button.innerHTML.includes('×') ||
                button.title.includes('關閉')
            ) {
                button.click();
            }
        });
    }

    // 初始屏蔽廣告和追蹤器
    removeAdsAndTrackers();

    // 使用 MutationObserver 動態監控並屏蔽新加載的廣告和追蹤器
    const observer = new MutationObserver(mutations => {
        mutations.forEach(() => removeAdsAndTrackers());
    });
    observer.observe(document.body, { childList: true, subtree: true });

    // 屏蔽可能的第三方追蹤器請求
    const originalFetch = window.fetch;
    window.fetch = function(...args) {
        if (args[0] && args[0].includes('track')) {
            console.log('屏蔽追蹤器請求:', args[0]);
            return Promise.resolve(new Response('{}', { status: 204 }));
        }
        return originalFetch.apply(this, args);
    };

    const originalXHROpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(method, url, ...rest) {
        if (url.includes('track')) {
            console.log('屏蔽追蹤器請求:', url);
            return;
        }
        return originalXHROpen.call(this, method, url, ...rest);
    };

})();