绕过xChina弹窗检测
// ==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 });
})();