前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截
2个月前AdBlock/AdBlock Plus疑似升级了一次

因为自己主要负责面对海外的用户项目,发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了,于是专门研究了一下。并尝试了很多方法。
已失效的老方法
// 定义一个检测 AdBlock 的函数
function checkAdBlock() {// 请求一个可能被 AdBlock 拦截含有/ad的路径接口fetch('xxxx/xxxx/ad').then(response => {if (!response.ok) {// 如果响应状态码不是 2xx,可能是被拦截了console.log('AdBlock 可能已启用,请求被拦截');} else {// 请求成功,AdBlock 未拦截console.log('AdBlock 未启用,请求成功');}}).catch(error => {// 如果请求失败,可能是被拦截了console.log('AdBlock 可能已启用,请求失败', error);});
}// 调用检测函数
checkAdBlock();
尝试方法1(亲测后全部无用)
github上开源的一些方法基本都试了都不行
1,f**kAdblock
2,adblockDetector
3,AdBlock Warning
4,AdGuard Detector
5,blockadblock
…
尝试方法2(亲测后也无用)
创建一个div元素并添加一个可能被AdBlock识别的类名 ad,ads之类的
// 创建一个div元素并添加一个可能被AdBlock识别的类名
var adTest = document.createElement('div');
adTest.className = 'ad ads ad-test1 adblock-test'; // ad,ads之类的
adTest.style.display = 'block'; // 明确设置display为block以检测是否被覆盖
adTest.style.position = 'absolute'; // 绝对定位以避免影响页面布局
adTest.style.top = '-9999px'; // 将元素移出视口以避免干扰用户
adTest.style.left = '-9999px';
adTest.style.width = '1px';
adTest.style.height = '1px';// 将元素添加到DOM中
document.body.appendChild(adTest);// 立即检查元素是否被隐藏(即display属性是否被更改为none)
var adblockActive = (adTest.offsetWidth <= 0 && adTest.offsetHeight <= 0) || adTest.style.display === 'none';// 根据检测结果执行相应操作
if (adblockActive) {console.log('检测到AdBlock开启了');// 这里可以添加代码来处理AdBlock被检测到的情况
} else {console.log('AdBlock没有开启');// 清理:从DOM中移除测试元素(可选,因为已经移出视口)document.body.removeChild(adTest);
}
尝试方法3(亲测后发现可行)
思考
突然想起了阮一峰的博客,发现一个网站“万维广告”。

