| 
 | 
 
从原文摘录部分自: 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; 
    } 
} |   
 
 
 
 |