xNhau Ad Blocker (Mobile Compatible)

Remove all ads and popups from xNhau while preserving media playback

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         xNhau Ad Blocker (Mobile Compatible)
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Remove all ads and popups from xNhau while preserving media playback
// @author       You
// @match        https://xnhau.im/*
// @match        https://*.xnhau.im/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';
    
    // Create a stylesheet with more precise ad targeting
    const style = document.createElement('style');
    style.textContent = `
        /* Ad containers but preserve main content */
        .spot:not(:has(video.main-video)), 
        .ad-container, 
        [id*="banner"],
        [id*="catfish"], 
        a[href*="utm_campaign"][target="_blank"], 
        a[href*="utm_medium"][target="_blank"], 
        a[target="_blank"][rel="nofollow"],
        div[style*="728px"][style*="90px"]:not(.video-player-container) { 
            display: none !important;
            height: 0 !important;
            width: 0 !important;
            opacity: 0 !important;
            pointer-events: none !important;
            position: absolute !important;
            visibility: hidden !important;
        }
        
        /* Preserve video player container styles */
        .video-js, .vjs-poster, video.main-content {
            display: block !important;
            height: auto !important;
            width: auto !important;
            opacity: 1 !important;
            pointer-events: auto !important;
            position: relative !important;
            visibility: visible !important;
        }
    `;
    document.head.appendChild(style);
    
    // Block obfuscated ad scripts that create popunders
    const originalAppendChild = Element.prototype.appendChild;
    Element.prototype.appendChild = function(node) {
        if (node.tagName === 'SCRIPT') {
            const scriptContent = node.textContent || '';
            if (scriptContent.includes('_0x') && 
                (scriptContent.includes('catfish') || 
                 scriptContent.includes('popunder') || 
                 scriptContent.includes('utm_'))) {
                return document.createComment('Blocked ad script');
            }
        }
        return originalAppendChild.call(this, node);
    };
    
    // Block the open window function used by popunders with a safer approach
    const originalOpen = window.open;
    window.open = function(url, name, specs) {
        if (url && (
            url.includes('utm_campaign') || 
            url.includes('utm_medium') || 
            url.includes('utm_source') ||
            url.includes('kbet.com') ||
            url.includes('lu88.com') ||
            url.includes('hit.club') ||
            url.includes('b52.cc')
        )) {
            console.log('Blocked popup:', url);
            return null;
        }
        return originalOpen.call(this, url, name, specs);
    };
    
    // Function to remove ads when DOM is loaded
    function removeAds() {
        // Only remove ad-specific containers
        const adSelectors = [
            '#catfishPcGuest',
            'div.spot:not(:has(video.main-video))',
            'a[target="_blank"][rel="nofollow"]:not(:has(video.main-content))'
        ];
        
        adSelectors.forEach(selector => {
            try {
                document.querySelectorAll(selector).forEach(el => {
                    el.remove();
                });
            } catch(e) {
                // Some selectors might not be supported in all browsers
            }
        });
        
        // More targeted approach for video ads
        document.querySelectorAll('video').forEach(video => {
            // Check if this is an ad video
            const parent = video.parentElement;
            if (parent && parent.tagName === 'A' && 
                parent.getAttribute('rel') === 'nofollow' &&
                (parent.href.includes('utm_') || 
                 parent.href.includes('kbet.com') || 
                 parent.href.includes('lu88.com') || 
                 parent.href.includes('hit.club') || 
                 parent.href.includes('b52.cc'))) {
                parent.remove();
            }
        });
        
        // Remove the obfuscated ad script containers
        document.querySelectorAll('script').forEach(script => {
            const content = script.textContent || '';
            if (content.includes('_0x') && 
                (content.includes('clickCount') || 
                 content.includes('firstClickTime') ||
                 content.includes('popunder'))) {
                script.remove();
            }
        });
        
        // Clean localStorage to prevent ad tracking
        try {
            localStorage.removeItem('firstClickTime');
            localStorage.removeItem('clickCount');
        } catch (e) {}
    }
    
    // Run immediately and after DOM is fully loaded
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', removeAds);
    } else {
        removeAds();
    }
    
    // More precise mutation observer to clean dynamically added ads
    const observer = new MutationObserver(mutations => {
        let needsAdRemoval = false;
        
        mutations.forEach(mutation => {
            if (mutation.addedNodes && mutation.addedNodes.length > 0) {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === 1) { // Element node
                        // Check if it's a known ad container
                        if (node.id === 'catfishPcGuest' || 
                            (node.classList && 
                             (node.classList.contains('spot') || 
                              node.classList.contains('ad-container')))) {
                            
                            // Make sure it's not a legitimate video container
                            if (!node.querySelector('video.main-video, video.main-content')) {
                                node.remove();
                            } else {
                                // If it contains legitimate video content, just remove ad parts
                                needsAdRemoval = true;
                            }
                        } else {
                            needsAdRemoval = true;
                        }
                    }
                });
            }
        });
        
        // Only do a full scan when needed
        if (needsAdRemoval) {
            removeAds();
        }
    });
    
    // Start observing the body for dynamically added content
    document.addEventListener('DOMContentLoaded', () => {
        observer.observe(document.documentElement, {
            childList: true,
            subtree: true
        });
    });
    
    // Override the closeAd function to do nothing
    window.closeAd = function() { return false; };
    
    console.log('xNhau Ad Blocker (Mobile Compatible): Active');
})();