但是我们的项目又不需要接入这些三方的工具啥的,只是为了检测adblock到底开启了没有,到底有没有拦截当前网站的资源。毕竟主动提示用户去设置白名单啥的还是效率太低太低了。
然后又发现最新版的AdBlock/AdBlock Plus默认规则会拦截含有ads域名的资源。
于是尝试了一下
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>加载脚本检测</title><style>#load-error {color: red;display: none; /* 默认隐藏错误提示 */}</style>
</head>
<body><!-- 错误提示信息 --><div id="load-error">脚本加载失败!</div><!-- 加载外部脚本 --><script>function loadScript(url, callback) {var script = document.createElement('script');script.src = url;script.onerror = function() {// 脚本加载失败时显示错误提示var loadError = document.getElementById('load-error');loadError.style.display = 'block';if (callback && typeof callback === 'function') {callback(false); // 传递加载失败的信息给回调函数(可选)}};script.onload = function() {// 脚本加载成功时不执行任何操作(或者可以隐藏一个加载中的提示,如果有的话)if (callback && typeof callback === 'function') {callback(true); // 传递加载成功的信息给回调函数(可选)}};document.head.appendChild(script);}// 调用函数加载脚本loadScript('https://cdn.wwads.cn/js/makemoney.js');</script><!-- 页面其余内容 --><h1>欢迎来到我的网站</h1><p>这里是一些内容...</p>
</body>
</html>
解决
验证成功。但是这毕竟是别人系统的js资源,乱引入加载肯定不行。
含有ads域名的资源确实会被拦截,刚好我们有现成的ads.xxx.com域名资源。本地系统在初始化时通过判断ads.xxx.com/xxx/js 资源是否加载成功了来判断当前浏览器是否启用了检测AdBlock/AdBlock Plus开启状态。
大家如果还有啥其他有效的方法,欢迎补充…。后续继续更新
相关文章:
前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截
2个月前AdBlock/AdBlock Plus疑似升级了一次 因为自己主要负责面对海外的用户项目,发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了,于是专门研究了一下。并尝试了很多方法。 已失效的老方法 // 定义一个检测 AdBlock 的函数 function chec…...
macOS 上部署 RAGFlow
在 macOS 上从源码部署 RAGFlow-0.14.1:详细指南 一、引言 RAGFlow 作为一款强大的工具,在人工智能领域应用广泛。本文将详细介绍如何在 macOS 系统上从源码部署 RAGFlow 0.14.1 版本,无论是开发人员进行项目实践,还是技术爱好者…...
如何在Kickstart自动化安装完成后ISO内拷贝文件到新系统或者执行命令
如何在Kickstart自动化安装完成后ISO内拷贝文件到新系统或者执行命令 需求 在自动化安装操作系统完成后,需要对操作系统进行配置需要拷贝一些文件到新的操作系统中需要运行一些脚本 问题分析 Linux安装操作系统时,实际上是将ISO镜像文件中的操作系统…...
在服务器部署JVM后,如何评估JVM的工作能力,比如吞吐量
在服务器部署JVM后,评估其工作能力(如吞吐量)可以通过以下步骤进行: 1. 选择合适的基准测试工具 JMH (Java Microbenchmark Harness):适合微基准测试,测量特定代码片段的性能。Apache JMeter:…...
攻防世界32 very_easy_sql【SSRF/SQL时间盲注】
不太会,以后慢慢看 被骗了,看见very_easy就点进来了,结果所有sql能试的全试了一点用都没有 打开源代码发现有个use.php 好家伙,这是真的在考sql吗...... 制作gopher协议的脚本: import urllib.parsehost "12…...
STM32G474--Whetstone程序移植(双精度)笔记
1 获取Whetstone程序 Whetstone程序,我用github被墙了,所以用了KK的方式。 获取的程序目录如上所示。 2 新建STM32工程 配置如上,生成工程即可。 3 在生成的工程中添加并修改Whetstone程序 3.1 实现串口打印功能 在生成的usart.c文件中…...
【DeepSeek × Postman】请求回复
新建一个集合 在 Postman 中创建一个测试集合 DeepSeek API Test,并创建一个关联的测试环境 DeepSeek API Env,同时定义两个变量 base_url 和 api_key 的步骤如下: 1. 创建测试集合 DeepSeek API Test 打开 Postman。点击左侧导航栏中的 Co…...
开源身份和访问管理方案之keycloak(一)快速入门
文章目录 什么是IAM什么是keycloakKeycloak 的功能 核心概念client管理 OpenID Connect 客户端 Client Scoperealm roleAssigning role mappings分配角色映射Using default roles使用默认角色Role scope mappings角色范围映射 UsersGroupssessionsEventsKeycloak Policy创建策略…...
基于PaddleOCR的图像文字识别与程序打包方法
目录 一、基本介绍 二、程序实现 1)环境配置 2)代码实现 3)程序运行结果 三、程序打包 1)使用pyinstaller打包程序 2)添加依赖和模型数据 四、需要注意的问题 五、总结 一、基本介绍 本文主要介绍利用现有开源…...
单片机上SPI和IIC的区别
SPI(Serial Peripheral Interface)和IC(Inter-Integrated Circuit)是两种常用的嵌入式外设通信协议,它们各有优缺点,适用于不同的场景。以下是它们的详细对比: — 1. 基本概念 SPI࿰…...
Python 字典(一个简单的字典)
在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…...
一个简单的Windows TCP服务器实现
初始化 WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr { 0x00 }; struct sockaddr_in clientAddr { 0x00 }; int clientAddrLen sizeof(clientAddr);if (WSAStartup(MAKEWORD(2, 2), &wsaData) ! 0) {printf("WSAStartup f…...
Node.js笔记入门篇
黑马程序员视频地址: Node.js与Webpack-01.Node.js入门 基本认识 概念 定义:Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本 作用:使用Node.js 编写服务器端程序 ✓ …...
EX_25/2/10
epoll实现多路客户端之间的登录注册及消息和文件传输 服务器部分 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include…...
python视频爬虫
文章目录 爬虫的基本步骤一些工具模拟浏览器并监听文件视频爬取易错点一个代码示例参考 爬虫的基本步骤 1.抓包分析,利用浏览器的开发者工具 2.发送请求 3.获取数据 4.解析数据 5.保存数据 一些工具 requests, 用于发送请求,可以通过get,p…...
RbFT:针对RAG中检索缺陷的鲁棒性微调
今天给大家分享一篇最新的RAG论文: 论文题目:Enhancing Retrieval-Augmented Generation: A Study of Best Practices 论文链接:https://arxiv.org/pdf/2501.18365 论文代码:https://github.com/StibiumT16/Robust-Fine-tuning 研…...
证明: 极限的局部有界性
在考研数学中,极限的局部有界性是一个非常重要的概念,尤其是在讨论函数的连续性、可积性和可微性等性质时。局部有界性可以帮助我们理解函数在某些区域内的行为。 定理: 如果 lim x → x 0 f ( x ) L \lim_{x \to x_0} f(x) L limx→x0…...
51单片机俄罗斯方块计分函数
/************************************************************************************************************** * 名称:scoring * 功能:计分 * 参数:NULL * 返回:NULL * 备注:采用非阻塞延时 ****************…...
new 以及 call、apply、bind 关键字解析
1.new关键字 自动创建对象:使用new调用构造函数时,会自动创建一个空对象,并将其赋值给this。你不需要显式地使用{}来创建对象。 绑定this到新对象:构造函数内部的this指向新创建的对象,因此可以在构造函数中为新对象添…...
【用Deepseek搭建免费的个人知识库--综合教程(完整版)】第二篇:Ollama服务器
用Deepseek搭建免费的个人知识库–综合教程(完整版):第二篇:Ollama服务器部署 OLLAMA服务器的配置在很多网上都已经介绍的非常清楚了,我们的重点不在于那些简单的步骤,而是在需要为下一步做准备的地方更加…...
OFA-VE多模态推理实操手册:基于OFA-Large的语义对齐分析全流程
OFA-VE多模态推理实操手册:基于OFA-Large的语义对齐分析全流程 1. 引言:什么是视觉蕴含分析? 你有没有遇到过这样的情况:看到一张图片,然后有人用文字描述它,但你不太确定这个描述是否准确?或…...
百川2-13B量化版性能实测:OpenClaw长任务下的Token消耗与稳定性
百川2-13B量化版性能实测:OpenClaw长任务下的Token消耗与稳定性 1. 测试背景与动机 上周在尝试用OpenClaw自动化处理一个包含2000多份PDF的文献库时,遇到了令人头疼的Token消耗问题。原本计划让AI助手完成"读取PDF标题-提取关键词-分类归档"…...
数据科学家的懒人包:OpenClaw+nanobot自动清洗CSV并生成可视化报告
数据科学家的懒人包:OpenClawnanobot自动清洗CSV并生成可视化报告 1. 为什么需要自动化数据清洗与报告生成? 作为一名经常处理数据的人,我发现自己每周都在重复同样的工作:收到CSV文件→检查格式→处理缺失值→生成可视化→发送…...
Qwen2.5-72B-Instruct实战:vLLM + FastAPI 构建标准化OpenAI兼容接口
Qwen2.5-72B-Instruct实战:vLLM FastAPI 构建标准化OpenAI兼容接口 1. 模型介绍 Qwen2.5-72B-Instruct-GPTQ-Int4是Qwen大语言模型系列的最新版本,代表了当前开源大模型领域的顶尖水平。这个72B参数的指令调优模型经过GPTQ 4-bit量化处理,…...
FPGA实战避坑:手把手教你用Verilog搞定跨时钟域信号传输(附同步/异步FIFO完整代码)
FPGA实战避坑:手把手教你用Verilog搞定跨时钟域信号传输 第一次在FPGA项目里遇到跨时钟域问题,我盯着屏幕上那些随机跳变的数据波形,整整三天没想明白问题出在哪。当时我正在做一个工业传感器数据采集系统,处理器接口跑在100MHz&a…...
Python代码秒变Linux原生二进制:手把手带你用2026最新toolchain完成AOT编译(含交叉编译Windows/Mac/LoongArch三平台完整脚本)
第一章:Python代码秒变Linux原生二进制:手把手带你用2026最新toolchain完成AOT编译(含交叉编译Windows/Mac/LoongArch三平台完整脚本) Python长期受限于CPython解释器与GIL,难以直接生成真正独立、零依赖的原生可执行文…...
订单日记×禧巢汇家居:共同打造行业数字化标杆
一、客户背景 禧巢汇(上海)家居科技有限公司,成立于2025年,位于中国(上海)自由贸易试验区,是一家以从事销售家具为主的企业。 在业务不断壮大的过程中,面临订单处理效率低、统计数据麻烦等问题,需要一种既能提升运营效…...
EnCase、FTK还是取证大师?2024年主流电子取证工具横评与选型指南(附学习路径)
EnCase、FTK还是取证大师?2024年电子取证工具选型与职业发展全指南 当你的硬盘突然变成犯罪现场,键盘敲击声就是指纹,而每一串代码都可能成为呈堂证供——这就是电子取证专家的日常。在这个数据爆炸的时代,电子取证已从警方的技术…...
Openclaw中文版落地:nanobot支持中文错误提示、中文文档与本地化调试
Openclaw中文版落地:nanobot支持中文错误提示、中文文档与本地化调试 1. nanobot:超轻量级OpenClaw中文版 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手,现在全面支持中文环境。这个工具最大的特点是轻量高效,仅需约…...
Qwen3-0.6B-FP8极速对话工具:STM32F103C8T6最小系统板集成
Qwen3-0.6B-FP8极速对话工具:STM32F103C8T6最小系统板集成 让AI对话能力跑在指甲盖大小的开发板上 1. 场景与痛点 你可能很难想象,一个能进行智能对话的AI模型,居然可以运行在一块只有拇指大小的STM32开发板上。传统的AI模型部署往往需要强大…...
