1.4.2埋點JS實現
阿新 • • 發佈:2018-11-05
track.js
//函式可對字串進行編碼,防止中文亂碼 function jt_encode(str){ //進行URL編碼 return encodeURI(str); } //螢幕解析度 function jt_get_screen(){ var c = ""; if (self.screen) { c = screen.width+"x"+screen.height; } return c; } //顏色質量 function jt_get_color(){ var c = ""; if (self.screen) { c = screen.colorDepth+"-bit"; } return c; } //返回當前的瀏覽器語言 function jt_get_language(){ var l = ""; var n = navigator; if (n.language) { l = n.language.toLowerCase(); }else if (n.browserLanguage) { l = n.browserLanguage.toLowerCase(); } return l; } //返回瀏覽器型別IE,Firefox function jt_get_agent(){ var a = ""; var n = navigator; if (n.userAgent) { a = n.userAgent; } return a; } //方法可返回一個布林值,該值指示瀏覽器是否支援並啟用了Java function jt_get_jvm_enabled(){ var j = ""; var n = navigator; j = n.javaEnabled() ? 1 : 0; return j; } //返回瀏覽器是否支援(啟用)cookie function jt_get_cookie_enabled(){ var c = ""; var n = navigator; c = n.cookieEnabled ? 1 : 0; return c; } //檢測瀏覽器是否支援Flash或有Flash外掛 function jt_get_flash_ver(){ var f="",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) {} } } return f; } //匹配頂級域名 function jt_c_ctry_top_domain(str){ var pattern = "/^aero$|^cat$|^coop$|^int$|^museum$|^pro$|^travel$|^xxx$|^com$|^net$|^gov$|^org$|^mil$|^edu$|^biz$|^info$|^name$|^ac$|^mil$|^co$|^ed$|^gv$|^nt$|^bj$|^hz$|^sh$|^tj$|^cq$|^he$|^nm$|^ln$|^jl$|^hl$|^js$|^zj$|^ah$|^hb$|^hn$|^gd$|^gx$|^hi$|^sc$|^gz$|^yn$|^xz$|^sn$|^gs$|^qh$|^nx$|^xj$|^tw$|^hk$|^mo$|^fj$|^ha$|^jx$|^sd$|^sx$/i"; if(str.match(pattern)){ return 1; } return 0; } //處理域名地址 function jt_get_domain(host){ //如果存在則截去域名開頭的 "www." var d=host.replace(/^www\./, ""); //剩餘部分按照"."進行split操作,獲取長度 var ss=d.split("."); var l=ss.length; //如果長度為3,則為xxx.yyy.zz格式 if(l == 3){ //如果yyy為頂級域名,zz為次級域名,保留所有 if(jt_c_ctry_top_domain(ss[1]) && jt_c_ctry_domain(ss[2])){ }else{ //否則只保留後兩節 d = ss[1]+"."+ss[2]; } }else if(l >= 3){ //如果長度大於3 //如果host本身是個ip地址,則直接返回該ip地址為完整域名 var ip_pat = "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"; if(host.match(ip_pat)){ return d; } //如果host後兩節為頂級域名及次級域名,則保留後三節 if(jt_c_ctry_top_domain(ss[l-2]) && jt_c_ctry_domain(ss[l-1])) { d = ss[l-3]+"."+ss[l-2]+"."+ss[l-1]; }else{ //否則保留後兩節 d = ss[l-2]+"."+ss[l-1]; } } return d; } //返回cookie資訊 function jt_get_cookie(name){ //獲取所有cookie資訊 var co=document.cookie; //如果名字是個空 返回所有cookie資訊 if (name == "") { return co; } //名字不為空 則在所有的cookie中查詢這個名字的cookie var mn=name+"="; var b,e; b=co.indexOf(mn); //沒有找到這個名字的cookie 則返回空 if (b < 0) { return ""; } //找到了這個名字的cookie 獲取cookie的值返回 e=co.indexOf(";", b+name.length); if (e < 0) { return co.substring(b+name.length + 1); } else { return co.substring(b+name.length + 1, e); } } /** 設定cookie資訊 操作符: 0 表示不設定超時時間 cookie是一個會話級別的cookie cookie資訊儲存在瀏覽器記憶體當中 瀏覽器關閉時cookie消失 1 表示設定超時時間為10年以後 cookie會一直儲存在瀏覽器的臨時資料夾裡 直到超時時間到來 或使用者手動清空cookie為止 2 表示設定超時時間為1個小時以後 cookie會一直儲存在瀏覽器的臨時資料夾裡 直到超時時間到來 或使用者手動清空cookie為止 **/ function jt_set_cookie(name, val, cotp){ var date=new Date; var year=date.getFullYear(); var hour=date.getHours(); var cookie=""; if (cotp == 0) { cookie=name+"="+val+";"; }else if (cotp == 1) { year=year+10; date.setYear(year); cookie=name+"="+val+";expires="+date.toGMTString()+";"; }else if (cotp == 2) { hour=hour+1; date.setHours(hour); cookie=name+"="+val+";expires="+date.toGMTString()+";"; } var d=jt_get_domain(document.domain); if(d != ""){ cookie +="domain="+d+";"; } cookie +="path="+"/;"; document.cookie=cookie; } //返回客戶端時間 function jt_get_stm(){ return new Date().getTime(); } //返回指定個數的隨機數字串 function jt_get_random(n) { var str = ""; for (var i = 0; i < n; i ++) { str += String(parseInt(Math.random() * 10)); } return str; } // main function function jt_main() { //收集完日誌 提交到的路徑 var dest_path = "http://localhost/jtlog/servlet/LogServlet?"; var expire_time = 30 * 60 * 1000;//會話超時時長,三十分鐘 //處理uv //--獲取cookie jt_stat_uv的值 var uv_str = jt_get_cookie("jt_stat_uv"); var uv_id = ""; //--如果cookie jt_stat_uv的值為空 if (uv_str == ""){ //--為這個新uv配置id,為一個長度20的隨機數字 uv_id = jt_get_random(20); //--設定cookie jt_stat_uv 儲存時間為10年 jt_set_cookie("jt_stat_uv", uv_id, 1); } //--如果cookie jt_stat_uv的值不為空 else{ //--獲取uv_id uv_id = uv_str; } //處理ss //--獲取cookie jt_stat_ss var ss_str = jt_get_cookie("jt_stat_ss"); var ss_id = ""; //sessin id var ss_no = 0; //session有效期內訪問頁面的次數 //--如果cookie中不存在jt_stat_ss 說明是一次新的會話 if (ss_str == ""){ //--隨機生成長度為10的session id ss_id = jt_get_random(10); //--session有效期內頁面訪問次數為0 ss_no = 0; //--拼接cookie jt_stat_ss 值 格式為 會話編號_會話期內訪問次數_客戶端時間_網站id value = ss_id+"_"+ss_no+"_"+jt_get_stm(); //--設定cookie jt_stat_ss jt_set_cookie("jt_stat_ss", value, 0); } //--如果cookie中存在jt_stat_ss else { //獲取ss相關資訊 var items = ss_str.split("_"); //--ss_id var cookie_ss_id = items[0]; //--ss_no var cookie_ss_no = parseInt(items[1]); //--ss_stm var cookie_ss_stm = items[2]; //如果當前時間-當前會話上一次訪問頁面的時間>30分鐘,雖然cookie還存在,但是其實已經超時了!仍然需要重新生成cookie if (jt_get_stm() - cookie_ss_stm > expire_time) { //--重新生成會話id ss_id = jt_get_random(10); //--設定會話中的頁面訪問次數為0 ss_no = 0; } //--如果會話沒有超時 else{ //--會話id不變 ss_id = cookie_ss_id; //--設定會話中的頁面方位次數+1 ss_no = cookie_ss_no + 1; } //--重新拼接cookie jt_stat_ss的值 value = ss_id+"_"+ss_no+"_"+jt_get_stm(); jt_set_cookie("jt_stat_ss", value, 0); } //當前地址 var url = document.URL; url = jt_encode(String(url)); //當前資源名 var urlname = document.URL.substring(document.URL.lastIndexOf("/")+1); urlname = jt_encode(String(urlname)); //返回導航到當前網頁的超連結所在網頁的URL var ref = document.referrer; ref = jt_encode(String(ref)); //網頁標題 var title = document.title; title = jt_encode(String(title)); //網頁字符集 var charset = document.charset; charset = jt_encode(String(charset)); //螢幕資訊 var screen = jt_get_screen(); screen = jt_encode(String(screen)); //顏色資訊 var color = jt_get_color(); color = jt_encode(String(color)); //語言資訊 var language = jt_get_language(); language = jt_encode(String(language)); //瀏覽器型別 var agent = jt_get_agent(); agent = jt_encode(String(agent)); //瀏覽器是否支援並啟用了java var jvm_enabled =jt_get_jvm_enabled(); jvm_enabled = jt_encode(String(jvm_enabled)); //瀏覽器是否支援並啟用了cookie var cookie_enabled = jt_get_cookie_enabled(); cookie_enabled = jt_encode(String(cookie_enabled)); //瀏覽器flash版本 var flash_ver = jt_get_flash_ver(); flash_ver = jt_encode(String(flash_ver)); //當前ss狀態 格式為"會話id_會話次數_當前時間" var stat_ss = ss_id+"_"+ss_no+"_"+jt_get_stm(); //拼接訪問地址 增加如上資訊 dest=dest_path+"url="+url+"&urlname="+urlname+"&title="+title+"&chset="+charset+"&scr="+screen+"&col="+color+"&lg="+language+"&je="+jvm_enabled+"&ce="+cookie_enabled+"&fv="+flash_ver+"&cnv="+String(Math.random())+"&ref="+ref+"&uagent="+agent+"&stat_uv="+uv_id+"&stat_ss="+stat_ss; //通過插入圖片訪問該地址 document.getElementsByTagName("body")[0].innerHTML += "<img src=\""+dest+"\" border=\"0\" width=\"1\" height=\"1\" />"; } window.onload = function(){ //觸發main方法 jt_main(); }