Greasy Fork

来自缓存

Greasy Fork is available in English.

AdGuard DNS + Anti-Adblock Handler

Blocks ad/tracker domains and handles anti-adblock popups

// ==UserScript==
// @name        AdGuard DNS + Anti-Adblock Handler
// @description Blocks ad/tracker domains and handles anti-adblock popups
// @match       *://*/*
// @version 0.0.1.20251028121705
// @namespace http://greasyfork.icu/users/1531587
// ==/UserScript==

(function() {
    'use strict';

    const FILTER_URL = "https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt";
    const CACHE_KEY = "adguard_filter_cache";
    const CACHE_TIME_KEY = "adguard_filter_cache_time";
    const CACHE_TTL = 24 * 60 * 60 * 1000; // 24h
    let blockedDomains = [];

    async function loadFilterList() {
        const lastFetch = parseInt(localStorage.getItem(CACHE_TIME_KEY) || "0", 10);
        const now = Date.now();

        if (now - lastFetch < CACHE_TTL) {
            blockedDomains = JSON.parse(localStorage.getItem(CACHE_KEY) || "[]");
            console.log("[AdGuard] Loaded cached domains:", blockedDomains.length);
            return;
        }

        try {
            const res = await fetch(FILTER_URL);
            const text = await res.text();
            blockedDomains = text.split("\n")
                .filter(line => line.startsWith("||"))
                .map(line => line.replace("||", "").replace("^", "").trim());
            localStorage.setItem(CACHE_KEY, JSON.stringify(blockedDomains));
            localStorage.setItem(CACHE_TIME_KEY, now.toString());
            console.log("[AdGuard] Updated filter list:", blockedDomains.length);
        } catch (e) {
            console.warn("[AdGuard] Failed to fetch filter list", e);
            blockedDomains = JSON.parse(localStorage.getItem(CACHE_KEY) || "[]");
        }
    }

    // Block fetch requests
    const origFetch = window.fetch;
    window.fetch = function(input, init) {
        const url = typeof input === "string" ? input : input.url;
        if (blockedDomains.some(domain => url.includes(domain))) {
            console.warn("[AdGuard] Blocked fetch:", url);
            return Promise.reject("Blocked by AdGuard Userscript");
        }
        return origFetch.apply(this, arguments);
    };

    // Block XHR requests
    const origOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(method, url) {
        if (blockedDomains.some(domain => url.includes(domain))) {
            console.warn("[AdGuard] Blocked XHR:", url);
            return;
        }
        return origOpen.apply(this, arguments);
    };

    // Remove ad elements dynamically
    const observer = new MutationObserver(() => {
        blockedDomains.forEach(domain => {
            document.querySelectorAll(`img[src*="${domain}"], iframe[src*="${domain}"], script[src*="${domain}"]`)
                .forEach(el => {
                    console.warn("[AdGuard] Removed element:", el.src);
                    el.remove();
                });
        });
    });
    observer.observe(document.documentElement, { childList: true, subtree: true });

    // Anti-Adblock detection
    function showAntiAdblockModal() {
        if (document.getElementById("adblock-modal")) return;
        const modal = document.createElement("div");
        modal.innerHTML = `
            <div id="adblock-modal" style="
                position: fixed; inset: 0;
                background: rgba(0,0,0,0.6);
                display: flex;
                align-items: center;
                justify-content: center;
                z-index: 999999;">
                <div style="
                    background: #fff;
                    padding: 20px 30px;
                    border-radius: 8px;
                    max-width: 400px;
                    text-align: center;
                    font-family: Arial, sans-serif;">
                    <h2 style="margin:0 0 10px; color:#e74c3c;">⚠ AdBlock Detected</h2>
                    <p style="margin:0 0 15px; font-size:15px; color:#333;">
                        This site detected you are using an Ad Blocker.<br>
                        Please disable it to continue smoothly.
                    </p>
                    <button id="disable-adblock-btn" style="
                        background:#e74c3c; color:#fff; padding:10px 20px;
                        border:none; border-radius:5px; font-size:14px; cursor:pointer;">
                        I Understand
                    </button>
                </div>
            </div>
        `;
        document.body.appendChild(modal);
        document.getElementById("disable-adblock-btn").addEventListener("click", () => {
            modal.remove();
        });
    }

    function antiAdblockWatcher() {
        const bait = document.createElement("div");
        bait.className = "ad ad-banner ad-unit adblock-detect";
        bait.style.position = "absolute";
        bait.style.left = "-9999px";
        document.body.appendChild(bait);

        setTimeout(() => {
            if (bait.offsetParent === null || bait.offsetHeight === 0 || bait.offsetWidth === 0) {
                showAntiAdblockModal();
            }
            bait.remove();
        }, 1500);
    }

    window.addEventListener("load", async () => {
        await loadFilterList();
        antiAdblockWatcher();
    });
})();