2009-07-26 94 views
13

我最近訪問了a site並注意到該網頁有一段說它注意到我正在使用AdBlocking軟件,我可以將它關閉以幫助支持這樣的小型網站。 我只是想知道你會怎麼做?客戶端還是服務器端最好?檢測AdBlocking軟件?

+8

我很當然,這只是客戶端... – luiscubal 2009-07-26 17:29:37

+0

其實,我認爲你可以以某種方式做它的服務器端。如果您知道哪個廣告塊**將被阻止,則不會由用戶加載。你可以知道它沒有被加載。但檢測它是一種相當昂貴的方式。 – 2014-08-30 01:37:09

回答

30

這一點是根本無法完成服務器端 - 有小人物的理由的人來敲你然後說「看看我,我有AdblockPlus!」。在客戶端,adblock正積極嘗試影響頁面內容,這是您可以看到的事情,並看到他們正在使用adblocker。

無論如何,我碰巧知道newgrounds.com也是這樣做的。 (他們的新佈局被搞砸了adblock加用戶 - 作爲迴應,他們做出了最好的比賽「如果你不打算幫助我們通過我們的廣告,去商店買東西」 - 板。

就讓我們來看看在newgrounds的消息人士告訴我,他們正在與一些簡單的JavaScript這樣 首先在文件中:

var user_is_leecher = true;

接下來還有一個外部腳本標籤:src=checkabp?thisistotrickabp=***adress of ad affilliate***

現在笑話:他們只是信任adblock plus來過濾scri pt,因爲所有這些都在:user_is_leecher = false;

從那裏,他們可以做任何事情。

2

我想有幾種方法可以做到這一點,但最簡單的方法可能是製作某種背景圖片或文字,這些圖片或文字在廣告加載時會被替換。因此,如果廣告被加載,您會看到廣告。如果廣告未加載,您會看到文字。

這個例子是客戶端,可以通過JavaScript完成,也可以只用普通的CSS來完成。

可能有一些服務器端的噱頭也可以做到這一點,但他們會不必要地複雜和笨重。想到的一種方法是在廣告客戶中包含某種API,可能會被問到「用戶是否從IP獲得了這樣的信息,並且這些信息會加載任何圖像?」並以這種方式得到答案。但我懷疑有這樣的服務 - 在客戶端做起來會容易得多。

3

你可以在服務器端通過配對html頁面和相關廣告的請求(可能爲每個請求使用一些唯一的標識符...)...但這只是一個想法,我從未嘗試過它甚至從未見過它被使用過。

3

我發現這部分的代碼,這似乎看起來他們是如何做:

/*MOOTOOLS*/ 
window.addEvent('domready', function(){ 

$$('.cat-item').each(function(el) { 
    var fx = new Fx.Morph(el,{ duration:300, link:'cancel' }); 
     el.addEvents({ 
     'mouseenter': function() { fx.start({ 'padding-left': 25 }); }, 
     'mouseleave': function() { fx.start({ 'padding-left': 15 }); } 
     }); 
    }); 

    if ($$(".google-sense468")[0] && $$(".google-sense468")[0].clientHeight == 0 && $('block-warning')) $('block-warning').setStyle('display','block'); 

}); 
/*MOOTOOLS END*/ 
1

我不認爲有一個簡單的方法來做到這一點。你可以做的是創造「陷阱」。讓一個php腳本聽一個非常明顯的url,比如yourdomain.com/ad.png。你可以通過url重寫來達到這個目的。如果此頁面已加載,您可以在會話變量中註明此信息併發送1x1空白PNG。

在下一個請求中,您可以看到ad.png是否已加載。如果沒有,您可以猜測客戶正在使用某種形式的AdBlock軟件。確保你設置了合適的http頭以防止客戶端緩存「ad.png」。

這是我目前唯一可以考慮的服務器端方法,它有一些缺陷。

  • PNG文件可以不管被緩存的HTTP標頭
  • 這不是第HTTP請求工作的
  • 一些額外的服務器負載爲瀏覽器將繼續把球擊ad.png爲每個請求
  • 該圖像會從服務器加載並不能保證它實際顯示
  • 可能更多的副作用,我都沒有想到的

如果你決定嘗試一下,請對這篇文章發表評論。

關於客戶端解決方案。這不應該是困難的。您可以創建一個小的Javascript來在頁面加載完成時運行。該腳本可以檢查頁面是否包含持有廣告的DOM節點。如果你在頁面加載完成時(不僅是dom),你可以檢查廣告圖片的寬度和高度。這種解決方案最明顯的缺點是客戶端可以禁用JavaScript。

+0

此方法的工作原理是,使用重寫規則最好使其不可緩存(例如/ adverts/.png),並指向一個腳本,該腳本將UNSETS預設會話變量並按預期方式提供圖像。在佈局的開始(在任何重要之前)做到這一點,並且您可以選擇其他地方的服務。作品(即使是第一次請求)。您必須選擇一條肯定會被抓住並移除的規則......精明的用戶也可以將您的廣告列入白名單,儘管源代碼中沒有任何內容可以表明他們應該這麼做! – 2012-02-01 01:15:40

1

這裏有幾個很好的答案,所以我就補充一點:

使用一些廣告管理系統(你可以寫你自己的)。通過這種方式,可以跟蹤每個正在顯示的廣告(並且明顯地表現出來,比如ads.php或showad.php或其他)。如果該腳本從未被調用過,則該用戶正在使用某種形式的廣告攔截軟件。

儘管如此,一定要處理通過該處理程序的每個廣告。 Mod_Rewrite不是必需的,它可以使用簡單的PHP來完成。

5

這裏提到的所有方法都依賴於廣告攔截器去掉代碼。這對於某些adblockers(例如Mac上的NetBarrier)無效。當adblockers趕上時,您還必須不斷更新您的代碼。

要檢測用戶是否阻止廣告,您只需在廣告javascript中找到一個函數並嘗試對其進行測試。使用什麼方法阻止廣告並不重要。下面是它看起來像谷歌的Adsense廣告:

if(typeof(window.google_render_ad)=="undefined") 
{ 
    //They're blocking ads, do something else. 
} 

此方法這裏概述:http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam

1

我相信比服務器端更容易做到這一點的客戶端。廣告攔截器安裝在客戶端上,因此他們可以操縱DOM並阻止Ajax請求。這就是爲什麼我認爲在客戶端比在服務器上檢測更有意義。

無論如何,這是檢測用戶啓用廣告攔截獨立簡單的插件,它是開源的和完整的代碼在GitHub上:

https://github.com/retargetly/mockingbird

它更注重讓他們可以輕鬆地顯示出版商廣告容器上或彈出式窗口中的消息。插件經常更新,值得一試。這是小提琴也:

http://jsfiddle.net/retargetly/9vsha32h/

你需要使用的唯一方法是

mockingbird.adsBlocked(Obj) 

呼叫可以在任何地方的代碼來完成,你並不需要jQuery來使其工作。

祝你好運!

0

,你能做些什麼來檢測在服務器端的adblocker被somithing像:

<?php 

    header('Content-Type: application/javascript'); 

    //Save it to session 
    session_start(); 
    $_SESSION['noAdblocker']=true; 

?> 

noAdblocker=true; 

保存此文件作爲ads.php

現在index.php

<?php 
    session_start(); 
    $_SESSION['noAdblocker']=false; 
?> 
<!DOCTYPE HTML><html><head> 
    <!-- Now place the "ad-script" --> 
    <script src="ads.php"></script> 
</head><body></body></html>