PHP+Ajax实现网站广告防止恶意点击解决方案
遇到问题
辛苦做网站,好不容易有点起色,考略到入不敷出的开支,于是决定投放广告,于是选择了GG,和百度,(弹窗神马的不考虑)
于是继续努力,努力。。。可是、大家都知广告联盟都是有体现最低金额的,悲剧的事当金额逼近最低限度时,收到了一封作弊邮件。。
于是悲剧的事情发生了。。。。。
分析问题
自己作弊是不可能的,这点常识我还是懂的。考略到可能是有些 ”好心“ 用户帮了我一把。(在此表示深深的感谢)。
(PS:本人不善言谈,不废话直接进入主题)
技术解决方案 (希望大家有更好的方案请在此讨论)
使用技术:
PHP,jquery(忽略),Ajax(重点)
方案解析:
对广告DIV层Click事件进行监控,当用户点击DIV内广告使 同时出发div的Click事件,(不影响正常的点击弹出)。
对已触发的DIV Click事件进行处理。
具体事件处理:
1、使广告DIV层进行隐藏消失,同时记住用户点击广告时间,点击页面,用户IP(重要)等信息,如需更多请自行获取。
2、写入文件或数据库,记录以上用户信息。
3、当同一用户在24小时(自己设定)内刷新网站或页面时,判断当前用户IP是否在数据库或数据文件中已存在,从而决定广告是否对该用户进行展示。
我这里使用的是Ajax异步访问:
save.php?ip=127.0.0.1&url=http://127.0.0.1/html/3453&browser=msie
通过GET方式得到相应用户新进行储存数据。
save.php源代码如下(可自行扩展):
<?php header("Content-type:text/html;charset=gb2312"); if($_GET['ip']) { if(is_file("ip.txt")) $data = @file_get_contents("ip.txt"); $arr=@explode("|",$data); for($i=0;$i<count($arr);$i++) { if($_GET['ip']==$arr[$i]) { exit(); } } $fp = @fopen("ip.txt",'w'); $data = $data."\r\n"."IP:".$_GET['ip']." | "."点击时间:".microtime(true)." | 来源页面:".$_GET[url]." | 浏览器:".$_GET[browser]; fwrite($fp,$data); fclose($fp); } ?>
show_ad.js 代码如下(异步访问save.php):
$(function() { $('#ad').click( function(){ //广告隐藏 $("#ad").hide('true'); //记录IP开始 var xmlHttp; function S_xmlhttprequest(){ if(window.ActiveXObject){ xmlHttp = new ActiveXObject('Microsoft.XMLHttp'); }else if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); } } function fun1(){ var ip=document.getElementById("ad_ip").innerHTML; var url=location.href; var bro=$.browser; //alert(name); var browser=''; for(var name in bro) { if(bro[name] == true){ var browser=browser+name+",";} } var d=new Date(); var time=d.getSeconds();//解决IE7bug S_xmlhttprequest(); xmlHttp.open("GET","save.php?ip="+ip+"&url="+url+"&browser="+browser+"&time="+time,true); xmlHttp.onreadystatechange = fun2; xmlHttp.send(null); } function fun2(){ if(xmlHttp.readyState==4){ if(xmlHttp.status==200){ var str1=xmlHttp.responseText; //alert(str1); document.getElementById('ceshi').innerHTML=str1; } } } fun1();//执行方法 //记录IP结束 } );//Click结束 });//document结束
测试是否显示广告页面index.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>This ia a jQuery + AJAX Test</title> <script src="jquery-1.7.1.js" type="text/javascript"></script> <script src="show_ad.js" type="text/javascript"></script> <style> * { margin:0px auto; } div { width:800px; } #ad { width:900px; height:140px; background:#003366; text-align:center; color:#FFFFFF; font-size:24px; padding-top:10px; font-family:Arial, Helvetica, sans-serif; margin-top:100px; } </style> </head> <body> <?php //读取已点击IP列表 function ckip($ip) { $data = @file_get_contents("ip.txt"); $arr=@explode("\r\n",$data); for($i=0;$i<count($arr);$i++) { $arr2=explode(" | ",$arr[$i]); $arr2[0] = @str_replace("IP:","",$arr2[0]); if($ip==$arr2[0]) return 1; } return 0; } if(ckip($_SERVER[HTTP_HOST])==0)//未点击过 { //显示广告 echo " <div id='ad'> <a href='http://www.baidu.com' target='_blank'><img src='logo.gif' width='270' height='129' /></a>This is an AD! <div style='display:none' id='ad_ip'>".$_SERVER[HTTP_HOST]."</div> </div>"; }else{} ?> <div> <p>这里是正常网站内容。。。。 </p> <div> <p>这里是正常网站内容。。。。 </p> </div> <div> <p>这里是正常网站内容。。。。 </p> </div> </div> </body> </html>
不废话了,大家仔细研究下,如果有更好的思路,解决方案欢迎讨论。