Xchina disable popup

绕过xChina弹窗检测

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==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 });
})();