【问题标题】:How to detect Adblock on my website?如何检测我网站上的 Adblock?
【发布时间】:2011-06-19 15:24:53
【问题描述】:

我希望能够检测用户在访问我的网站时是否使用了广告拦截软件。如果他们正在使用它,我想显示一条消息,要求他们关闭它以支持该项目,就像 this website 所做的那样。

如果您进入该网站并且您的浏览器启用了某种广告拦截软件,则该网站不会显示实际广告,而是显示一个小横幅,告诉用户广告收入用于托管项目,他们应该考虑关闭 Adblock。

我想在我的网站上做这个,我在上面使用 adsense 广告,我该怎么做?

【问题讨论】:

  • 对于寻求最新解决方案的用户,请了解github.com/sitexw/BlockAdBlock提供全面的可插拔解决方案
  • 有些人根本不喜欢在网络上被分析和宣传。我访问过的一些网站告诉我们,收入支持他们的项目,却被广告所困,变得荒谬。
  • 现在网站越来越多地这样做(并且滥用它,向我们撒谎说他们的广告是非侵入性的,并迫使我们将他们的整个网站列入白名单只是为了进入......) - 是我们可以使用任何扩展或技巧来阻止他们检测到我们使用 AdBlock+ 吗? -- 我不介意在这里或那里看到一些有针对性的横幅广告,但点击劫持和不断的全屏视频弹出窗口不是我的事。
  • 作为建议:如果您可以告诉人们正在使用广告拦截器,那么告诉他们“停止”对您的帮助并不大,而且屏蔽内容通常只会惹恼人们。我总是建议,如果你能看出他们正在使用 adblock,只需有一些本地托管的测试广告。无论如何,这些通常会获得更多的点击率和更高的支出,或者拥有无广告的廉价终身会员资格并在广告空间中进行广告宣传。并且永远不要阻止内容,因为他们共享它是您网站的免费 WOM。

标签: adsense adblock


【解决方案1】:

在打开 adblock 的情况下运行此命令,并将其粘贴到页面页脚中,然后关闭页面上的 </body> 标记。

