自动关闭弹窗广告的脚本

wen 实用脚本 1

告别弹窗骚扰:三步打造你的自动关闭弹窗广告脚本(附完整代码)


目录导读

  1. 为什么弹窗广告是“过街老鼠”?——用户痛点与浏览器生态现状
  2. 脚本原理拆解——从DOM侦测到自动点击的完整逻辑链
  3. 手把手实战教学——基于JavaScript与Python的两种主流方案
  4. 高阶优化与避坑指南——防止误关、性能损耗与常见异常处理
  5. 核心问答(FAQ)——解决你关于脚本的一切疑问

为什么弹窗广告是“过街老鼠”?

自动关闭弹窗广告的脚本

在浏览新闻、查阅资料或在线购物时,突然弹出的全屏遮罩广告、右下角悬浮窗或“假关闭”按钮,不仅严重干扰视线,更可能暗藏恶意链接,据2024年海外安全机构报告,约23%的网页弹窗包含钓鱼风险,虽然浏览器自带的拦截器能过滤部分“开屏弹窗”,但对于网站内通过setTimeout延时加载或伪装成“优惠通知”的动态弹窗,传统拦截几乎无能为力,这正是我们需要自动关闭弹窗广告的脚本的核心理由——精准、即时、可自定义

脚本原理拆解

自动关闭脚本的本质是“监听-识别-触发”三步曲:

  • 监听:通过MutationObserver(DOM变动观察器)持续监听网页中body节点的新增子元素。
  • 识别:一旦检测到新增的高z-index(层叠优先级)节点,或包含特定关键词(如“立即领取”、“×”样式异常)的元素,判定为弹窗。
  • 触发:模拟用户点击该元素上的关闭按钮(通常是classclosedata-dismiss属性的节点),或直接移除该DOM节点。

手把手实战教学

方案A:浏览器油猴脚本(Tampermonkey)——适用于Chrome/Edge/Firefox

// ==UserScript==
// @name         自动关闭弹窗广告
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  自动移除页面内动态加载的弹窗容器
// @match        *://*/*
// @grant        none
// ==/UserScript==
(function() {
    'use strict';
    function killPopup() {
        // 常见弹窗根特征:具备以下class或id之一
        const popupSelectors = [
            '.modal', '.popup', '.dialog', '#modal-root',
            '[class*="overlay"]', '[class*="layui-layer"]'
        ];
        popupSelectors.forEach(sel => {
            document.querySelectorAll(sel).forEach(node => {
                // 排除必要的登录对话框(可加白名单判断)
                if (!node.textContent.includes('登录')) {
                    node.remove(); // 直接移除节点
                    console.log('[KillPopup] 已移除弹窗:', node.className);
                }
            });
        });
    }
    // 核心:监听DOM变化
    const observer = new MutationObserver(mutations => {
        mutations.forEach(m => {
            if (m.addedNodes.length > 0) killPopup();
        });
    });
    observer.observe(document.body, { childList: true, subtree: true });
    // 页面初始加载时也执行一次
    window.addEventListener('load', killPopup);
})();

方案B:Python + Selenium(适用于自动化测试或需模拟真实浏览器的场景)

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://example.com")
time.sleep(3)  # 等待页面渲染
# 尝试定位并点击关闭按钮(适用于常规弹窗结构)
try:
    close_btn = driver.find_element(By.XPATH, "//div[contains(@class,'close')]")
    close_btn.click()
    print("已点击关闭按钮")
except:
    # 若找不到按钮,则使用JS强制删除父元素
    driver.execute_script("""
        var items = document.querySelectorAll('.modal, .popup');
        items.forEach(item => item.remove());
    """)
    print("已通过JS移除弹窗容器")
driver.quit()

高阶优化与避坑指南

  • 避免“误杀”:许多网站使用modal类作为正常的图片预览层,优化方案是加入白名单关键词过滤,如仅当弹窗内包含“红包”、“抽奖”、“限时秒杀”等高频广告词时才触发移除。
  • 性能损耗控制MutationObserver在每个节点变化时都会触发回调,如果页面频繁更新(如直播弹幕),会导致卡顿,建议在回调函数中加入5秒的防抖(debounce)逻辑
  • 特例处理:个别网站使用Shadow DOM(影子DOM)封装弹窗,常规querySelector无法穿透,需使用document.querySelector('* /deep/ .popup')或改用puppeteer的无头浏览器方案。

核心问答(FAQ)

Q1:安装脚本后,为什么部分弹窗还是无法关闭? A:这通常是因为弹窗的关闭按钮是客户端事件绑定的,直接删除DOM虽然移除了视觉层,但残留的事件监听可能导致页面报错,建议先尝试模拟点击真正的关闭按钮(button[aria-label="Close"]),若失败再执行node.remove()

Q2:脚本是否会影响网站的正常功能(如下载文件)? A:有潜在风险,某些网站会将“确认下载”弹窗也做成广告样式,建议在脚本中增加域名白名单数组,对于信任的核心网站(如网银、政府网站)跳过执行。

Q3:是否有现成的浏览器插件替代脚本? A:有,如uBlock Origin(过滤规则)或AdGuard(元素隐藏),但它们的响应速度是“纯CSS隐藏”,即弹窗仍在内存中加载,会消耗流量,而脚本直接移除DOM节点,更彻底且节省资源。


自动关闭弹窗广告的脚本是提升网页浏览舒适度的利器,通过上述两种方案,你只需十几行代码就能实现“弹窗秒杀”的体验,但请务必注意,脚本应仅用于个人浏览器环境,切勿用于攻击或干扰他人网站的正常运营,如果你希望获得更智能的过滤(如基于机器学习识别广告图片),可在搜索引擎中查找“Puppeteer 弹窗拦截”或“Crowdsec 弹窗库”获取进阶思路,打开你的浏览器控制台,亲手写一个属于你的“弹窗终结者”吧!

抱歉,评论功能暂时关闭!