2個(gè)月前AdBlock/AdBlock Plus疑似升級(jí)了還是過(guò)濾規(guī)則變了
因?yàn)樽约褐饕?fù)責(zé)面對(duì)海外的用戶項(xiàng)目,發(fā)現(xiàn)以前的檢測(cè)AdBlock/AdBlock Plus開(kāi)啟狀態(tài)方法已失效了,于是專門研究了一下。并嘗試了很多方法。
已失效的老方法
// 定義一個(gè)檢測(cè) AdBlock 的函數(shù)
function checkAdBlock() {
// 請(qǐng)求一個(gè)可能被 AdBlock 攔截含有/ad的路徑接口
fetch('xxxx/xxxx/ad')
.then(response => {
if (!response.ok) {
// 如果響應(yīng)狀態(tài)碼不是 2xx,可能是被攔截了
console.log('AdBlock 可能已啟用,請(qǐng)求被攔截');
} else {
// 請(qǐng)求成功,AdBlock 未攔截
console.log('AdBlock 未啟用,請(qǐng)求成功');
}
})
.catch(error => {
// 如果請(qǐng)求失敗,可能是被攔截了
console.log('AdBlock 可能已啟用,請(qǐng)求失敗', error);
});
}
// 調(diào)用檢測(cè)函數(shù)
checkAdBlock();
嘗試方法1(親測(cè)后全部無(wú)用)
github上開(kāi)源的一些方法基本都試了都不行
...
嘗試方法2(親測(cè)后也無(wú)用)
創(chuàng)建一個(gè)div元素并添加一個(gè)可能被AdBlock識(shí)別的類名 ad,ads之類的
// 創(chuàng)建一個(gè)div元素并添加一個(gè)可能被AdBlock識(shí)別的類名
var adTest = document.createElement('div');
adTest.className = 'ad ads ad-test1 adblock-test'; // ad,ads之類的
adTest.style.display = 'block'; // 明確設(shè)置display為block以檢測(cè)是否被覆蓋
adTest.style.position = 'absolute'; // 絕對(duì)定位以避免影響頁(yè)面布局
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';
// 根據(jù)檢測(cè)結(jié)果執(zhí)行相應(yīng)操作
if (adblockActive) {
console.log('檢測(cè)到AdBlock開(kāi)啟了');
// 這里可以添加代碼來(lái)處理AdBlock被檢測(cè)到的情況
} else {
console.log('AdBlock沒(méi)有開(kāi)啟');
// 清理:從DOM中移除測(cè)試元素(可選,因?yàn)橐呀?jīng)移出視口)
document.body.removeChild(adTest);
}
思考
靜下心來(lái)好好看了看adblcok plus官網(wǎng)說(shuō)明,原來(lái)AdBlock 和 AdBlock Plus等等默認(rèn)攔截規(guī)則原來(lái)是 EasyList。
EasyList是什么
EasyList 是什么? EasyList 是一個(gè)開(kāi)源的廣告過(guò)濾規(guī)則集,由社區(qū)維護(hù)和更新。 它包含了大量的規(guī)則,用于屏蔽網(wǎng)頁(yè)上的廣告元素(如橫幅廣告、彈窗廣告、視頻廣告等)。 EasyList 是 AdBlock、AdBlock Plus 和其他廣告屏蔽工具(如 uBlock Origin)的基礎(chǔ)規(guī)則集。
那么猜測(cè)老的檢測(cè)方法失效應(yīng)該是EasyList規(guī)格有更新,順著這個(gè)思路又看看當(dāng)前已有的EasyList規(guī)則都有啥(文件有點(diǎn)大你忍一下??)?發(fā)現(xiàn)這個(gè)規(guī)則太多了,看的人眼花.....沒(méi)關(guān)系用DeepSeek幫忙分析??
EasyList里面隨便找到幾個(gè)簡(jiǎn)單的腳本規(guī)則??

舉例:
! *** easylist:easylist/easylist_general_block.txt ***
-ad-manager/$~stylesheet
-ad-sidebar.$image
.ads.controller.js$script
...
-
-ad-manager/$~stylesheet- 攔截路徑中包含
-ad-manager/的資源。 -
$~stylesheet表示排除樣式表(即不攔截樣式表)。 - 例如:
https://example.com/ad-manager/script.js會(huì)被攔截,但https://example.com/ad-manager/style.css不會(huì)被攔截。
- 攔截路徑中包含
-
-ad-sidebar.$image- 攔截路徑中包含
-ad-sidebar的圖片資源。 -
$image表示只攔截圖片。 - 例如:
https://example.com/ad-sidebar/banner.jpg會(huì)被攔截。
- 攔截路徑中包含
-
.ads.controller.js$script- 攔截路徑中包含 .ads.controller.js 的腳本資源。
- 例如:
https://example.com/ads.controller.js會(huì)被攔截。
攔截路徑中包含 .ads.controller.js 的腳本資源。
攔截路徑中包含 -ad-manager/和.ads.controller.js 的資源我們親測(cè)一下規(guī)則...
嘗試1(驗(yàn)證成功!-ad-manager/確實(shí)被AdBlock/AdBlock Plus攔截了)
<script>
var script = document.createElement('script');
script.src = './a-ad-manager/script.js'; // 本地隨便建一個(gè)測(cè)試路徑
script.onload = function() {
console.log('腳本加載成功');
};
script.onerror = function() {
console.log('腳本加載失敗,被AdBlock/AdBlock Plus攔截了'); // 驗(yàn)證成功
};
document.head.appendChild(script);
</script>
嘗試2(驗(yàn)證成功!.ads.controller.js也被AdBlock/AdBlock Plus攔截了)
<script>
var script = document.createElement('script');
script.src = './hahahaha.ads.controller.js'; // 本地隨便建一個(gè)測(cè)試路徑
script.onload = function() {
console.log('腳本加載成功');
};
script.onerror = function() {
console.log('腳本加載失敗,被AdBlock/AdBlock Plus攔截了'); // 驗(yàn)證成功
};
document.head.appendChild(script);
</script>
總結(jié)
驗(yàn)證成功
按照EasyList的默認(rèn)攔截規(guī)則反著來(lái),確實(shí)可以觸發(fā)被AdBlock/AdBlock Plus攔截,只要檢測(cè)對(duì)應(yīng)的文件是否加載成功就能確定是否被AdBlock/AdBlock Plus默認(rèn)規(guī)則攔截了。