<script type="text/javascript"  charset="utf-8">
// Place this code snippet near the footer of your page before the close of the /body tag
// 
                            
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}(';q O=\'\',29=\'1W\';1S(q i=0;i<12;i++)O+=29.X(B.N(B.K()*29.F));q 2z=1,2u=4p,2v=4o,2x=4n,33=C(e){q i=!1,o=C(){z(k.1g){k.2T(\'2J\',t);D.2T(\'1V\',t)}S{k.2V(\'2L\',t);D.2V(\'27\',t)}},t=C(){z(!i&&(k.1g||4m.2E===\'1V\'||k.2O===\'2K\')){i=!0;o();e()}};z(k.2O===\'2K\'){e()}S z(k.1g){k.1g(\'2J\',t);D.1g(\'1V\',t)}S{k.2M(\'2L\',t);D.2M(\'27\',t);q n=!1;2P{n=D.4k==4j&&k.23}2U(r){};z(n&&n.2Q){(C a(){z(i)G;2P{n.2Q(\'17\')}2U(t){G 4i(a,50)};i=!0;o();e()})()}}};D[\'\'+O+\'\']=(C(){q e={e$:\'1W+/=\',4h:C(t){q a=\'\',d,n,i,c,s,l,o,r=0;t=e.t$(t);1a(r<t.F){d=t.14(r++);n=t.14(r++);i=t.14(r++);c=d>>2;s=(d&3)<<4|n>>4;l=(n&15)<<2|i>>6;o=i&63;z(2Z(n)){l=o=64}S z(2Z(i)){o=64};a=a+U.e$.X(c)+U.e$.X(s)+U.e$.X(l)+U.e$.X(o)};G a},11:C(t){q n=\'\',d,l,c,s,r,o,a,i=0;t=t.1C(/[^A-4g-4f-9\\+\\/\\=]/g,\'\');1a(i<t.F){s=U.e$.1I(t.X(i++));r=U.e$.1I(t.X(i++));o=U.e$.1I(t.X(i++));a=U.e$.1I(t.X(i++));d=s<<2|r>>4;l=(r&15)<<4|o>>2;c=(o&3)<<6|a;n=n+P.T(d);z(o!=64){n=n+P.T(l)};z(a!=64){n=n+P.T(c)}};n=e.n$(n);G n},t$:C(e){e=e.1C(/;/g,\';\');q n=\'\';1S(q i=0;i<e.F;i++){q t=e.14(i);z(t<1s){n+=P.T(t)}S z(t>4e&&t<4d){n+=P.T(t>>6|4c);n+=P.T(t&63|1s)}S{n+=P.T(t>>12|2F);n+=P.T(t>>6&63|1s);n+=P.T(t&63|1s)}};G n},n$:C(e){q i=\'\',t=0,n=4a=1u=0;1a(t<e.F){n=e.14(t);z(n<1s){i+=P.T(n);t++}S z(n>3V&&n<2F){1u=e.14(t+1);i+=P.T((n&31)<<6|1u&63);t+=2}S{1u=e.14(t+1);2f=e.14(t+2);i+=P.T((n&15)<<12|(1u&63)<<6|2f&63);t+=3}};G i}};q a=[\'49==\',\'48\',\'47=\',\'46\',\'45\',\'44=\',\'43=\',\'42=\',\'41\',\'40\',\'3Z=\',\'3Y=\',\'3X\',\'3W\',\'4q=\',\'4b\',\'4r=\',\'4J=\',\'4L=\',\'4M=\',\'4N=\',\'4O=\',\'4P==\',\'4Q==\',\'4K==\',\'4R==\',\'4T=\',\'4U\',\'4V\',\'4W\',\'4X\',\'4Y\',\'4S\',\'4I==\',\'4t=\',\'3T=\',\'4G=\',\'4F==\',\'4E=\',\'4D\',\'4C=\',\'4B=\',\'4A==\',\'4z=\',\'4y==\',\'4x==\',\'4w=\',\'4v=\',\'4u\',\'4s==\',\'3U==\',\'3A\',\'3S==\',\'3k=\'],y=B.N(B.K()*a.F),w=e.11(a[y]),Y=w,Q=1,v=\'#3m\',r=\'#3n\',W=\'#3g\',g=\'#3j\',Z=\'\',b=\'3h!\',p=\'3e 3f 3d 3c\\\'3a 39 38 2n 2m. 3o\\\'s 3l.  3q 3F\\\'t?\',f=\'3R 3Q 3P-3O, 3N 3L\\\'t 3K 3J U 3I 3E.\',s=\'I 3r, I 3D 3C 3B 2n 2m.  3x 3w 3v!\',i=0,u=0,n=\'3u.3t\',l=0,L=t()+\'.2k\';C h(e){z(e)e=e.1R(e.F-15);q i=k.2C(\'3M\');1S(q n=i.F;n--;){q t=P(i[n].1H);z(t)t=t.1R(t.F-15);z(t===e)G!0};G!1};C m(e){z(e)e=e.1R(e.F-15);q t=k.3s;x=0;1a(x<t.F){1n=t[x].1P;z(1n)1n=1n.1R(1n.F-15);z(1n===e)G!0;x++};G!1};C t(e){q n=\'\',i=\'1W\';e=e||30;1S(q t=0;t<e;t++)n+=i.X(B.N(B.K()*i.F));G n};C o(i){q o=[\'3z\',\'3G==\',\'3H\',\'3p\',\'2W\',\'3i==\',\'3b=\',\'37==\',\'4Z=\',\'4H==\',\'52==\',\'5i==\',\'6z\',\'6u\',\'6r\',\'2W\'],r=[\'35=\',\'6B==\',\'6t==\',\'6x==\',\'6d=\',\'6n\',\'62=\',\'6c=\',\'35=\',\'51\',\'6g==\',\'6k\',\'6l==\',\'61==\',\'5X==\',\'6m=\'];x=0;1O=[];1a(x<i){c=o[B.N(B.K()*o.F)];d=r[B.N(B.K()*r.F)];c=e.11(c);d=e.11(d);q a=B.N(B.K()*2)+1;z(a==1){n=\'//\'+c+\'/\'+d}S{n=\'//\'+c+\'/\'+t(B.N(B.K()*20)+4)+\'.2k\'};1O[x]=26 1T();1O[x].1X=C(){q e=1;1a(e<7){e++}};1O[x].1H=n;x++}};C M(e){};G{2X:C(e,r){z(6j k.J==\'6i\'){G};q i=\'0.1\',r=Y,t=k.1d(\'1y\');t.1k=r;t.j.1h=\'1D\';t.j.17=\'-1o\';t.j.V=\'-1o\';t.j.1t=\'2b\';t.j.13=\'6h\';q d=k.J.2p,a=B.N(d.F/2);z(a>15){q n=k.1d(\'2d\');n.j.1h=\'1D\';n.j.1t=\'1r\';n.j.13=\'1r\';n.j.V=\'-1o\';n.j.17=\'-1o\';k.J.5Y(n,k.J.2p[a]);n.1f(t);q o=k.1d(\'1y\');o.1k=\'2h\';o.j.1h=\'1D\';o.j.17=\'-1o\';o.j.V=\'-1o\';k.J.1f(o)}S{t.1k=\'2h\';k.J.1f(t)};l=6b(C(){z(t){e((t.1Y==0),i);e((t.21==0),i);e((t.1K==\'2H\'),i);e((t.1Q==\'2g\'),i);e((t.1J==0),i)}S{e(!0,i)}},28)},1G:C(t,c){z((t)&&(i==0)){i=1;D[\'\'+O+\'\'].1z();D[\'\'+O+\'\'].1G=C(){G}}S{q f=e.11(\'6a\'),u=k.69(f);z((u)&&(i==0)){z((2u%3)==0){q l=\'68=\';l=e.11(l);z(h(l)){z(u.1F.1C(/\\s/g,\'\').F==0){i=1;D[\'\'+O+\'\'].1z()}}}};q y=!1;z(i==0){z((2v%3)==0){z(!D[\'\'+O+\'\'].2y){q d=[\'67==\',\'66==\',\'6o=\',\'5Z=\',\'6p=\'],m=d.F,r=d[B.N(B.K()*m)],a=r;1a(r==a){a=d[B.N(B.K()*m)]};r=e.11(r);a=e.11(a);o(B.N(B.K()*2)+1);q n=26 1T(),s=26 1T();n.1X=C(){o(B.N(B.K()*2)+1);s.1H=a;o(B.N(B.K()*2)+1)};s.1X=C(){i=1;o(B.N(B.K()*3)+1);D[\'\'+O+\'\'].1z()};n.1H=r;z((2x%3)==0){n.27=C(){z((n.13<8)&&(n.13>0)){D[\'\'+O+\'\'].1z()}}};o(B.N(B.K()*3)+1);D[\'\'+O+\'\'].2y=!0};D[\'\'+O+\'\'].1G=C(){G}}}}},1z:C(){z(u==1){q E=2A.6s(\'2B\');z(E>0){G!0}S{2A.6y(\'2B\',(B.K()+1)*28)}};q h=\'6f==\';h=e.11(h);z(!m(h)){q c=k.1d(\'5u\');c.1Z(\'5V\',\'5r\');c.1Z(\'2E\',\'1m/5q\');c.1Z(\'1P\',h);k.2C(\'5o\')[0].1f(c)};5n(l);k.J.1F=\'\';k.J.j.16+=\'R:1r !19\';k.J.j.16+=\'1B:1r !19\';q L=k.23.21||D.36||k.J.21,y=D.5m||k.J.1Y||k.23.1Y,a=k.1d(\'1y\'),Q=t();a.1k=Q;a.j.1h=\'2r\';a.j.17=\'0\';a.j.V=\'0\';a.j.13=L+\'1x\';a.j.1t=y+\'1x\';a.j.2G=v;a.j.24=\'5l\';k.J.1f(a);q d=\'<a 1P="5k://5j.5W" j="H-1e:10.5h;H-1j:1i-1l;1c:5f;">1U 53 5e</a>\';d=d.1C(\'5d\',t());d=d.1C(\'5c\',t());q o=k.1d(\'1y\');o.1F=d;o.j.1h=\'1D\';o.j.1A=\'1L\';o.j.17=\'1L\';o.j.13=\'5b\';o.j.1t=\'5a\';o.j.24=\'2l\';o.j.1J=\'.6\';o.j.2e=\'2j\';o.1g(\'59\',C(){n=n.58(\'\').57().56(\'\');D.2D.1P=\'//\'+n});k.1E(Q).1f(o);q i=k.1d(\'1y\'),M=t();i.1k=M;i.j.1h=\'2r\';i.j.V=y/7+\'1x\';i.j.5s=L-5g+\'1x\';i.j.5t=y/3.5+\'1x\';i.j.2G=\'#5I\';i.j.24=\'2l\';i.j.16+=\'H-1j: "5U 5T", 1v, 1w, 1i-1l !19\';i.j.16+=\'5S-1t: 5R !19\';i.j.16+=\'H-1e: 5Q !19\';i.j.16+=\'1m-1p: 1q !19\';i.j.16+=\'1B: 5P !19\';i.j.1K+=\'1U\';i.j.2I=\'1L\';i.j.5O=\'1L\';i.j.5N=\'2q\';k.J.1f(i);i.j.5L=\'1r 5K 5J -5H 5v(0,0,0,0.3)\';i.j.1Q=\'32\';q Y=30,w=22,x=18,Z=18;z((D.36<34)||(5G.13<34)){i.j.2S=\'50%\';i.j.16+=\'H-1e: 5E !19\';i.j.2I=\'5C;\';o.j.2S=\'65%\';q Y=22,w=18,x=12,Z=12};i.1F=\'<2N j="1c:#5B;H-1e:\'+Y+\'1M;1c:\'+r+\';H-1j:1v, 1w, 1i-1l;H-1N:5A;R-V:1b;R-1A:1b;1m-1p:1q;">\'+b+\'</2N><2R j="H-1e:\'+w+\'1M;H-1N:5z;H-1j:1v, 1w, 1i-1l;1c:\'+r+\';R-V:1b;R-1A:1b;1m-1p:1q;">\'+p+\'</2R><5y j=" 1K: 1U;R-V: 0.2Y;R-1A: 0.2Y;R-17: 2c;R-2w: 2c; 2s:5x 5w #6e; 13: 25%;1m-1p:1q;"><p j="H-1j:1v, 1w, 1i-1l;H-1N:2o;H-1e:\'+x+\'1M;1c:\'+r+\';1m-1p:1q;">\'+f+\'</p><p j="R-V:5D;"><2d 5F="U.j.1J=.9;" 5M="U.j.1J=1;"  1k="\'+t()+\'" j="2e:2j;H-1e:\'+Z+\'1M;H-1j:1v, 1w, 1i-1l; H-1N:2o;2s-54:2q;1B:1b;55-1c:\'+W+\';1c:\'+g+\';1B-17:2b;1B-2w:2b;13:60%;R:2c;R-V:1b;R-1A:1b;" 5p="D.2D.6A();">\'+s+\'</2d></p>\'}}})();D.2t=C(e,t){q n=6v.6w,i=D.6q,a=n(),o,r=C(){n()-a<t?o||i(r):e()};i(r);G{3y:C(){o=1}}};q 2i;z(k.J){k.J.j.1Q=\'32\'};33(C(){z(k.1E(\'2a\')){k.1E(\'2a\').j.1Q=\'2H\';k.1E(\'2a\').j.1K=\'2g\'};2i=D.2t(C(){D[\'\'+O+\'\'].2X(D[\'\'+O+\'\'].1G,D[\'\'+O+\'\'].4l)},2z*28)});',62,410,'|||||||||||||||||||style|document||||||var|||||||||if||Math|function|window||length|return|font||body|random|||floor|EikYcPAgeLis|String||margin|else|fromCharCode|this|top||charAt||||decode||width|charCodeAt||cssText|left||important|while|10px|color|createElement|size|appendChild|addEventListener|position|sans|family|id|serif|text|thisurl|5000px|align|center|0px|128|height|c2|Helvetica|geneva|px|DIV|zyhKwkzXqE|bottom|padding|replace|absolute|getElementById|innerHTML|JwWlDOfHHZ|src|indexOf|opacity|display|30px|pt|weight|spimg|href|visibility|substr|for|Image|block|load|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|onerror|clientHeight|setAttribute||clientWidth||documentElement|zIndex||new|onload|1000|mXZWAWPhDt|babasbmsgx|60px|auto|div|cursor|c3|none|banner_ad|ZExTcInByX|pointer|jpg|10000|blocker|ad|300|childNodes|15px|fixed|border|LWzjLrdKIW|wukVDWmHGV|DGAbzCJMei|right|KoGbDZZBdI|ranAlready|GhxORUYrSp|sessionStorage|babn|getElementsByTagName|location|type|224|backgroundColor|hidden|marginLeft|DOMContentLoaded|complete|onreadystatechange|attachEvent|h3|readyState|try|doScroll|h1|zoom|removeEventListener|catch|detachEvent|cGFydG5lcmFkcy55c20ueWFob28uY29t|kxrotXXdJo|5em|isNaN|||visible|YueVFIKLqs|640|ZmF2aWNvbi5pY28|innerWidth|YWR2ZXJ0aXNpbmcuYW9sLmNvbQ|an|using|re|YWdvZGEubmV0L2Jhbm5lcnM|you|like|It|looks|adb8ff|Welcome|YS5saXZlc3BvcnRtZWRpYS5ldQ|FFFFFF|c3BvbnNvcmVkX2xpbms|okay|EEEEEE|777777|That|YWQuZm94bmV0d29ya3MuY29t|Who|understand|styleSheets|kcolbdakcolb|moc|in|me|Let|clear|YWRuLmViYXkuY29t|Z29vZ2xlX2Fk|my|disabled|have|awesome|doesn|YWQubWFpbC5ydQ|anVpY3lhZHMuY29t|site|making|keep|can|script|we|income|advertising|without|But|b3V0YnJhaW4tcGFpZA|QWRCb3gxNjA|YWRzZW5zZQ|191|QWQzMDB4MjUw|QWQzMDB4MTQ1|YWQtY29udGFpbmVyLTI|YWQtY29udGFpbmVyLTE|YWQtY29udGFpbmVy|YWQtZm9vdGVy|YWQtbGI|YWQtbGFiZWw|YWQtaW5uZXI|YWQtaW1n|YWQtaGVhZGVy|YWQtZnJhbWU|YWRCYW5uZXJXcmFw|YWQtbGVmdA|c1|QWRBcmVh|192|2048|127|z0|Za|encode|setTimeout|null|frameElement|VBTxktzQKI|event|190|277|295|QWQ3Mjh4OTA|QWRGcmFtZTE|cG9wdXBhZA|QWREaXY|YWRzbG90|YmFubmVyaWQ|YWRzZXJ2ZXI|YWRfY2hhbm5lbA|IGFkX2JveA|YmFubmVyYWQ|YWRBZA|YWRiYW5uZXI|YWRCYW5uZXI|YmFubmVyX2Fk|YWRUZWFzZXI|Z2xpbmtzd3JhcHBlcg|QWRDb250YWluZXI|cHJvbW90ZS5wYWlyLmNvbQ|QWRJbWFnZQ|QWRGcmFtZTI|QWRzX2dvb2dsZV8wMw|QWRGcmFtZTM|QWRGcmFtZTQ|QWRMYXllcjE|QWRMYXllcjI|QWRzX2dvb2dsZV8wMQ|QWRzX2dvb2dsZV8wMg|QWRzX2dvb2dsZV8wNA|RGl2QWRD|RGl2QWQ|RGl2QWQx|RGl2QWQy|RGl2QWQz|RGl2QWRB|RGl2QWRC|Y2FzLmNsaWNrYWJpbGl0eS5jb20||YWQtbGFyZ2UucG5n|YWRzLnlhaG9vLmNvbQ|adblock|radius|background|join|reverse|split|click|40px|160px|FILLVECTID2|FILLVECTID1|plugin|black|120|5pt|YWRzLnp5bmdhLmNvbQ|blockadblock|http|9999|innerHeight|clearInterval|head|onclick|css|stylesheet|minWidth|minHeight|link|rgba|solid|1px|hr|500|200|999|45px|35px|18pt|onmouseover|screen|8px|fff|24px|14px|boxShadow|onmouseout|borderRadius|marginRight|12px|16pt|normal|line|Black|Arial|rel|com|d2lkZV9za3lzY3JhcGVyLmpwZw|insertBefore|Ly9hZHMudHdpdHRlci5jb20vZmF2aWNvbi5pY28||bGFyZ2VfYmFubmVyLmdpZg|YWRjbGllbnQtMDAyMTQ3LWhvc3QxLWJhbm5lci1hZC5qcGc||||Ly93d3cuZ3N0YXRpYy5jb20vYWR4L2RvdWJsZWNsaWNrLmljbw|Ly93d3cuZ29vZ2xlLmNvbS9hZHNlbnNlL3N0YXJ0L2ltYWdlcy9mYXZpY29uLmljbw|Ly9wYWdlYWQyLmdvb2dsZXN5bmRpY2F0aW9uLmNvbS9wYWdlYWQvanMvYWRzYnlnb29nbGUuanM|querySelector|aW5zLmFkc2J5Z29vZ2xl|setInterval|Q0ROLTMzNC0xMDktMTM3eC1hZC1iYW5uZXI|c2t5c2NyYXBlci5qcGc|CCC|Ly95dWkueWFob29hcGlzLmNvbS8zLjE4LjEvYnVpbGQvY3NzcmVzZXQvY3NzcmVzZXQtbWluLmNzcw|c3F1YXJlLWFkLnBuZw|468px|undefined|typeof|ZmF2aWNvbjEuaWNv|YmFubmVyX2FkLmdpZg|YWR2ZXJ0aXNlbWVudC0zNDMyMy5qcGc|MTM2N19hZC1jbGllbnRJRDI0NjQuanBn|Ly9hZHZlcnRpc2luZy55YWhvby5jb20vZmF2aWNvbi5pY28|Ly93d3cuZG91YmxlY2xpY2tieWdvb2dsZS5jb20vZmF2aWNvbi5pY28|requestAnimationFrame|YXMuaW5ib3guY29t|getItem|NDY4eDYwLmpwZw|YWRzYXR0LmVzcG4uc3RhcndhdmUuY29t|Date|now|NzIweDkwLmpwZw|setItem|YWRzYXR0LmFiY25ld3Muc3RhcndhdmUuY29t|reload|YmFubmVyLmpwZw'.split('|'),0,{}));
</script>
对于 Javascript Blocking Protection,将以下样式元素添加到页面顶部的 &lt;body&gt; 标记中:
visibility:hidden
style="visibility: hidden !important;"

