Xchina disable popup

绕过xChina弹窗检测

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        Xchina disable popup
// @namespace   http://tampermonkey.net/
// @version      1.53
// @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_cpt_483=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 });
})();