国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

google的分析(analytics)js代碼分析以及重寫(xiě)

2024-07-21 02:29:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

   相信用過(guò)google的analytics的朋友都了解其功能的強(qiáng)大.
    由于工作需要,最近將其urchin.js的代碼down了一份下來(lái)研究了一下.由于其注釋很少,命名也很難讀懂.研究了1個(gè)月.小有所成.將其代碼重寫(xiě)并加上了注釋.與大家一同分享.這里面將google的用戶識(shí)別代碼刪除. /**//*
 =====================================
|--------author by blacksoul---------|
|------------2006.04.27--------------|
|[email protected]------|
|------------qq:9136194--------------|
|------http://blacksoul.cnblogs.cn---|
======================================
*/

//定義全局量
var ur = "";                                                  //來(lái)源地址
var urp = new array();                                        //來(lái)源參數(shù)名稱
var urpv = new array();                                       //來(lái)源參數(shù)值
var arraycount = 0;                                           //參數(shù)數(shù)目
pageopen = new date();                                          //進(jìn)入頁(yè)面的時(shí)間
var requrl = "http://192.168.0.219/analytics/";               //接收數(shù)據(jù)的頁(yè)面地址
var guid = math.round(math.random()*2147483647);              //用戶唯一隨機(jī)數(shù)
var title = document.title;                                   //網(wǎng)頁(yè)標(biāo)題
var uexp = pageopen.gettime() + ( 1000 * 60 * 60 * 24 * 30 ); //設(shè)置cookie過(guò)期時(shí)間 既回訪用戶的限定
var rtu = "false";                                            //指示用戶是否回訪用戶

//瀏覽器特征信息
var brower = new array();
/**//*
* brower[0] 瀏覽器類型
* brower[1] 瀏覽器版本
* brower[2] 瀏覽器java是否打開(kāi) 1開(kāi)-1關(guān)
* brower[3] 瀏覽器flash版本
* brower[4] 瀏覽器操作系統(tǒng)
* brower[5] 瀏覽器分辨率
* brower[6] 瀏覽器色深
* brower[7] 瀏覽器語(yǔ)言
* brower[8] 瀏覽器插件
*/
var sen=new array();    //搜索引擎的名稱
var keyword=new array(); //關(guān)鍵字傳輸形式
sen[0]="google";        keyword[0]="q";
sen[1]="yahoo";            keyword[1]="p";
sen[2]="msn";            keyword[2]="q";
sen[3]="aol";            keyword[3]="query";
sen[4]="lycos";            keyword[4]="query";
sen[5]="ask";            keyword[5]="q";
sen[6]="altavista";        keyword[6]="q";
sen[7]="search";        keyword[7]="q";
sen[8]="netscape";        keyword[8]="query";
sen[9]="earthlink";        keyword[9]="q";
sen[10]="cnn";            keyword[10]="query";
sen[11]="looksmart";    keyword[11]="key";
sen[12]="about";        keyword[12]="terms";
sen[13]="excite";        keyword[13]="qkw";
sen[14]="mamma";        keyword[14]="query";
sen[15]="alltheweb";    keyword[15]="q";
sen[16]="gigablast";    keyword[16]="q";
sen[17]="voila";        keyword[17]="kw";
sen[18]="virgilio";        keyword[18]="qs";
sen[19]="teoma";        keyword[19]="q";
sen[20]="baidu";        keyword[20]="wd";
//test data------------//////////////////////////////-----------/-/-/-/-/-/-/-/-/-/-/-
sen[21]="localhost";    keyword[21]="q";
    這里面定義一些全局的量,其中upr,urpv為來(lái)源參數(shù)和指,比如來(lái)源為http://www.google.com/?p=blacksoul&q=javascript,則urp[0]="p",urp[1]="q" 相對(duì)應(yīng)的urpv[0]="blacksoul",urpv[1]="javascript".
