搜索谷歌和#2几个小时后,我无法找到一个解决方案。我正在试图做的是检测Adblock Plus的和现在显示一个简单的消息。
我想要做的就是检测Adblock Plus的不使用JavaScript文件或jQuery的。他们使用文件大部分的Adblock加上检测脚本,即上有自己的域名与托管行如“show_ads.js中”它设置为“Adblock的= FALSE;”
使用JavaScript文件的问题,用户可以白名单的JavaScript文件,它将不再检测到它。我正在寻找的是直接加载到会,如果有人使用广告拦截器,而无需使用一个文件的检测HTML的脚本。
下面的例子:
<script type="text/javascript">
// line of code that detects if using ad blocker
if so display message
</script>
背后做这种方式没有任何的广告拦截器可以白名单JavaScript的服务器上的文件的原因。是的,我知道有避过这与NoScript的插件的其他方法,但是我已经有一个解决方案。我有一个从未尝试和广告拦截不能阻止这种一旦我用它做一个伟大的想法。
任何建议和实施例,将不胜感激。
你并不需要有一个插件Adblock的检测,只需使用:
<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>
adframe.js的内容:
adblock = false;
更新:Adblock Plus的块某些请求或隐藏基于它已经具有一定的图案元素。其中一个模式是这样的(在patterns.ini):
[Filter]
text=/adframe.
hitCount=843
lastHit=1456391595626
该块有/adframe.
在任何URL。
更新2018年8月25日
Adblock Plus的改变它找到的列表,并阻止广告的方式。它有一堆所谓的订阅列出了用于阻断。例如,这一个是默认的:
https://easylist-downloads.adblockplus.org/easylist.txt
您可以使用此文件的规则来查找使用的文件名。例如,你可以使用搜索引擎优化ads.js
P.S开发商:出于某种原因,我不能让ABP阻止对当地环境的这些文件。
P.S:ABP是我最喜欢的广告拦截:-D
我发现,最聪明和最简单的方法是:
1)在你的标记可能在上面添加上这个地方的代码html
。
<div id="bait" class="pub_300x250" style="color: #fff">.</div>
一般广告拦截检测如在Easylist提到和阻止它们,这是由“诱饵”触发的(pub_300x250)广告尺寸。
2)再加入这个js代码到你的脚本文件。
if (document.getElementById("bait").offsetHeight === 0) {
// function code or alert (whatever) here.
alert("Ad-Blocker DETECTED");
}
我们的脚本检测,如果这块标记的是当前html
通过检查thorugh“诱饵”的ID存在。
这对我的作品与Adblock
,AdBlock-Plus
&uBlock Origin
对每个浏览器的每一个网站。
在我的情况下,亚行的藏身之内容甚至没有广告。(只是因为ad
词是存在于许多的网址,因为它是柱式塞..)
但我注意到,他们没有删除该内容,只是申请显示:没有对身体
因此,作为一个额外的解决方案,
我只注意到应用显示:块重要;以德体,防止通过隐藏Adblock Plus的内容
<body style="display: block !important;">
<img src="url-containg-ad-ads-word.jpg" alt="you should see this anyway" >
</body>
这是一场军备竞赛,这是肯定的,我支持任何人的阻止广告的权利,但我也支持依赖于广告收入试图否则说服用户,或者说服他们订阅或进行捐款,以弥补失去的广告收入的网站。我不赞成试图强迫用户看广告的网站,而是一个礼貌的消息是好的。
不管怎么说,现在它值得注意的是,有许多广告拦截扩展/插件,它们都可以有这样做的不同的方法,而且有时候是操作系统和浏览器之间也不同。我发现,我的目的,现在,这个jQuery选择足以至少看是否正在使用的AdBlock或AdBlockplus,跨平台,跨至少Chrome和Firefox:
if($("div[id^=google_ads_iframe_] iframe:visible").length == 0) {
// pop up a message or whatever
}
这里是处理它(无iframe中,没有jQuery的)一个简单的方法:
var elem = document.createElement('div');
elem.className = 'adclass';
document.body.appendChild(elem);
window.setTimeout(function () {
var isAdblockEnabled = !(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
if (isAdblockEnabled) {
// Adblock is enabled
}
}, 0);
我知道这是有点老了,但这里恕我直言更好的方式来做到这一点:
添加到您的<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>
现在,无论你想显示一条消息给用户的AdBlock可以使用ab-message
ID:
<div id="ab-message" style="display: none">Your message here!</div>
注意内嵌样式加入到原本隐藏它(当然,你也可以做到这一点从自己的CSS文件)。 另外请注意,它需要500毫秒,这是因为它必须等待adblocker做它的事,否则将无法正常工作。
首先,它追加用随机生成的链接的源的iframe中。 (这是随机生成的,因为一些adblocks是聪明的,在某些时候,他们意识到一个链接是假的)。
然后,它可以运行在多个iframe的检查(如果它被成功加载,或者如果它的样式进行了修改)。如果这些测试中有一个为真,则它会显示ab-message
元素Adblock的用户。
该脚本适用于大多数(如果不是全部)广告拦截。
没有意义的,真的,本来就创建了一个要点,而是我创建了一个Github的项目,不过,检查出来,明星,如果它帮助你。 abDetector: Simple vanilla JavaScript AdBlock Detector. 请享用。
我已经找到了最好的剧本之一,如果你使用第三方的广告。
antiblock.org免责声明我不是这个网站隶属于反正。
它将为大多数网站工作,如果他们想绕过它,他们将不得不增加自己的过滤器(复杂,普通用户)或接触Adblock的过滤器,并有一个补充,但他们不干这样做会导致列表越来越过载和减缓广告块的用户。
使用我的插件“FuckAdBlock”,它可以很容易检测的AdBlock:https://github.com/sitexw/FuckAdBlock
例如:
fuckAdBlock.on(true, function() {
alert('AdBlock detected !');
}).on(false, function() {
alert('AdBlock is not detected =)');
});
我已经看到了在该领域使用的广告后面的背景图像。如果Adblock的是不活动的,则广告将在背景图像被显示(使背景图像不可见)。如果Adblock的是活动的,广告被屏蔽,用户会看到,而不是背景图片。
<div id="ad-container">
<img src="../ad/ad.png" id="ad">
</div>
使用CSS:
#ad-container {
background-image: url( http://domain.com/pleasedonotuseadblocker.png );
height: 200px;
width: 200px;
}
#ad {
height: 200px;
width: 200px;
}
如果您希望广告展示,即使是的AdBlock活跃,你必须明白的AdBlock能够做到。
虽然说的AdBlock还可以修改CSS,我再也找不到比隐藏和折叠的元素上的其他任何文件。
那么究竟你能不能做到比的AdBlock“聪明”?
你可以伪装的方式,它永远不会是“可匹配”(例如http://domain.com/ae9a70e0a.png
中,当图像名称将是随机的,每次和没有共同的前缀)您的要求。据我所知,在广告拦截规则不能包含一个正则表达式。规则要么不相匹配的广告,或太多的资源。这将有可能改写服务器上的这样一个URL指向您的广告。
然而,虽然广告拦截可能无法阻止加载广告,它可能仍然可以将其隐藏。还有就是解决这个打算没有真正的方法。总会有一个聪明的CSS选择器,将-just-选择你的元素。但是,您可以用内容添加背景图像。这不是一个广告(不点击)是有用的,但可能会帮助您显示其他信息。缺点是,如果有人决定,以阻止恼人的背景图片,它会隐藏自己的内容了。
至于脚本的话,你也许可以用一个Ajax请求加载广告。我想,(但不能测试),如果资源无法加载它会给一个错误(因为它被阻止)。 ($.ajax( request ).error( function() { ... } );
jQuery中或在常规的JavaScript一些当量)。你可以用它来做些别的事情。你可以包括文档本身,而不是外部资源中,以确保它会一直运行(如果启动Javascript)。即使这样,你也不能肯定这是你做其他'将永远不会明显显示出来。作为最后的手段,你可以做一个window.alert( ... )
。假设3页内,您的访客将永远不会回来,如果你使用它。
另一办法,我能想到的,正在作出的WebSocket服务器(据我所知这不能用的AdBlock被阻止)。在服务器端,您需要检查是否在加载某些页面没有加载广告页面。这些信息可以通过插槽,它可以在你的脚本可以用来做“东西”进行发送。然而,这听起来很疯狂复杂,是“只是”一个检测的AdBlock脚本显著的开销。
一个简单的Ajax调用这项工作:
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()
甚至更好,而无需额外的HTTP开销:
var adBlockTester = document.createElement('div');
adBlockTester.innerHTML = ' ';
adBlockTester.className = 'adsbox';
document.body.appendChild(adBlockTester);
window.setTimeout(function() {
if( adBlockTester.offsetHeight === 0 ){
console.log("Blocking ads")
}else{
console.log("Not blocking ads")
}
document.body.removeChild(adBlockTester);
}, 60);
这里是检测Adblock的代码。你可以学习的代码是如何工作here
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);
}
下面的代码片段将几乎检测所有广告拦截。需要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>
它包裹在一个自动执行的匿名函数,因此不会与网站上的其他增值经销商或代码干扰。
该bait
采用了最流行的广告服务网络(谷歌的双击),并包括由easylist和其他人使用其他一些查询参数。
该fail()
和abort()
方法都需要,但只有一个或另一个将被调用。
不要把adblocker.js
或类似的代码,因为这些类型的文件名本身加载阻止得到。内联,或包括它在随机/任意文件名或在你的主站点JS文件结合起来。
简单的JavaScript / jQuery的检测是很好地工作:
$('body').append('<div id="ad-container" style="position:absolute;"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=" id="ad"></div>');
var ad_container = $('body').children('#ad-container');
if(!ad_container.is(":visible")) {
// Add your warning and/or adblock detection logic here.
}
ad_container.remove();
对我来说没有任何技巧的工作,可这是我做错了。但这是为实现谷歌广告的一个非常具体的方式。
window.onload = function() {
if (document.getElementsByClassName('google-auto-placed').length == 0){
// Adblock Detected
}
}
如果您有其他的广告系统,如亚马逊,通过检查页面寻找他们一般类的名字/ IDS。
如果您正打算将此代码放在单独的js文件,确保文件名没有“广告”这个词在里面。只是它命名为magic.js
如果谷歌曾经决定改变div名称,这种方法会失败。但是这似乎不太可能。