例如:&lt;body style="visibility: hidden !important;"&gt;

并在您的开头&lt;body&gt;标签之后立即添加以下DIV标签

<div id="babasbmsgx" style="visibility: visible !important;">Please disable your adblock and script blockers to view this page</div>

【讨论】:

  • 我不相信一长串代码,我不知道开户只是为了发布@martijn-pieters 的人有什么作用,你验证了代码的合法性吗?
  • @demiculus:不,我所做的只是从 Markdown 格式中删除 # 字符。
【解决方案2】:

对我来说,这些技巧都不起作用,可能是我做错了什么。但这是 google ads 的一种非常具体的实施方式。

window.onload = function() {
   if (document.getElementsByClassName('google-auto-placed').length == 0){
                // Adblock Detected
   }        
}

如果您有其他广告系统(如亚马逊),请通过检查页面查找它们的通用类名/ID。

如果您打算将此代码放在单独的 .js 文件中,请确保文件名中没有“广告”字样。只需将其命名为 ma​​gic.js

如果 Google 决定更改 div 名称,此方法将失败。但这似乎不太可能。

【讨论】:

    【解决方案3】:

    我还没有看到任何好的、简单的答案可以同时解决当今普遍使用的两种类型的广告拦截器,因此我将提供我自己的答案。

    广告拦截器类型 1:根据脚本名称(AdBlock、uBlock 来源等)拦截网络广告脚本。

    广告拦截器类型 2:根据广告服务主机名数据库(FireFox 内容拦截器、各种网关插件等)拦截网络广告。

    此解决方案适用于两者。它会弹出一个粉红色的大“上诉框”,要求用户禁用他们的广告拦截器。我们喜欢将它放在菜单下方和内容上方。我们实际上并没有阻止对网站的访问 - 这只是将页面上的内容向下推了一点,但人们会觉得这很烦人,几乎所有人都会遵守并在您的网站上禁用他们的广告拦截器。

    所以这里是解决方案:

    A) 创建一个名为 Advertisement.js 的文件并将其放在您的 Web 服务器的根目录中,由以下代码行组成:

    document.write('<div id="tester">an advertisement</div>');
    

    B) 将以下内容注入您的网页(您甚至可以使用您的广告服务器代码来执行此操作!)。建议的位置在菜单下方和内容上方。

    <script src="advertisement.js"></script>
    <table id="tbl_ab_appeal" style="width: 900px; margin-left:auto; margin-right: auto; padding: 25px; background: #FCC; border: 1px solid #F66; visibility:collapse; border-collapse: collapse;">
        <tr>
            <td>We've detected that you're using an <strong>ad content blocking</strong> browser plug-in or feature. Ads provide a critical source of revenue to the continued operation of [This website name].&nbsp; We ask that you disable ad blocking while on [This
                website name] in the best interests of our community.</td>
        </tr>
    </table>
    <script>
        if (document.getElementById("tester") == undefined) adsBlocked();
    
        function adsBlocked() {
            document.getElementById("tbl_ab_appeal").style.visibility = "visible";
            document.getElementById("tbl_ab_appeal").style.borderCollapse = "separate";
            document.getElementById("tbl_ab_appeal").style.marginTop = "10px"
            document.getElementById("tbl_ab_appeal").style.marginBottom = "10px"
        }
    </script>
    <script onerror="adsBlocked()" src="//www.googletagservices.com/tag/js/gpt.js"></script>
    

    它是如何工作的?消息已加载,但高度为零且不可见。如果本地脚本 Advertisement.js 无法运行,或者远程 AdSense 脚本 www.googletagservices.com/tag/js/gpt.js 无法加载,则会显示该框。

    【讨论】:

      【解决方案4】:

      大多数 adblocker 取消对 ads.js 的 HTTP 请求并为元素创建 0px 但有时 adblocker 删除了 DOM,并且上面的某些答案将失败,因为没有检查元素的存在。

      使用setTimeout() 是一种很好的做法,因为没有它,脚本会与广告拦截器竞争。

      下面的脚本将检查 dom 是否存在/删除,并检查元素的 offsetHeight 是否存在。

      setTimeout(function() {
        var a = document.querySelector('.showads'),
          b = a ? (a.offsetHeight ? false : true) : true;
        console.log('ads blocked?', b)
      }, 200); // don't too fast or will make the result wrong.
      <div class="ads showads">
        Lorem ipsum dolor sit amet, consectetur adipisicing elit.
      </div>

      【讨论】:

        【解决方案5】:

        这对我有用,文件必须在您寻找广告拦截之前准备好 希望这对某人有帮助!

        jQuery(document).ready(function() {
        
        var adBlockEnabled = false;
        var testAd = document.createElement('div');
        testAd.innerHTML = '&nbsp;';
        testAd.className = 'adsbox';
        document.body.appendChild(testAd);
        window.setTimeout(function() {
          if (testAd.offsetHeight === 0) {
            adBlockEnabled = true;
          }
          testAd.remove();
          console.log('AdBlock Enabled? ', adBlockEnabled)
        }, 100);
        
        
        });
        

        【讨论】:

          【解决方案6】:

          在 React.js 中,您可以执行以下操作:

          class AdblockDetect extends Component {
            constructor (props) {
              super(props)
              this.state = {
                usingAdblock: false
              }
            }
          
            componentDidMount() {
              this.setState({ usingAdblock: this.fakeAdBanner.offsetHeight === 0 });
            }
          
            render() {
              if (this.state.usingAdblock === true) {
                return this.props.children;
              }
          
              return (
                <div
                  ref={r => (this.fakeAdBanner = r)}
                  style={{ height: '1px', width: '1px', visiblity: 'none', pointerEvents: 'none' }}
                  className="adBanner"
                />
              );
            }
          }
          
          class App extends Component {
            render() {
              return (
                <div className="App">
                  <AdblockDetect>You are using adblock</AdblockDetect>
                </div>
              );
            }
          }
          

          来源:https://stackoverflow.com/a/55635499/5539715

          【讨论】:

          • 有人对此投了反对票,但它在我的网站上有效,所以我不知道你为什么反对。
          【解决方案7】:

          以上所有答案都有效,但大多数都不适用于 DNS 级别的广告拦截。

          DNS 级广告拦截器(如 pi-hole)基本上返回 NXDOMAIN(域不存在)以获得广告拦截域列表(例如,telemetry.microsoft.com 将“不存在”)。

          有几种方法可以避免这种情况:

          方法 A:通过 IP 地址而不是域请求广告。

          这种方法有点烦人,因为您必须跟踪 IP 地址。如果您的代码没有得到很好的维护或定期更新,这将是一个问题。

          方法 B:阻止 所有 失败的请求 - 即使客户端报告 NXDOMAIN。

          如果它是“合法的”NXDOMAIN,这对用户来说会很烦人。

          【讨论】:

            【解决方案8】:

            对我来说很好用……

            <html>
                    <head>
                        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
                    </head>
                    <body>
                        <p>If you click on me, I will disappear.</p>
                        <p>Click me away!</p>
                        <p>Click me too!</p>
                        <script>
                            var adBlockEnabled = false;
                            var adSense = document.createElement('div');
                            adSense.innerHTML = '&nbsp;';
                            adSense.className = 'adsbox';
                            document.body.appendChild(adSense);
                            window.setTimeout(function() {
                              if (adSense.offsetHeight === 0) {
                                adBlockEnabled = true;
                              }
                              adSense.remove();
                              if (adBlockEnabled) {
                                    alert('Adblock enabled');
                              } else {
                                    alert('Adblock disabled or Not installed');
                              }
                            }, 100);
                        </script>
                    </body>
                </html>
            

            【讨论】:

              【解决方案9】:

              如果你正在使用带有钩子的反应:

              import React, { useState, useEffect } from 'react'
              
              const AdblockDetect = () => {
                const [usingAdblock, setUsingAdblock] = useState(false)
              
                let fakeAdBanner
                useEffect(() => {
                  if (fakeAdBanner) {
                    setUsingAdblock(fakeAdBanner.offsetHeight === 0)
                  }
                })
              
                if (usingAdblock === true) {
                  return null
                }
              
                return (
                  <div>
                    <div
                      ref={r => (fakeAdBanner = r)}
                      style={{ height: '1px', width: '1px', visibility: 'hidden', pointerEvents: 'none' }}
                      className="adBanner"
                    />
                    Adblock!
                  </div>
                )
              }
              
              export default AdblockDetect
              
              

              【讨论】:

                【解决方案10】:

                我正在使用 JavaScript promises 和 jQuery 来检测用户是否启用了广告拦截器:

                1. 创建一个小图像并将其重命名为ads.jpg(或任何扩展名)。

                2. 创建一个 JavaScript 函数以便在需要时调用它:

                  function hasAdBlocker() {
                    return new Promise(function(resolve, reject) {
                      let img = $('<img style="display: none;" src="ads.jpg" />');
                  
                      img.on("load", reject);
                      img.on("error", resolve);
                  
                      $("body").append(img);
                    });
                  }
                  
                3. 这样称呼它:

                  hasAdBlocker().then(function(){
                      console.log('Has adBlock')
                  }, function() {
                      console.log('No adBlock dedected')
                  })
                  

                【讨论】:

                  【解决方案11】:

                  我只用 AdBlock 进行了测试...如果 ads.js 文件解决方案不适合您,这可能..

                  在您的&lt;body&gt; 某处添加:

                  <div class="ads-wrapper adTop adUnit"></div>
                  

                  然后您可以在 DOM 准备好后检测 AdBlock 是否启用,然后触发您打算执行的任何操作:

                  var adBlockDetected = null;
                  $(document).ready(function() {
                      setTimeout(function() {
                          adBlockDetected = !$('.ads-wrapper').length > 0 || !$('.ads-wrapper').is(':visible');
                  
                          if (adBlockDetected) {
                              $(document).trigger('adblock-detected');
                          }
                      }, 1000); // give adblock time to do what it does best
                  });
                  
                  $(document).on('adblock-detected', function() {
                      // ... your code here
                  });
                  

                  【讨论】:

                    【解决方案12】:

                    html文件

                    <script src="wp-banners.js"></script>
                    
                    <script>
                    if(document.getElementById('LavXngdFojBe')){
                      alert('Blocking Ads: No');
                    } else {
                      alert('Blocking Ads: Yes');
                    }
                    </script>
                    

                    wp-banners.js

                    var e=document.createElement('div');
                    e.id='LavXngdFojBe';
                    e.style.display='none';
                    document.body.appendChild(e);
                    

                    这也显示在 https://detectadblock.com

                    【讨论】:

                    • 我想将广告块检测显示为模态,我试过了,但它不起作用,你可以尝试使用该代码并以模态显示吗?
                    【解决方案13】:
                    async function hasAdBlock() {
                      try {
                        await fetch("https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js", {
                          method: "HEAD",
                          mode: "no-cors",
                        })
                        return false;
                      } catch(e) {
                        return true;
                      }
                    }
                    

                    【讨论】:

                    • 这很紧。但是如何区分被阻塞的请求(IE:net::ERR_BLOCKED_BY_CLIENT)和网络问题(IE:net::ERR_NAME_NOT_RESOLVED)?
                    【解决方案14】:

                    我已经实现了很多方法来检测浏览器中的 adblock,所有解决方案都失败了,除了下面的 javascript 中的一个:

                    window.onload = function() {
                        setTimeout(function() {
                            var ad = document.querySelector("ins.adsbygoogle");
                            if (ad && ad.innerHTML.replace(/\s/g, "").length == 0) {
                                console.log('You seem to blocking Google AdSense ads in your browser.');
                            }
                        }, 2000);
                    };
                    

                    我希望这个 javascript 解决方案对您有所帮助。感谢您提出这个问题。

                    【讨论】:

                      【解决方案15】:

                      这个很好用

                      如果有广告拦截器,它会提醒您

                      checkAdBlocker();
                      
                      function checkAdBlocker() {
                          try {
                              fetch(
                                  new Request("https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js", {
                                      method: 'HEAD',
                                      mode: 'no-cors'
                                  })).catch(error => {
                                  showNotification()
                              });
                          } catch (e) {
                              // Request failed, likely due to ad blocker
                              showNotification()
                          }
                      }
                      
                      function showNotification() {
                          alert("Please disable adBlocker")
                      }

                      【讨论】:

                      • 请解释一下
                      【解决方案16】:

                      如果您使用 jQuery 和 Google Adsense:

                      jQuery.getScript(
                          "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js", 
                          function() {
                           // Load your ad now    
                      }).fail(function() {
                          // Google failed to load main script, do something now
                      });
                      

                      这更容易理解:如果 Google Ads 主 JavaScript 文件加载失败,AdSense 将无法工作,所以你可以使用 jQuery 的失败函数来做一些事情。

                      “现在加载您的添加”是当我附加“ins”对象时,例如:

                      jQuery(".my_ad_div").append('<ins class="adsbygoogle"
                      style="display:block"
                      data-ad-client="ca-pub-xxx"
                      data-ad-slot="xxx"
                      data-ad-format="auto"
                      data-full-width-responsive="true"></ins>
                      <script>
                      (adsbygoogle = window.adsbygoogle || []).push({});
                      </script>');
                      

                      在“// Google 未能加载主脚本,现在做点什么”中,我通常将图片放在广告位置。

                      【讨论】:

                        猜你喜欢
                        • 2015-04-23
                        • 2018-03-22
                        • 2014-10-13
                        • 2023-01-29
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多