但是最終傳輸?shù)臅r(shí)候是以分隔符的形式傳遞給服務(wù)器端的.
    guid為隨機(jī)數(shù),google是這么做的.當(dāng)初沒(méi)有想通為什么要保存一個(gè)隨機(jī)數(shù),后來(lái)分析數(shù)據(jù)的才明白過(guò)來(lái).為了驗(yàn)證用戶的唯一性.
以下是函數(shù)處理:
//比較url,如果為搜索引擎則保存關(guān)鍵字-------------
function getkeyword(url)
{
    var hostname;
    if(url.indexof(".") == -1)
        {hostname = url;}
    else
        {hostname = url.substring(url.indexof("."),url.lastindexof("."));}
    for(var i = 0; i < sen.length; i++)
    {
        if(hostname == sen[i])
        {
            for(var j = 0; j < urp.length; j ++)
            {
                if(urp[j] == keyword[i])
                {
                    return urpv[j];
                }
            }
        }
    }
   
    return "";
}
//將url轉(zhuǎn)換為地址和頁(yè)面參數(shù)和參數(shù)值 參數(shù)uri為頁(yè)面地址
function gethn(uri)
{
    if(!uri || uri == "") return "";
    ur = uri;
    var sub;
    //帶參數(shù)
    if(ur.indexof("?") != -1)
    {
        var url = ur.substring(0,ur.indexof("?"));
        var para = ur.substring(ur.indexof("?")+1,ur.length);
        while(para.length > 0)
        {
            if(para.indexof("&") == -1)
            {
                urp[arraycount] = para.substring(0,para.indexof("="));
                urpv[arraycount] = para.substring(para.indexof("=")+1,para.length);
                break;
            }
            sub = para.substring(0,para.indexof("&"));
            urp[arraycount] = sub.substring(0,sub.indexof("="));
            urpv[arraycount] = sub.substring(sub.indexof("=")+1,sub.length);
            para = para.substring(para.indexof("&")+1,para.length);
            arraycount ++;
        }
        return url;
    }
    else
        return ur;
}

//----------------------------獲得域名-----------------------------
function gethostname(url)
{
    url = url.substring(url.indexof('://')+3,url.length);
    url = url.substring(0,url.indexof("/"));
    return url;
}

//---------------------------獲得flash版本------------------
function getflash() {
 var f="-1",n=navigator;
 if (n.plugins && n.plugins.length) {
  for (var ii=0;ii<n.plugins.length;ii++) {
   if (n.plugins[ii].name.indexof('shockwave flash')!=-1) {
    f=n.plugins[ii].description.split('shockwave flash ')[1];
    break;
   }
  }
 } else if (window.activexobject) {
  for (var ii=10;ii>=2;ii--) {
   try {
    var fl=eval("new activexobject('shockwaveflash.shockwaveflash."+ii+"');");
    if (fl) { f=ii + '.0'; break; }
   }
   catch(e) {}
  }
 }
 if(f == "-1")
    return f;
 else
     return f.substring(0,f.indexof(".")+2);
}

