|  | 
 
| 从原文摘录部分自: http://obmem.info/?p=844 
 怎样才能把CPV/CPM的所有来访IP压榨干净呢?试想一下这个算法:
 
 * 用户当天第一次来访,显示广告1
 * 用户当天第二次来访,显示广告2
 * ……
 
 只要用户访问次数小于现存广告的个数,那么他每次访问都会显示不一样的广告,点几次页面就显示几次广告!
 
 CPV广告就真正名副其实地是Cost Per View了。
 
 于是就有一个问题,怎么确定用户第几次访问,从而显示第几个广告呢?最朴素的想法莫过于建立一个本机的流量统计系统,例如piwik系统,然后查询本地数据库,我一开始的确想这么实现,但是可想而知这会多么拖累主机的性能。想想看,javascript有没有办法自己来保存那些访问信息呢?
 
 其实是有的,那就是本机cookies,只要自动记录cookie,那么用户是第几次来那就显而易见了;而且由于cookie有自动超时机制,我们只要让它把超时设为24小时,那么第二天就可以自动重新统计了。
 
 首先,需要有set_cookie以及get_cookie函数
 
 function set_cookie(name,value,expires){
 var today = new Date();
 today.setTime( today.getTime() );
 expires = expires*1000;
 var expires_date = new Date(today.getTime()+(expires));
 document.cookie=name+"="+escape(value)+";expires="+expires_date.toGMTString()+";domain=simplecd.org";
 }
 function get_cookie(name){
 var i,x,y,ARRcookies=document.cookie.split(";");
 for (i=0;i<ARRcookies.length;i++){
 x=ARRcookies.substr(0,ARRcookies.indexOf("="));
 y=ARRcookies.substr(ARRcookies.indexOf("=")+1);
 x=x.replace(/^\s+|\s+$/g,"");
 if (x==name){
 return unescape(y);
 }
 }
 }
 
 然后,我们可以稍微修改一下算法,简化代码:为各个广告建立自己的cookie,值为访问次数
 
 新算法如下:
 
 * 遍历各广告位的cookie
 * 如果有不存在的cookie,则显示该广告位,并且设置cookie
 * 如果cookie全部存在则显示任意广告或者不显示,同时更新所显示广告的cookie
 
 更进一步地,为了那个悬浮窗不要那么扰民,也可以再加上一条:
 
 * 如果用户已显示广告总次数大于6次,那么今天就不显示该类广告。
 
 整个接下来的代码如下:
 
 var total_ad = 3;
 var max_show = 6;
 var cookie_pre = 'cpvad_counter_';
 var cookie_time = 60*60*8;
 var show = -1; // show ad id
 var show_counter = 0;
 // first pass, round robin
 for (var i=0;i<total_ad;i++) {
 var cookie_name = cookie_pre+i;
 var counter = get_cookie(cookie_name);
 if ( counter ){
 show_counter += parseInt(counter);
 }else{
 show = i;
 break;
 }
 }
 // show if not showed more than max_show times
 if (show_counter < max_show){
 // second pass, random show
 if (show == -1){
 show = Math.floor(Math.random()*total_ad);
 }
 // handle cookie
 var cookie_name = cookie_pre+show
 var cookie_value = get_cookie(cookie_name);
 if (cookie_value){
 set_cookie(cookie_name,''+(parseInt(cookie_value)+1),cookie_time);
 }else{
 set_cookie(cookie_name,'1',cookie_time);
 }
 // show add
 switch(show){
 case 0:
 document.write('<script type="text/javascript">u_a_client="20685";u_a_width="270";u_a_height="200";u_a_zones="63336";u_a_type="1";<\/script><script src="http://js.tjq.com/i.js"><\/script>');
 break;
 case 1:
 document.write('<script type="text/javascript">u_a_client="20326";u_a_width="270";u_a_height="200";u_a_zones="37972";u_a_type="1";<\/script><script src="http://www.admin6.com/i.js"><\/script>');
 break;
 case 2:
 document.write('<script type="text/javascript">u_a_client="20685";u_a_width="283";u_a_height="189";u_a_zones="63369";u_a_type="1";<\/script><script src="http://js.tjq.com/i.js"><\/script>');
 break;
 }
 }
 | 
 |