1. 程式人生 > >1.4.2埋點JS實現

1.4.2埋點JS實現

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();
}