AD block(Weiren)

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

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

(function () {
    'use strict';

    // Google Ads 域名列表(包括子網)
    const googleAdsDomains = [
        '*://*.googleads.g.doubleclick.net/*',
        '*://*.pagead2.googlesyndication.com/*',
        '*://*.adservice.google.com/*',
        '*://*.gstatic.com/ads/*',
        '*://*.googletagservices.com/*',
        '*://*.googlesyndication.com/*'
    ];

    // cat.sg1 廣告域名
    const catSg1AdsDomains = [
        '*://cat.sg1/*', // 假設這是 cat.sg1 的廣告域名,根據實際情況調整
        '*://*.cat.sg1/*' // 子網也加入
    ];

    // 通用廣告及追蹤器域名
    const adAndTrackerDomains = [
        '*://*.doubleclick.net/*',
        '*://*.adnxs.com/*',
        '*://*.adsafeprotected.com/*',
        '*://*.adform.net/*',
        '*://*.taboola.com/*',
        '*://*.outbrain.com/*',
        '*://*.criteo.com/*'
    ];

    // Google Forms 廣告元素識別
    const formsAdSelectors = [
        'iframe[src*="doubleclick.net"]',
        'iframe[src*="googlesyndication.com"]',
        '.adsbygoogle', // 常見的 Google Ads 類
        '.google-ads-frame' // 另一種常見的 Google Forms 廣告標識
    ];

    // cat.sg1 廣告元素識別(假設的元素名稱,根據實際情況調整)
    const catSg1AdSelectors = [
        'iframe[src*="cat.sg1"]', // 針對 cat.sg1 網站中的 iframe 廣告
        '.cat-ad', // 假設的廣告 class 名稱,根據實際情況調整
        '[id*="cat-ad"]', // 假設的廣告 ID 名稱
        '.cat-popup', // 假設的彈窗 class 名稱
        '[data-ad*="cat.sg1"]' // 假設的屬性選擇器
    ];

    const allBlockedDomains = [...googleAdsDomains, ...catSg1AdsDomains, ...adAndTrackerDomains];
    const domainRegex = new RegExp(allBlockedDomains.map(domain => domain.replace(/\*/g, '.*')).join('|'), 'i');

    let adRegexList = [];
    let trackerRegexList = [];

    // 載入規則文件
    function loadRules(url, targetList) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (response) {
                const rules = response.responseText.split('\n');
                const regexList = rules
                    .filter(rule => rule.startsWith('||') && rule.includes('^'))
                    .map(rule => new RegExp(rule.replace('||', '').replace('^', '').trim()));
                targetList.push(...regexList);
                console.log(`規則已載入:${url},共解析到 ${regexList.length} 條規則`);
            },
            onerror: function () {
                console.error(`無法載入規則:${url}`);
            },
        });
    }

    // 攔截 XMLHttpRequest
    const originalOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
        if (domainRegex.test(url) || adRegexList.some(regex => regex.test(url)) || trackerRegexList.some(regex => regex.test(url))) {
            console.log(`攔截請求: ${url}`);
            return; // 阻止請求
        }
        return originalOpen.apply(this, arguments);
    };

    // 攔截 Fetch API
    const originalFetch = window.fetch;
    window.fetch = function (url, options) {
        if (domainRegex.test(url.toString()) || adRegexList.some(regex => regex.test(url.toString())) || trackerRegexList.some(regex => regex.test(url.toString()))) {
            console.log(`攔截 Fetch API 請求: ${url}`);
            return Promise.reject('攔截的廣告或追蹤請求');
        }
        return originalFetch.apply(this, arguments);
    };

    // 隱藏廣告、追蹤器和彈窗元素
    GM_addStyle(`
        iframe, .ad, .ads, .sponsored, .advertisement,
        [id*="ad"], [class*="ad"], [data-ad], [aria-label*="advertisement"],
        [id*="popup"], [class*="popup"], [data-popup], .modal, .overlay,
        ${formsAdSelectors.join(', ')},
        ${catSg1AdSelectors.join(', ')} {
            display: none !important;
        }
    `);

    // 使用 MutationObserver 隱藏動態生成的彈窗和廣告元素
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === 1) { // 元素節點
                    const nodeHtml = node.outerHTML || '';
                    if (
                        node.matches('[id*="popup"], [class*="popup"], .modal, .overlay') ||
                        domainRegex.test(nodeHtml) ||
                        formsAdSelectors.some(selector => node.matches(selector)) ||
                        catSg1AdSelectors.some(selector => node.matches(selector))
                    ) {
                        console.log('動態攔截並移除元素:', node);
                        node.remove();
                    }
                }
            });
        });
    });
    observer.observe(document.body, { childList: true, subtree: true });

    // 阻止常見的彈窗事件
    window.addEventListener('load', () => {
        document.querySelectorAll('[onclick*="popup"], [onmouseover*="popup"]').forEach(el => el.removeAttribute('onclick'));
    });
    window.addEventListener('beforeunload', e => e.preventDefault());
    window.addEventListener('popstate', e => e.preventDefault());

    // 加載廣告過濾規則
    loadRules('https://easylist.to/easylist/easylist.txt', adRegexList); // EasyList 廣告規則
    loadRules('https://easylist.to/easylist/easyprivacy.txt', trackerRegexList); // EasyPrivacy 追蹤器規則
    loadRules('https://filters.adtidy.org/extension/chromium/filters/2.txt', adRegexList); // AdGuard Base filter
    loadRules('https://filters.adtidy.org/extension/chromium/filters/3.txt', trackerRegexList); // AdGuard Tracking Protection

    console.log('最強廣告攔截腳本已啟動');
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址