Ad Blocker detection AKA Adblock Plus

Après avoir parcouru Google et Stackoverflow pendant quelques heures, je n'ai pas trouvé de solution. Ce que j'essaie de faire, c'est détecter Adblock plus et afficher un message simple pour l'instant.

Ce que je veux faire, c'est détecter Adblock plus sans utiliser un fichier JavaScript ou jQuery. La plupart des scripts de détection adblock plus utilisent un fichier, exemple "show_ads.js" qui est hébergé sur son propre domaine avec une ligne dans pour le définir "adblock = false;"

Le problème avec l'utilisation d'un fichier JavaScript, les utilisateurs peuvent la liste blanche de ce fichier JavaScript et ne le détectera plus. Ce que je cherche, c'est un JavaScript qui se charge directement dans le code HTML qui détecterait si quelqu'un utilise un bloqueur d'annonces sans utiliser de fichier.

Exemple ci-dessous:

<script type="text/javascript"> // line of code that detects if using ad blocker if so display message </script> 

La raison de l'avoir fait de cette façon, aucun bloqueur d'annonces ne peut la liste blanche du fichier JavaScript sur votre serveur. Oui, je sais qu'il existe d'autres méthodes pour contourner cela avec des addons NoScript, mais j'ai déjà une solution pour cela. J'ai une excellente idée qui n'a jamais été essayée et que les bloqueurs d'annonces ne peuvent pas bloquer cela une fois que je l'ai terminé.

Toutes les suggestions et exemples seront grandement appréciés.

