Js如何判斷AdBlock/AdBlockPlus開(kāi)啟狀態(tài)

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)源的一些方法基本都試了都不行

1,f**kAdblock

2,adblockDetector

3,AdBlock Warning

4,AdGuard Detector

5,blockadblock

...

嘗試方法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ī)則??

jietu00003.png

舉例:

! *** easylist:easylist/easylist_general_block.txt ***
-ad-manager/$~stylesheet
-ad-sidebar.$image

.ads.controller.js$script
...
  1. -ad-manager/$~stylesheet

    • 攔截路徑中包含 -ad-manager/ 的資源。
    • $~stylesheet 表示排除樣式表(即不攔截樣式表)。
    • 例如:https://example.com/ad-manager/script.js 會(huì)被攔截,但 https://example.com/ad-manager/style.css 不會(huì)被攔截。
  2. -ad-sidebar.$image

    • 攔截路徑中包含 -ad-sidebar 的圖片資源。
    • $image 表示只攔截圖片。
    • 例如:https://example.com/ad-sidebar/banner.jpg 會(huì)被攔截。
  3. .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ī)則攔截了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 摘自Adblock Plus 撰寫 Adblock Plus 過(guò)濾規(guī)則AdBlock Plus 過(guò)濾規(guī)則介紹基本過(guò)...
    palmlove閱讀 12,329評(píng)論 0 5
  • 突然發(fā)現(xiàn)簡(jiǎn)書(shū)這個(gè)網(wǎng)站,可以發(fā)文章上去,挺不錯(cuò)的。試著寫一篇? Preface 我們每個(gè)人都是用戶,而用戶的活動(dòng)似乎...
    feicaixian閱讀 499評(píng)論 1 0
  • 縱觀歷史,從印刷世界到網(wǎng)絡(luò)世界,廣告一直伴隨著消費(fèi)者的發(fā)明和新媒體的興起。但是,網(wǎng)絡(luò)廣告世界帶來(lái)了一系列問(wèn)題,導(dǎo)致...
    西部小籠包閱讀 1,241評(píng)論 0 0
  • 啟用你鍵盤的菜單鍵 取代鼠標(biāo)右鍵 取代鼠標(biāo)右鍵喚出菜單選項(xiàng) 而且喚出的菜單可以用字母快速定位菜單項(xiàng) (鍵盤激活喚出...
    釋閑人閱讀 749評(píng)論 0 0
  • ADBlock的實(shí)現(xiàn)基于以下兩種情況進(jìn)行攔截: 1)對(duì)URL請(qǐng)求的攔截,這種URL廣告一般是網(wǎng)頁(yè)中div元...
    7c1fb13ff46d閱讀 11,122評(píng)論 1 1

友情鏈接更多精彩內(nèi)容