//--------------------------設(shè)置異步傳輸-----------------------------------
function createxmlhttprequest()
{
    if (window.xmlhttprequest)
    {
        return new xmlhttprequest();
    }
    else if (window.activexobject)
    {
        return new activexobject("microsoft.xmlhttp");
    }
}    以上的方法可以取得一些基本信息.但是關(guān)鍵的問(wèn)題還是設(shè)置用戶cookie,判斷回訪,判斷最后一次訪問(wèn)時(shí)間,并設(shè)置其guid.這里看了很久沒(méi)有發(fā)現(xiàn)google是怎么做的...于是自己想了一些笨辦法.見(jiàn)一下代碼:
//瀏覽器特征信息
function browserinfo()
{
    brower[0] = navigator.appname;
    brower[7] = navigator.language;
    if(brower[0] == "netscape")
    {
        var browerinfo = navigator.useragent;
        brower[1] = browerinfo.substring(browerinfo.lastindexof(" ")+1,browerinfo.length);
        brower[0] = brower[1].substring(0,brower[1].lastindexof("/"));
        brower[1] = browerinfo.substring(browerinfo.lastindexof("/")+1,browerinfo.length);
        brower[7] = navigator.language;
    }
    else if(brower[0] == "microsoft internet explorer")
    {
        brower[1] = navigator.useragent.split(";")[1];
        brower[7] = navigator.userlanguage;
    }
    brower[2] = navigator.javaenabled()?1:-1;
    brower[3] = getflash();
    brower[4] = getos();
   
    if (self.screen) {
        sr=screen.width+"x"+screen.height;
        sc=screen.colordepth+"-bit";
    }
    else if (self.java)
    {
        var j=java.awt.toolkit.getdefaulttoolkit();
        var s=j.getscreensize();
        sr=s.width+"x"+s.height;
   }
   //分辨率
   brower[5] = sr;
   //色深
   brower[6] = sc;
   //插件列表
   brower[8] = getplugin();
}

//-----------------------獲得當(dāng)前地址-----------------------------
function gethref()
{
    return document.location.href;
}

//-----------------------cookie操作開(kāi)始----------------------------

function setcookie(name, value)
//設(shè)定cookie值
{
    var expdate = new date();
    var argv = setcookie.arguments;
    var argc = setcookie.arguments.length;
    var expires = 15768000;
    var path = (argc > 3) ? argv[3] : null;
    var domain = (argc > 4) ? argv[4] : null;
    var secure = (argc > 5) ? argv[5] : false;

    if(expires!=null)
    {
    //設(shè)置過(guò)期時(shí)間24小時(shí)
        expdate.settime(uexp);
        document.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.togmtstring()))
            + ((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))
            + ((secure == true) ? "; secure=" : "");
   }
}

function delcookie(name)
//刪除cookie
{
    var exp = new date();
    exp.settime (exp.gettime() - 1);
    var cval = getcookie (name);
    document.cookie = name + "=" + cval + "; expires="+ exp.togmtstring();
}


//獲得cookie的值
function getcookie(fname)
{
    var name,value;
    var cookies = new object();
    var beginning,middle,end;

    beginning = 0;
    while(beginning < document.cookie.length)
    {
        middle = document.cookie.indexof("=",beginning);
        end = document.cookie.indexof(";",beginning);

        if(end == -1)
        {
            end = document.cookie.length;
        }
        if((middle > end) || (middle == -1))
        {
            name = document.cookie.substring(beginning,end);
            value = "";
        }
        else
        {
            name = document.cookie.substring(beginning,middle);
            value = document.cookie.substring(middle+1,end);
        }
        if(name == fname)
        {
            return unescape(value);
        }
        beginning = end + 2;
    }
}

//-----獲取guid的cookie是否存在獲得------------------
function getcookievalue()
{
    var guid = getcookie("guid");
    if(guid != null)
    {
        return guid;
    }
    else
    {
        return "nocookie";
    }
}

//---------------------獲得注冊(cè)用戶cookie-----------------
function getregusercookie()
{
    return ;
}
//---------------------cookie 操作完畢------------------

//------------------------得操作系統(tǒng)---------------------------
function getos()
{
    var oslist = new array();
    var osname = new array();
    oslist[0] = " windows4.0";       osname[0] = "windows 95";
    oslist[1] = " windows 98";       osname[1] = "windows 98";
    oslist[2] = " windows nt 5.0";   osname[2] = "windows 2000";
    oslist[3] = " windows nt 5.1";   osname[3] = "windows xp";
    oslist[4] = " windows nt 5.2";   osname[4] = "windows server 2003";
    var ua = navigator.useragent.split(";");
    for(var i = 0; i < oslist.length; i++)
    {
        if(ua[2] == oslist[i])
            return osname[i];
    }
    return ua[2];
}

