Xchina disable popup

绕过xChina弹窗检测

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name        Xchina disable popup
// @namespace   http://tampermonkey.net/
// @version      1.52
// @description 绕过xChina弹窗检测
// @author      Aloazny && Grok
// @license     MIT
// @run-at      document-start
// @match       *://*.1909.me/*
// @match       *://*.8se.me/*
// @match       *://*.crxs.me/*
// @match       *://*.litu100.xyz/*
// @match       *://*.shise.me/*
// @match       *://*.xbbs.me/*
// @match       *://*.xbookcn.org/*
// @match       *://*.xchina*.*/*
// @match       *://*.xchina-cn.com/*
// @match       *://*.xchina.biz/*
// @match       *://*.xchina.co/*
// @match       *://*.xchina.com/*
// @match       *://*.xchina.fit/*
// @match       *://*.xchina.fun/*
// @match       *://*.xchina.ink/*
// @match       *://*.xchina.pro/*
// @match       *://*.xchina.site/*
// @match       *://*.xchina.store/*
// @match       *://*.xchina.tv/*
// @match       *://*.xchina001.site/*
// @match       *://*.xchina003.site/*
// @match       *://1909.me/*
// @match       *://8se.me/*
// @match       *://crxs.me/*
// @match       *://litu100.xyz/*
// @match       *://shise.me/*
// @match       *://xbbs.me/*
// @match       *://xbookcn.org/*
// @match       *://xchina*.*/*
// @match       *://xchina-cn.com/*
// @match       *://xchina.biz/*
// @match       *://xchina.co/*
// @match       *://xchina.com/*
// @match       *://xchina.fit/*
// @match       *://xchina.fun/*
// @match       *://xchina.ink/*
// @match       *://xchina.pro/*
// @match       *://xchina.site/*
// @match       *://xchina.store/*
// @match       *://xchina.tv/*
// @match       *://xchina001.site/*
// @match       *://xchina003.site/*
// @icon       data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAIKSURBVFiF1ZexSxtRHMc/d2B0MBoJUpw8hKZTIZA/oNc/oLTg5tK4nJukUCh0aYcOduvYZGhT6JbFEimO10HrYFAREQKm51KXSBouS+JwHV6Cjd673JlLjn6XhB+/e59P3uW9d6fQjZPHAAwgw2hTqdsU5l9SAlC68HwXPrbYbUoz66wpzkdeobAxTngvpxe8V5w8Z8BSFALtKxpqVHCAyQnm1KjgvfxnAsk0PDHBcMRnLOHepz2DFeu6L5mWDqk4eRxf8FhCDBqbva5Vv4CZ7e9LZUH/3F+7+AFl3XVY/zPwINsPB0g9h7jmDQdYeCQddvj/QCrrDQe4PApBwNp0rz/MiXssgwP8zIUgYFtgfbtdj83C8oH8OnMVfpshCABUi4HaMVcHXhNMwNqE1nlo8OACAMcfQoPfTcBjUwkKDy6gF8Xa94pstQwt4AcOYsMKXcAvHMS+EKpAEDjA9KI4jEIRyLyVwztNcRi5JeX/NsgF4hpk3sjhZR12c+L7zWhP+w+pOwl4/YrdHFweQuePfF8YWsC23Os317nbmu80oX44pEC1KB4kemmdw9bj20DbElL/9pV1MTs+MviJKJmGyYTniQaIKY9rg/sCC4w4KlCLCl5v0VCbbQpRCXzdo6Ym1inYbfGmOs5sn1B7UaKiAHMA+68x7t/DmJka7avarzqNTzvU3n2nAvAXteumoVQH+scAAAAASUVORK5CYII=
// @grant       unsafeWindow
// @grant       GM_addStyle
// @grant       GM_cookie
// ==/UserScript==

