// ==UserScript== // @name PlayZip 广告拦截与点击修复 // @namespace https://playzip.com/ // @version 5.0.0 // @description 根治 playzip.com 点击劫持与广告弹窗:基于深度取证,广告脚本(aclib.js/abcd.js)由 window.onload 后动态注入。v4 修复 v3 白名单含 playzip.com 导致同域广告脚本被误放行的核心漏洞,改为站内广告脚本路径级精确拦截;同时放宽遮罩识别(不再要求透明背景)以清理 runPop 各类弹层,并保留 window.open 白名单与 location 跳转拦截。v5 新增事件层防线:拦截广告脚本 abcd.js 的 handleAdClick 点击监听注册(纵深防御)。页面右下角显示"已启用"徽标用于确认脚本运行。 // @author 水瓶羊 // @match https://playzip.com/* // @match https://*.playzip.com/* // @grant none // @run-at document-start // @noframes // ==/UserScript== (function () { 'use strict'; // =================================================================== // 取证结论(2026-09-29 Edge 实测): // - 广告脚本 aclib.js(639KB) 与 /static/js/abcd.js 均不在静态 HTML 中, // 由 loadAds() 在 window.onload 后 document.createElement('script') 动态注入。 // - aclib.js 创建 #dontfoid 全屏透明遮罩(znid=11311110),点击被劫持跳转广告联盟; // abcd.js 对 zh-cn 用户监听 body 点击,90 秒冷却后 window.open 弹广告。 // - 实验验证:阻止这两个脚本后遮罩/劫持/广告请求全部消失,页面功能不受影响。 // 因此本脚本采用"脚本白名单 + 注入层拦截",不依赖广告域名黑名单穷举。 // =================================================================== // ========== 常量配置 ========== // 站内域名 const SITE_HOST = 'playzip.com'; // 允许加载的第三方脚本域名白名单(页面业务仅依赖 zepto/gtag/Clarity) const SCRIPT_ALLOW_HOSTS = [ 'playzip.com', 'cdnjs.cloudflare.com', // zepto.min.js(UI 依赖) 'googletagmanager.com', // Google Analytics 'clarity.ms' // Microsoft Clarity ]; // 精确拦截清单(路径级,优先于域名白名单判定) // v3 漏洞:白名单含 playzip.com,同域的 /aclib.js 与 /static/js/abcd.js 被误放行, // 注入拦截实际失效。v4 改为:广告脚本固定路径无论域名一律拦截。 const BLOCKED_SCRIPT_MARKS = ['aclib', 'abcd']; // 广告域名黑名单(仅作 location 跳转兜底,主防线是注入拦截) const AD_HOSTS = [ 'proceedflow.info', 'tikfap.click', 'linkclick.buzz', 't.jopeki.com', 'brimvale.xyz', 'aiyeyu.org', '23.225.187.244' ]; // ========== 工具函数 ========== function getHost(url) { try { return new URL(url, location.href).hostname.toLowerCase().replace(/^www\./, ''); } catch (e) { return ''; } } function isSiteHost(host) { return host === SITE_HOST || host.endsWith('.' + SITE_HOST); } function isAdUrl(url) { if (!url || typeof url !== 'string') return false; if (!/^https?:\/\//i.test(url)) return false; const host = getHost(url); if (isSiteHost(host)) return false; return AD_HOSTS.some(h => host === h || host.endsWith('.' + h) || host.startsWith(h + ':')); } function removeNode(el) { if (el && el.parentNode) { try { el.parentNode.removeChild(el); } catch (e) { /* ignore */ } } } // ========== 主防线:脚本注入白名单拦截 ========== // 广告脚本是运行时动态创建