//獲得插件
function getplugin()
{
    var plugin = "";
    var ua = navigator.useragent.split(";");
    if(ua.length < 4)
        return "";
    for(var i = 4; i < ua.length; i++)
    {
        plugin += ua[i] + ",";
    }
    return plugin.substring(0,plugin.length-2);
}

    需要說(shuō)明的一點(diǎn)是getresidenttime這個(gè)函數(shù),google采用了img.load的方法加載了接收處理信息頁(yè)面的,需要再服務(wù)器端配置將后綴為.gif或你所取的其他形式的文件使用aspx的方式編譯運(yùn)行.因?yàn)槲以瓉?lái)考慮的是使用xmlhttp異步調(diào)用.但是頁(yè)面退出的時(shí)候有時(shí)候不執(zhí)行.所以就棄用了.代碼如下:

function getresidenttime()
{
    pageclose = new date();
    minutes = (pageclose.getminutes() - pageopen.getminutes());
    if(minutes < 0)
    {
        minutes = minutes + 60;
    }
    seconds = (pageclose.getseconds() - pageopen.getseconds());
    if(seconds < 0){ seconds += 60;}
    time = (seconds + (minutes * 60));
   
//---------------修改此處為接收鏈接地址 xml 異步傳輸------------------
//    var xmlhttp = createxmlhttprequest();
//    xmlhttp.open("post", requrl + firstvisit.aspx?" + strpara(), false);
//    xmlhttp.send(null);
//----------------------------圖片形式傳遞----------------------------
    if(isreturn() == false)
    {
        var i = new image(1,1);

        i.src = requrl + "firstvisit.aspx?" + strpara() + "&guid=" + guid;
        i.onload = function() {loadvoid();}

        //進(jìn)入頁(yè)面的信息
        if(getcookievalue("guid") == "nocookie"){return ;}
        i.src = requrl + "pageview.gif?" + pageview() + "&st=" + time;
        i.onload=function() {loadvoid();}
    }
    else
    {

        var i=new image(1,1);
        i.src = requrl + "pageview.gif?" + pageview() + "&st=" + time;
        i.onload=function() {loadvoid();}
    }
}

    最后就是調(diào)用了.我使用了window.onunload = getresidenttime

    傳遞的參數(shù)大家可以打印出來(lái)看一下.應(yīng)該可以明白其意思.

    剩下的就是服務(wù)器端的處理了,在服務(wù)器端處理其實(shí)相當(dāng)簡(jiǎn)單.取得request的值,驗(yàn)證并保存入數(shù)據(jù)庫(kù).現(xiàn)在有了數(shù)據(jù),分析的事情就由用戶按照自己的要求來(lái)處理了..補(bǔ)充一句,ip地址是由服務(wù)器端來(lái)取得保存的.

    使用的時(shí)候記得一定將其放到服務(wù)器端,然后使用<javascript language="javascript" type="text/javascript" src=服務(wù)器地址+路徑+"statistics.js"> </script>   附上完整的代碼http://www.cnblogs.com/files/blacksoul/statistic.rar下載.
    該例子我在ie,firefox,netscape下面測(cè)試都很正常.搞了一個(gè)月,總算有所成就了.但是還有很多需要改進(jìn)的地方,希望做過(guò)的,感興趣的朋友多多指點(diǎn)交流.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 九龙坡区| 阿克陶县| 昭通市| 汤原县| 拉孜县| 新丰县| 鄯善县| 岳阳市| 府谷县| 抚顺市| 洞口县| 奉节县| 湘乡市| 喀喇沁旗| 容城县| 花垣县| 宁河县| 剑阁县| 台北县| 鄢陵县| 陵水| 苗栗县| 嘉荫县| 仙居县| 城口县| 岳阳县| 涪陵区| 盐城市| 顺义区| 阿拉善右旗| 和平区| 邓州市| 贞丰县| 安龙县| 丰都县| 遵义县| 怀集县| 敦化市| 张北县| 闸北区| 永新县|