Vous n'avez pas besoin d'avoir un plugin pour détecter AdBlock, utilisez simplement ceci:

 <script type="text/javascript"> var adblock = true; </script> <script type="text/javascript" src="adframe.js"></script> <script type="text/javascript"> if(adblock) { //adblock is installed and enabled on this site :-D } </script> 

Contenu de adframe.js :

 adblock = false; 

Mise à jour: Adblock Plus bloque certaines requêtes ou masque certains éléments en fonction des modèles qu'il possède déjà. L'un de ces modèles est celui (dans patterns.ini ):

 [Filter] text=/adframe. hitCount=843 lastHit=1456391595626 

/adframe. bloque toute URL qui a /adframe. En elle.

Utilisez mon plugin "FuckAdBlock", il peut facilement détecter AdBlock: https://github.com/sitexw/FuckAdBlock

Exemple :

 fuckAdBlock.on(true, function() { alert('AdBlock detected !'); }).on(false, function() { alert('AdBlock is not detected =)'); }); 

Exemple en ligne: http://fuckadblock.sitexw.fr/

Si vous souhaitez afficher des annonces, même lorsque AdBlock est actif, vous devrez comprendre ce que AdBlock est capable de faire.

  1. AdBlock peut bloquer les ressources de chargement
  2. AdBlock peut cacher des éléments spécifiques dans le DOM.

Bien qu'il soit dit que AdBlock peut également modifier CSS, je ne peux trouver aucune documentation autre que la dissimulation et l'effondrement des éléments.


Alors, qu'est-ce que vous pourriez faire pour être plus intelligent que AdBlock?

Vous pouvez déguiser votre demande d'une manière telle qu'elle ne sera jamais «compatible» (p. Ex. http://domain.com/ae9a70e0a.png , où le nom de l'image sera aléatoire à chaque fois et sans préfixe commun). Pour autant que je sache, une règle dans AdBlock ne peut pas contenir de regex. Une règle ne correspondait ni aux annonces, ni à trop de ressources. Il serait possible de réécrire une telle URL sur le serveur pour indiquer votre annonce.

Toutefois, bien que AdBlock ne soit pas en mesure de bloquer la mise en charge de votre annonce, elle pourrait encore la cacher. Il n'y a pas de véritable façon de contourner cela. Il y aura toujours un sélecteur CSS intelligent qui choisira simplement votre élément. Vous pouvez cependant ajouter une image de fond avec du contenu. Ceci n'est pas utile pour une annonce (pas cliquable), mais peut vous aider à afficher un autre message. L'inconvénient est que si quelqu'un décide de bloquer cette image d'arrière-plan gênant, cela cachera votre contenu aussi.


En ce qui concerne un script, vous pourriez pouvoir charger l'annonce avec une requête ajax. Je suppose (mais je ne peux pas tester) qu'il donnera une erreur si la ressource n'a pas pu être chargée (car elle a été bloquée). ( $.ajax( request ).error( function() { ... } ); dans jQuery ou un équivalent en javascript régulier). Vous pourriez utiliser cela pour faire autre chose. Vous pouvez inclure cela dans le document lui-même, au lieu d'une ressource externe, afin de s'assurer qu'il sera toujours exécuté (si javascript est activé). Même alors, vous ne pouvez pas être sûr que «tout ce que vous ferez» sera jamais visible. En dernier recours, vous pouvez créer une window.alert( ... ) . Supposons que dans 3 pages, vos visiteurs ne reviendront jamais si vous utilisez cela.

D'une autre façon, je peux penser, c'est faire une connexion Web au serveur (cela ne peut pas être bloqué par AdBlock). Du côté du serveur, vous devrez examiner si les pages d'annonces ne sont pas chargées lorsqu'une page est chargée. Cette information peut être envoyée via le socket, qui peut être utilisé dans votre script pour faire 'quelque chose'. Ceci, cependant, semble être fou compliqué et représente un frais généraux importants pour «juste» un script qui détecte AdBlock.

Ce que j'ai vu sur le terrain utilise une image d'arrière-plan derrière l'annonce. Si adblock n'est pas actif, l'annonce sera affichée sur l'image d'arrière-plan (ce qui rend l'image de fond non visible). Si adblock est actif, l'annonce est bloquée, et l'utilisateur affichera plutôt l'image d'arrière-plan.

 <div id="ad-container"> <img src="../ad/ad.png" id="ad"> </div> 

Avec CSS:

 #ad-container { background-image: url( http://domain.com/pleasedonotuseadblocker.png ); height: 200px; width: 200px; } #ad { height: 200px; width: 200px; } 

Voici le code pour détecter Adblock. Vous pouvez apprendre comment le code fonctionne ici

 function detect() { //create a iframe. Append the iframe to the body. And then after 100ms check if their offsetHeight, display or visibility is set such a way that user cannot see them. //In the URL use the words specific to advertising so that Adblock can do string matching. var iframe = document.createElement("iframe"); iframe.height = "1px"; iframe.width = "1px"; iframe.id = "ads-text-iframe"; iframe.src = "http://domain.com/ads.html"; document.body.appendChild(iframe); setTimeout(function() { var iframe = document.getElementById("ads-text-iframe"); if(iframe.style.display == "none" || iframe.style.display == "hidden" || iframe.style.visibility == "hidden" || iframe.offsetHeight == 0) { alert("Adblock is blocking ads on this page"); iframe.remove(); } else { alert("Adblock is not detecting ads on this page"); iframe.remove(); } }, 100); } 

L'extrait suivant détecte tout à fait tous les bloqueurs d'annonces. Nécessite jQuery .

 (function(){ var bait = 'http://googleads.g.doubleclick.net/pagead/gen_204?id=wfocus&gqid=advertisment&advert=ads'; $.ajax({ url: bait, dataType: "script"}) .fail(function () { alert('ad blocked'); }) .abort(function () { alert('ad blocked'); }); })(); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

C'est une course aux armements, et je soutiens le droit de toute personne de bloquer les publicités, mais je soutiens également les sites Web qui dépendent des revenus publicitaires en essayant de convaincre les utilisateurs, ou peut-être les persuader de souscrire ou de faire un don pour compenser les revenus publicitaires perdus . Je n'approuve pas les sites essayant de forcer les utilisateurs à voir des publicités, mais un message polie est bien.

Quoi qu'il en soit, en ce moment, il convient de noter qu'il existe de nombreuses extensions / plugins adobrants, et ils peuvent tous avoir différentes façons de le faire, et il est parfois différent entre les systèmes d'exploitation et les navigateurs. J'ai trouvé que pour mes besoins en ce moment, ce sélecteur jQuery suffit pour voir si AdBlock ou AdBlockplus est utilisé, multiplate-forme, au moins Chrome et Firefox:

 if($("div[id^=google_ads_iframe_] iframe:visible").length == 0) { // pop up a message or whatever } 

Dans mon cas, ADB cachait le contenu, même s'il n'y avait pas d'annonces … (simplement parce que le mot ad était présent dans de nombreuses URL, car c'était la limace du type de publication …)

Mais j'ai remarqué qu'ils ne supprimaient pas le contenu, en appliquant simplement l'affichage: aucun sur le corps

Donc, en tant que solution supplémentaire,

Je viens de remarquer que l'application de l'affichage: bloc! Important; Au corps, empêche de cacher le contenu par Adblock plus

<body style="display: block !important;"> <img src="url-containg-ad-ads-word.jpg" alt="you should see this anyway" > </body>

Un simple appel Ajax fait le travail:

 var xmlhttp = new XMLHttpRequest() xmlhttp.onreadystatechange = function() { if( xmlhttp.readyState == XMLHttpRequest.DONE ){ if( xmlhttp.status !== 404 ){ console.log("Blocking ads") }else{ console.log("Not blocking ads") } } } xmlhttp.open("GET", "/498100ffe815d700cd838d1/ads/showad.js", true) xmlhttp.send() 

Ou encore mieux, sans surcharge HTTP supplémentaire:

 var adBlockTester = document.createElement('div'); adBlockTester.innerHTML = '&nbsp;'; adBlockTester.className = 'adsbox'; document.body.appendChild(adBlockTester); window.setTimeout(function() { if( adBlockTester.offsetHeight === 0 ){ console.log("Blocking ads") }else{ console.log("Not blocking ads") } adBlockTester.remove(); }, 60); 

J'ai trouvé l'un des meilleurs scripts si vous utilisez des publicités tierces.

Antiblock.org Disclaimer Je ne suis pas affilié à ce site de toute façon.

Cela fonctionnera pour la plupart des sites et s'ils veulent le contourner, ils devront ajouter leurs propres filtres (compliqués pour les utilisateurs normaux) ou contacter les filtres adblock et en ont ajouté, mais ils ont cessé de le faire car la liste est surchargée et ralentie Utilisateurs de blocs d'annonces.

Je sais que c'est un peu vieux, mais voici IMHO une meilleure façon de le faire:
Ajoutez ceci à votre section <head> :

 <script type="text/javascript"> window.onload = function() { var iframe = document.createElement('iframe'), randomDomain = Math.floor(Math.random() * (10000 - 100 + 1)) + 100, iframeLoaded = true; iframe.src = "http://"+ randomDomain +".com/ads.html"; iframe.height = ".1px"; iframe.width = ".1px"; iframe.id = 'some-ad'; iframe.onload = function() {iframeLoaded = false;}; document.body.appendChild(iframe); setTimeout(function() { var someAd = document.getElementById('some-ad'); if(!iframeLoaded || someAd == null || someAd.style.display == "none" || someAd.style.display == "hidden" || someAd.style.visibility == "hidden" || someAd.offsetHeight == 0) document.getElementById('ab-message').style.display = 'block'; someAd.remove(); }, 500); }; </script>`<br> 

Maintenant, vous pouvez utiliser l'identifiant ab-message où vous souhaitez afficher un message aux utilisateurs AdBlock:

 <div id="ab-message" style="display: none">Your message here!</div> 

Notez le style en ligne ajouté pour le cacher à l'origine (Bien sûr, vous pouvez également le faire à partir de votre propre fichier CSS).
Notez également qu'il faut 500 ms, c'est parce qu'il faut attendre que l'adblocker fasse son possible ou qu'il ne fonctionnera pas.

Une petite explication de la façon dont ce script fonctionne

Tout d'abord, il ajoute un iframe avec une source d'un lien généré au hasard. (Il est généré au hasard car certains blocs d'accès sont intelligents, à un moment donné, ils se rendent compte qu'un lien est faux).
Ensuite, il exécute plusieurs contrôles sur cet iframe (s'il a été chargé avec succès ou si son style a été modifié). Si l'un de ces tests est vrai, il affiche ensuite l'élément ab-message pour adbuter les utilisateurs.

Ce script fonctionne pour la plupart des bloqueurs d'annonces (sinon tous).

SUPPLÉMENTAIRE

Aucun point, en fait, aurait pu créer un gist mais, au lieu de cela, j'ai créé un projet Github, mais encore, vérifiez-le et regardez-le si cela vous a aidé.
AbDetector: Détecteur simple AdBlock de vanilla JavaScript.
Prendre plaisir.