(function() {
    'use strict';
    const w = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window;
    const d = document;

// 修改Cookie值
const COOKIE_MODIFY = `clicked_cpc_131=1
clicked_cpt_258=1
clicked_cpt_437=1
clicked_cpt_453=1
clicked_cpt_473=1
clicked_cpt_475=1
clicked_cpt_477=1
clicked_cpt_479=1
clicked_cpt_482=1
clicked_modal=1
showed_adscarat_shuffle_box=1`.trim().split('\n').map(l=>l.trim());

    const domain = '.' + location.hostname.split('.').slice(-2).join('.');
    const secure = location.protocol==='https:'?';secure':'';
    const expires = new Date(Date.now()+31536e6).toUTCString();

    const fixMap = Object.fromEntries(COOKIE_MODIFY.map(l=>l.split('=')));

    function setModCookie(n,v){
        const encodedName = encodeURIComponent(n);
        const encodedValue = encodeURIComponent(v);
        d.cookie = `${encodedName}=${encodedValue};expires=${expires};path=/;domain=${domain}${secure}`;
        if(typeof GM_cookie==='function')try{GM_cookie.set({name:encodedName,value:encodedValue,domain:location.hostname,path:'/',expirationDate:Math.floor(Date.now()/1000)+31536000})}catch(e){}
    }

    function createCookieRegex(key) {
        const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
        return new RegExp('(^|; )' + escapedKey + '=[^;]*', 'g');
    }

    COOKIE_MODIFY.forEach(l=>{const [n,v]=l.split('=');setModCookie(n,v)});

    const cookieDesc = Object.getOwnPropertyDescriptor(Document.prototype,'cookie')||Object.getOwnPropertyDescriptor(HTMLDocument.prototype,'cookie');
    if (cookieDesc && cookieDesc.configurable) {
       Object.defineProperty(d, 'cookie', {
        get: function() {
            let s = cookieDesc.get.call(this);
            for (const k in fixMap) {
                const reg = createCookieRegex(k);
                s = s.replace(reg, '$1' + k + '=' + fixMap[k]);
            }
            return s;
        },
        set: function(v) {
            for (const k in fixMap) {
                const reg = createCookieRegex(k);
                v = v.replace(reg, '$1' + k + '=' + fixMap[k]);
            }
             cookieDesc.set.call(this, v);
          },
          configurable: true
       });
   }

    function injectCSS(css) {
        if (typeof GM_addStyle === 'function') {
            GM_addStyle(css);
        } else {
            const style = Object.assign(d.createElement('style'), { textContent: css });
            (d.head || d.documentElement).appendChild(style);
        }
    }

// Css样式注入
const baseCSS =`
.modal-alert,
.block-overlay,
.adblock-overlay
{display:none!important}
`.trim();

const hideCSS = `
.a-media.ex-728-90,
.ad,
.exoclick_300x250,
.exoclick_300x500,
.google-adsbygoogle,
.media,
.outer-banner,
.photos > div.item > div > a[target="_blank"],
.photos > div.item > div[class^="exoclick_"],
.push-bottom,
.push-bottom-container[clickmode="cpt"],
.push-bottom-container[key] > .push-bottom,
.push-slider[key^="clicked_cpt"],
.push-top,
.push-top-container > .push-top[key],
.slider-ad,
[adid],
[class*="exoclick_"],
[class*="fa-ban"],
[class^="photoMask"],
[class^="playerMask"],
[href="#"]:not([data-page]),
[src^="https://xchina.click/"],
a[clickmode="ad"],
a[clickmode="cpt"],
a[clickmode="cpt"][target="_blank"][rel="nofollow noopener"] > img[src*="xchina"],
a[href*="//go.mnaspm.com"],
a[href*="/xchina.fun/redirect/ad"],
a[href*="xchina.click/prepare."],
a[href^="https://xchina.app"],
a[href^="https://xchina.click/"],
div > div:only-child > .media img[src*="/ad/"],
div.ex-300-250,
div.item > div.a-media,
div.media > a > img[src*="xchina"],
div.recommendation_widget,
div[class*="jquery-modal"],
div[class*="modalAd"],
div[class^="item photo zone"],
div[linkurl^="https://xchina.click/"],
div[style*="width: 300px;"][style*="height: 455px;"],
div[url^="https://xchina.click/"],
iframe[src*=".magsrv.com/"],
iframe[width="728"][height="90"],
ins.adsbygoogle[data-ad-slot],
script[src$="/ad-provider.js"] + ins
{display:none!important}
`.trim();

const imgCSS = `
div.media > a > img[src^="https://upload.xchina.biz/ad/"] {display:none!important}
div.media > a > img[src^="https://upload.xchina.biz/ad/"] ~ * {display:none!important}
`.trim();

    const cssContents = [baseCSS, hideCSS, imgCSS];
    const styleIds = ['xchina-base', 'xchina-hide', 'xchina-img'];
    let injectedStyles = new Set();

    function ensureCSSInjection() {
        cssContents.forEach((css, index) => {
            const styleId = styleIds[index];
            if (!injectedStyles.has(styleId)) {
                const existing = d.getElementById(styleId);
                if (!existing) {
                    const style = Object.assign(d.createElement('style'), { 
                        textContent: css,
                        id: styleId
                    });
                    (d.head || d.documentElement).appendChild(style);
                    injectedStyles.add(styleId);
                }
            }
        });
    }

    w.googleAdsInstance = {
        initGoogleTag: () => { w.googletag = { cmd: [] }; },
        initAdSense: () => { w.adsbygoogle = []; }
    };
    w.googleAdsInstance.initGoogleTag();
    w.googleAdsInstance.initAdSense();

    const realFetch = w.fetch;
    w.fetch = function(input, init) {
        const url = typeof input === 'string' ? input : input.url || '';
        if (/recordDetect|adblock|detect/i.test(url)) {
            return Promise.resolve(new Response('{"success":true}', {
                status: 200,
                headers: { 'Content-Type': 'application/json' }
            }));
        }
        if (url.includes && url.includes('6888.site/v2.php')) {
            return Promise.resolve(new Response('', {
                status: 200,
                statusText: 'OK'
            }));
        }
        return realFetch.apply(this, arguments);
    };

    Object.defineProperty(w, 'googleAdsInstance', { value: w.googleAdsInstance, writable: false });

    w.adConfigInstance = { active: true };
    w.adsSystemLoaded = w.AD_SCRIPT_LOADED = true;
    w.google_ad_client = 'ca-pub-2085856493428967';

    const noop = { fire: () => {}, show: () => {}, hide: () => {}, close: () => {}, showModal: () => {}, setContent: () => noop };
    ['Swal', 'sweetAlert', 'layer', 'artDialog', 'dialog', 'modal', 'Modal', 'ModalAlert'].forEach(name =>
        Object.defineProperty(w, name, { value: noop, writable: false, configurable: false })
    );

    const blockRegex = /Swal|modal_alert|请关闭广告拦截|isBlocked/i;
    w.setTimeout = new Proxy(w.setTimeout, {
        apply: (t, _, a) => blockRegex.test(a[0] + '') ? 0 : t(...a)
    });
    w.setInterval = new Proxy(w.setInterval, {
        apply: (t, _, a) => blockRegex.test(a[0] + '') ? 0 : t(...a)
    });

    d.addEventListener('beforescriptexecute', e => {
        if (blockRegex.test(e.target.textContent)) {
            e.preventDefault();
            e.stopPropagation();
            e.target.remove();
        }
    }, true);
    
    ensureCSSInjection();
    
    // 兼容Webview105以下
    d.addEventListener('DOMContentLoaded', () => {
        d.querySelectorAll('[class$="article"]').forEach(el => {
            if (el.querySelector('.media > a > img[src^="https://upload.xchina.biz/ad/"]')) el.style.display = 'none';
        });
        d.querySelectorAll('div.item').forEach(el => {
            if (el.querySelector('div.a-media')) el.style.display = 'none';
        });
        d.querySelectorAll('div.media').forEach(el => {
            if (el.querySelector('a > img[src*="xchina"]')) el.style.display = 'none';
        });
        d.querySelectorAll('.photos > div.item').forEach(el => {
            if (el.querySelector('div > a[target="_blank"]') || el.querySelector('div[class^="exoclick_"]')) {
                el.style.display = 'none';
            }
        });
        d.querySelectorAll('div').forEach(el => {
            const child = el.firstElementChild;
            if (child && child === el.lastElementChild && child.querySelector && child.querySelector('.media img[src*="/ad/"]')) {
                el.style.display = 'none';
            }
        });
    }, false);

    const f = { detected: false, details: { first: false, second: false }, timestamp: Date.now() };
    const h = (t, p) => { try { Object.defineProperty(t, p, { value: f, writable: true, configurable: true }); } catch(e) {} };
    const c = Document.prototype.createElement;
    Document.prototype.createElement = function(t) {
        const e = c.call(this, t);
        if (t === 'script') {
            const desc = Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype, 'src') || {};
            Object.defineProperty(e, 'src', {
                set(v) {
                    if (v && /ads?\.js|ad[\/.]|advertisement/.test(v)) {
                        setTimeout(() => e.dispatchEvent(new Event('load')), 10);
                        return;
                    }
                    desc.set ? desc.set.call(this, v) : this.setAttribute('src', v);
                },
                get: () => e.getAttribute('src')
            });
        }
        return e;
    };

    const x = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(m, u) {
        if (u && /recordDetect|adblock|detect/i.test(u)) return;
        return x.apply(this, arguments);
    };

    const o = w.registerSiteProbeCallback;
    w.registerSiteProbeCallback = function(cb) {
        if (o) o(cb);
        try { cb(f); } catch(e) {}
    };
    const g = w.getSiteProbeKey;
    w.getSiteProbeKey = function() {
        let k = g ? g() : '__' + Math.random().toString(36).slice(2,8);
        h(w, k);
        return k;
    };

    setTimeout(() => {
        const k = w.getSiteProbeKey();
        h(w, k);
        w.dispatchEvent(new CustomEvent('site:probe:complete', { detail: { key: k, result: f } }));
    }, 100);

    const cssObserver = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            mutation.removedNodes.forEach((node) => {
                if (node.nodeType === 1 && node.tagName === 'STYLE' && styleIds.includes(node.id)) {
                    setTimeout(ensureCSSInjection, 10);
                }
            });
        });
        ensureCSSInjection();
    });

    const elementObserver = new MutationObserver(() => {
        d.querySelectorAll('.block-overlay,[class*="block"][class*="overlay"],[class*="adb"][class*="overlay"]').forEach(e => e.remove());
    });

    cssObserver.observe(d.documentElement, { childList: true, subtree: true, attributes: false });
    elementObserver.observe(d.documentElement, { childList: true, subtree: true });
})();