Remove Ads (Safe for Content)

Remove or hide ads, including video overlays, banners, scripts, and auto-close ad overlays, while preserving all content, videos, and images

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey oder Violentmonkey installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey oder Violentmonkey installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey oder Userscripts installieren.

Um dieses Skript zu installieren, müssen Sie eine Erweiterung wie Tampermonkey installieren.

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

Um dieses Design zu installieren, müssen Sie eine Erweiterung wie Stylus installieren.

Um dieses Design zu installieren, müssen Sie eine Erweiterung wie Stylus installieren.

Um dieses Design zu installieren, müssen Sie eine Erweiterung wie Stylus installieren.

Um diesen Stil zu installieren, müssen Sie eine Erweiterung für den Benutzerstil Verwaltung installieren.

Um diesen Stil zu installieren, müssen Sie eine Erweiterung für den Benutzerstil Verwaltung installieren.

Um diesen Stil zu installieren, müssen Sie eine Erweiterung für den Benutzerstil Verwaltung installieren.

(Ich habe bereits einen Benutzerstil Verwaltung, ich möchte ihn installieren!)

// ==UserScript==
// @name         Remove Ads (Safe for Content)
// @namespace    http://tampermonkey.net/
// @version      1.9
// @description  Remove or hide ads, including video overlays, banners, scripts, and auto-close ad overlays, while preserving all content, videos, and images
// @author       You
// @match        *://rphang.ph/*
// @match        *://*.rphang.ph/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // List of ad selectors (updated with new ad-specific selectors)
    const adSelectors = [
        'iframe[src*="doubleclick.net"]',
        'iframe[src*="googlesyndication.com"]',
        'iframe[src*="bankingbloatedcaptive.com"]',
        'iframe[src*="chestgoingpunch.com"]',
        'iframe[src*="magsrv.com"]',
        'iframe[src*="ad.plus"]',
        'iframe[src*="adnxs"]',
        'iframe[src*="adsystem"]',
        'iframe[id*="__clb-"]',
        'script[src*="doubleclick.net"]',
        'script[src*="googlesyndication.com"]',
        'script[src*="bankingbloatedcaptive.com"]',
        'script[src*="chestgoingpunch.com"]',
        'script[src*="magsrv.com"]',
        'script[src*="adserver"]',
        'script[src*="popunder"]',
        'script[id*="__clb-"]',
        'script[class*="__clb-"]',
        '[class*="ads"]',
        '[id*="ads"]',
        '[class*="ad-banner"]',
        '[id*="ad-banner"]',
        '[class*="advertisement"]',
        '[id*="advertisement"]',
        '[class*="sponsor"]',
        '[id*="sponsor"]',
        '[class*="ad-"]',
        '[id*="ad-"]',
        '.samOverlayCloseButton',
        '.samVideoOverlay',
        '.samCodeUnit',
        '.ad-container',
        '.ad-content',
        'ins[data-zoneid]',
        '[class^="eas"]',
        '.samBannerUnit',
        '.samItem',
        'a[href*="utm_source=rphangme"]',
        'a[href*="adserver"]',
        'a[href*="clicktrack"]',
        'img[src*="rphang.online/images/pc-"]',
        'div[id*="banner"]',
        'div[class*="banner"]',
        'div[id*="popup"]',
        'div[class*="popup"]',
        'div[id*="sticky"]',
        'div[class*="sticky"]',
        'div[id*="float"]',
        'div[class*="float"]',
        'div[style*="position: fixed"][style*="z-index: 9999"]',
        '.adsbygoogle',
        '#overlay-ad',
        '.overlay-ad',
        'div[data-position="footer_fixed"]', // New: Targets footer ad unit
        'div[data-position="container_breadcrumb_top_above"]', // New: Targets top banner ad unit
        'video.catfishpc', // New: Targets video ads
        'img.catfishpc', // New: Targets image ads
        'a[href*="b52.cc"]', // New: Targets specific ad link
        'a[href*="vip79.com"]', // New: Targets specific ad link
        'a[href*="da88.win"]', // New: Targets specific ad link
        'a[href*="hong88.com"]', // New: Targets specific ad link
        'a[rel="nofollow"][href*="utm_term=sex"]' // New: Targets ad links with specific utm_term
    ];

    // Whitelist to prevent false positives
    const whitelist = [
        'player',
        'video-container',
        'content-main',
        'navigation',
        'header',
        'footer',
        'sidebar',
        'message-userContent',
        'video-player'
    ];

    // Function to check if element is in whitelist
    function isWhitelisted(element) {
        if (!element) return false;
        return whitelist.some(term => {
            if (element.id && element.id.includes(term)) return true;
            if (element.className && typeof element.className === 'string' && element.className.includes(term)) return true;
        }) || element.closest('.message-userContent, .video-player');
    }

    // Function to hide or remove ads safely
    function removeAds() {
        adSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(el => {
                try {
                    if (!el.querySelector('video:not(.catfishpc)') && !isWhitelisted(el)) { // Updated to allow non-ad videos
                        console.log('Hiding ad element:', selector, el);
                        el.style.display = 'none';
                        if (selector.includes('script') || selector.includes('iframe') || selector.includes('video.catfishpc')) {
                            el.remove();
                        }
                    }
                } catch (error) {
                    console.error('Error hiding/removing ad:', selector, error);
                }
            });
        });
    }

    // Function to auto-click the "Close Ad" button
    function autoCloseAdOverlay() {
        document.querySelectorAll('.samOverlayCloseButton, .samCloseButton, .ad-close-button, .close-ad, [class*="close"][class*="ad"]').forEach(closeButton => {
            try {
                console.log('Close button found:', closeButton);
                closeButton.click();
                const clickEvent = new Event('click', { bubbles: true });
                closeButton.dispatchEvent(clickEvent);
                const adContainer = closeButton.closest('.samBannerUnit, .samCodeUnit, .ad-container, [class*="ad-"]');
                if (adContainer && !adContainer.querySelector('video:not(.catfishpc)') && !adContainer.querySelector('img:not([src*="ad"])') && !isWhitelisted(adContainer)) {
                    console.log('Hiding ad container:', adContainer);
                    adContainer.style.display = 'none';
                }
            } catch (error) {
                console.error('Error closing ad overlay:', error);
            }
        });
    }

    // Disable AdProvider to prevent ad reinjection
    function disableAdProvider() {
        try {
            window.AdProvider = {
                push: function() {
                    console.log('Blocked AdProvider.push');
                }
            };
        } catch (error) {
            console.error('Error disabling AdProvider:', error);
        }
    }

    // Remove inline event attributes that trigger ads
    function removeInlineAdEvents() {
        document.querySelectorAll('[onclick], [ondblclick]').forEach(el => {
            try {
                el.removeAttribute('onclick');
                el.removeAttribute('ondblclick');
            } catch (error) {
                console.error('Error removing inline events:', error);
            }
        });
    }

    // Block click and double-click event listeners to prevent ad popups
    function blockAdEvents() {
        ['click', 'dblclick'].forEach(eventType => {
            document.body.addEventListener(eventType, function(e) {
                const isAdElement = adSelectors.some(selector => e.target.closest(selector));
                if (isAdElement) {
                    e.stopPropagation();
                    e.preventDefault();
                }
            }, true);
        });
    }

    // Optimized hideOverlayAds
    function hideOverlayAds() {
        const potentialOverlays = document.querySelectorAll('div[style*="position: fixed"], div[style*="position: absolute"], iframe[style*="position: fixed"], iframe[style*="position: absolute"]');
        potentialOverlays.forEach(el => {
            try {
                const style = window.getComputedStyle(el);
                const zIndex = parseInt(style.zIndex, 10);
                if (zIndex > 1000 && !el.querySelector('video:not(.catfishpc)') && !isWhitelisted(el)) {
                    if (style.display !== 'none' &&
                        (style.width === '100%' || parseInt(style.width) > 300) &&
                        (style.height === '100%' || parseInt(style.height) > 200)) {
                        console.log('Hiding high z-index element:', el);
                        el.style.display = 'none';
                    }
                }
            } catch (error) {
                console.error('Error hiding overlay:', error);
            }
        });
    }

    // Resource cleanup function
    function cleanupResources() {
        if (observer) {
            observer.disconnect();
        }
        if (interval) {
            clearInterval(interval);
        }
    }

    // Initial run
    disableAdProvider();
    removeAds();
    autoCloseAdOverlay();
    removeInlineAdEvents();
    blockAdEvents();
    hideOverlayAds();

    // Efficient MutationObserver configuration
    const observer = new MutationObserver((mutations) => {
        const shouldProcess = mutations.some(mutation =>
            mutation.type === 'childList' && mutation.addedNodes.length > 0 ||
            (mutation.type === 'attributes' &&
             (mutation.target.tagName === 'IFRAME' ||
              mutation.attributeName === 'src' ||
              mutation.attributeName === 'class' ||
              mutation.attributeName === 'id' ||
              mutation.attributeName === 'style'))
        );

        if (shouldProcess) {
            removeAds();
            autoCloseAdOverlay();
            removeInlineAdEvents();
            hideOverlayAds();
        }
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['src', 'class', 'id', 'style']
    });

    // Interval to check for ads in the first 20 seconds
    const interval = setInterval(() => {
        autoCloseAdOverlay();
        removeAds();
        hideOverlayAds();
    }, 500);

    setTimeout(() => clearInterval(interval), 20000);

    // Cleanup on page unload
    window.addEventListener('unload', cleanupResources);
})();