通常,正常的访客,是不会点击网页中,除按钮、超链接等功能性区域外的其他区域的。所以我们可以通过脚本,来判断访客是否点击了除功能区域外的其他区域。代码如下:
<script>
var domain = 'yourdomain.com'; //替换成你的域名
var protocol = 'https'; //如果不支持https, 请改为 http
"use strict";!function(){var e={clicks:{clickCount:0,clickWrong:0,clickDetails:[]}};window.AtRequest=function(e="GET",t,n=null){var o=new XMLHttpRequest;o.open(e,t,!0),o.withCredentials=!0,n&&o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.send(n)},window.AtClickCheck=function(t=["p","button","a"],n=3,o=0){document.addEventListener("DOMContentLoaded",function(){document.addEventListener("mouseup",function(c){e.clicks.clickCount++,e.clicks.clickDetails.push({timestamp:Date.now(),node:c.target.nodeName,x:c.pageX,y:c.pageY}),o>0&&console.log(c.target.nodeName),t.indexOf(c.target.nodeName.toLowerCase())<0&&e.clicks.clickWrong++,e.clicks.clickWrong>n&&(o>0&&console.log("Bot"),AtRequest("GET",protocol + '://' + domain + '/d/wrong'))})})}}();
// AtClickCheck 支持3个参数, 分别为
// AtClickCheck([支持的标签数组],最大错误点击次数,是否开启调试模式);
// 请将标签转为小写
AtClickCheck(['h3','span','img'],2,1);
//如果需要关闭调试模式, 请改为,即,第三个参数删除。
// AtClickCheck(['h3','span',,'img'],2);
</script>
将该代码放置在之前即可。如果你的 Lander 有其他更多的可点击元素,可以将小写元素标签放到数组内。后面数字为非数组内标签的最大点击次数,可以依据需求修改。如:
AtClickCheck(["a","button","img"],2);
代表,如果点击非 a、button、img 标签之外的元素两次,就会被识别为Bot。
除此之外,还有一些奇葩自动点击的软件,会绕过 Alert 以及 Modal 的限制,直接点击网页中的链接。这种刷子是通过软件读取源码、获取链接,然后通过软件直接访问。这种刷子我们就可以使用死链功能,在页面中增加大量的死链代码。修改页面,增加如下代码(代码放在 标签之后):
同样,你需要将 afilter.xyz 替换成你自己的域名。
<?php for($i=0;$i<100;$i++) { ?>
<a href="https://afilter.xyz/d/<?php echo session_create_id()?>" style="position: absolute; left: -100px;">Check Now</a>
<?php }?>
访问效果为:
同时,我们还需要修改下 Lander 上的 CTA 链接,避免这种奇葩刷子直接访问我们的 CTA 链接,污染我们的 CTR 数据。如:
<!-- Afilter Tracker 防止提取链接模拟点击 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
(function(){
var domain = 'yourdomain.com'; //替换成你的域名
var protocol = 'https'; //如果不支持https, 请改为 http
window.afilter = function(event,detail,token){
if(Number(event) <= 0) return;
var xhr = new XMLHttpRequest();
xhr.open('POST', protocol + '://' + domain +'/p/events', true);
xhr.withCredentials = true;
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("et=" + event + "&v=" + detail + "&t=" + token);
};
window.atgo = function(url){
window.location.replace(protocol + '://' + domain + '/' + url);
};
}());
</script>
</head>
<body>
<a href="https://demo.com">这个链接可以直接被抓取点击</a>
<a href="javascript:atgo('click')">这个链接无法被抓取,但是访客可以访问</a>
</body>
</html>
如此,我们的识别、防止刷子的脚本就配置好了~