`
hupy
  • 浏览: 188797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

google的分析(analytics)js代码分析及重写

阅读更多

相信用过google的analytics的朋友都了解其功能的强大.
由于工作需要,最近将其urchin.js的代码down了一份下来研究了一下.由于其注释很少,命名也很难读懂.研究了1个月.小有所成.将其代码重写并加上了注释.与大家一同分享.这里面将google的用户识别代码删除. /**//*
=====================================
|--------Author By BlackSoul---------|
|------------2006.04.27--------------|
|--------BlackSoulylk@gmail.com------|
|------------QQ:9136194--------------|
|------http://blacksoul.cnblogs.cn---|
======================================
*/

//定义全局量
var ur = ""; //来源地址
var urp = new Array(); //来源参数名称
var urpv = new Array(); //来源参数值
var arrayCount = 0; //参数数目
pageOpen = new Date(); //进入页面的时间
var reqURL = "http://192.168.0.219/Analytics/"; //接收数据的页面地址
var GUID = Math.round(Math.random()*2147483647); //用户唯一随机数
var title = document.title; //网页标题
var uexp = pageOpen.getTime() ( 1000 * 60 * 60 * 24 * 30 ); //设置cookie过期时间 既回访用户的限定
var rtu = "false"; //指示用户是否回访用户

//浏览器特征信息
var brower = new Array();
/**//*
* brower[0] 浏览器类型
* brower[1] 浏览器版本
* brower[2] 浏览器java是否打开 1开-1关
* brower[3] 浏览器flash版本
* brower[4] 浏览器操作系统
* brower[5] 浏览器分辨率
* brower[6] 浏览器色深
* brower[7] 浏览器语言
* brower[8] 浏览器插件
*/
var sEn=new Array(); //搜索引擎的名称
var keyWord=new Array(); //关键字传输形式
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为来源参数和指,比如来源为http://www.google.com/?p=BlackSoul& amp;q=javascript,则urp[0]="p",urp[1]="q" 相对应的urpv[0]="BlackSoul",urpv[1]="javascript".
但是最终传输的时候是以分隔符的形式传递给服务器端的.
GUID为随机数,google是这么做的.当初没有想通为什么要保存一个随机数,后来分析数据的才明白过来.为了验证用户的唯一性.
以下是函数处理:
//-----------------------------比较url,如果为搜索引擎则保存关键字-------------
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转换为地址和页面参数和参数值 参数uri为页面地址
function gethn(uri)
{
if(!uri || uri == "") return "";
ur = uri;
var sub;
//带参数
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);
}

//--------------------------设置异步传输-----------------------------------
function createXMLHttpRequest()
{
if (window.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
return new ActiveXObject("Microsoft.XMLHttp");
}
} 以上的方法可以取得一些基本信息.但是关键的问题还是设置用户cookie,判断回访,判断最后一次访问时间,并设置其GUID.这里看了很久没有发现google是怎么做的...于是自己想了一些笨办法.见一下代码:
//浏览器特征信息
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();
}

//-----------------------获得当前地址-----------------------------
function getHref()
{
return document.location.href;
}

//-----------------------cookie操作开始 -----------------------------------------------------------------------------------------------------------------

function setCookie(name, value)
//设定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)
{
//设置过期时间24小时
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";
}
}

//---------------------获得注册用户cookie---------------------------------------------
function getRegUserCookie()
{
return ;
}
//-----------------------------cookie 操作完毕 ------------------------------------------------------------------------------------------------------------

//---------------------------得操作系统---------------------------
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);
}
需要说明的一点是GetResidentTime这个函数,google采用了img.load的方法加载了接收处理信息页面的,需要再服务器端配置将后 缀为.gif或你所取的其他形式的文件使用aspx的方式编译运行.因为我原来考虑的是使用xmlHttp异步调用.但是页面退出的时候有时候不执行.所 以就弃用了.代码如下: 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();}

//进入页面的信息
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();}
}
} 最后就是调用了.我使用了window.onunload = GetResidentTime
传递的参数大家可以打印出来看一下.应该可以明白其意思.
剩下的就是服务器端的处理了,在服务器端处理其实相当简单.取得request的值,验证并保存入数据库.现在有了数据,分析的事情就由用户按照自己的要求来处理了..补充一句,ip地址是由服务器端来取得保存的.
使用的时候记得一定将其放到服务器端,然后使用<javascript language="javascript" type="text/javascript" src=服务器地址 路径 "statistics.js"> </script> 附上完整的代码http://www.cnblogs.com/Files/BlackSoul/statistic.rar下载.
该例子我在IE,firefox,netscape下面测试都很正常.搞了一个月,总算有所成就了.但是还有很多需要改进的地方,希望做过的,感兴趣的朋友多多指点交流.

http://blacksoul.cnblogs.com/archive/2006/05/19/404563.html

分享到:
评论

相关推荐

    gatsby-plugin-gdpr-cookies:Gatsby插件,可将Google Analytics(分析),Google Tag Manager和Google Pixel Manager以gdpr形式添加到您的网站

    gatsby-plugin-gdpr-cookies Gatsby插件以GDPR形式将Google Analytics(分析)(支持V4),Google Tag Manager和Facebook Pixel添加到您的网站。 版本2:我确实重写了整个插件,以删除之前完成的所有ssr。 这将确保...

    08cms房产网代码

    10. **数据分析**:为了追踪网站性能和用户行为,08cms可能集成了Google Analytics或其他统计工具,以便分析流量、用户来源、停留时间等数据。 11. **API接口**:对于与其他系统集成,08cms可能提供了API接口,如...

    PHP实例开发源码—ClickHeat网站热图生成工具.zip

    4. 集成其他服务:例如,将ClickHeat的数据与其他分析工具(如Google Analytics)整合,进行更深入的分析。 总结,ClickHeat是一个强大的PHP网站热图工具,它不仅提供了直观的用户行为分析,还为开发者提供了丰富的...

    将IETF ID url重写为工具或Datatracker。「Rewrite IETF ID URLs to Tools or Datatracker」-crx插件

    它使用Google Analytics(分析)跟踪有多少人安装/使用了扩展程序(因此,我知道是否值得花时间对其进行更新,等等。如果这冒犯了您,请告诉我,我将向您发送一个没有跟踪内容的版本)。 版本日志:1.0.4.0:-添加了...

    html5boilerplate专业的前端模板构建快速健壮适应性强的web应用或网站

    7. Google Analytics:模板中包含了一个可定制的Google Analytics代码段,方便集成网站统计分析,便于监控和优化网站流量。 8. 404错误页面和robots.txt:提供预定义的404错误页面模板和robots.txt文件,帮助管理和...

    谷歌师兄的leetcode刷题笔记-TinyCranes:https://www.tinycranes.com/

    谷歌师兄的leetcode刷题笔记 概括 这是我个人网站的完整源代码。 这有点乱,但如果你有兴趣,那就去吧。 它最初是使用 静态生成的,所以我在 Node.js 上很快地将它放在一起。 未来的重写很可能会使用 Python 或具有...

    商贸网站系统源码

    12. **统计分析**:通过Google Analytics或其他工具集成,收集并分析用户行为数据,以便优化网站性能和营销策略。 13. **响应式设计**:确保网站在不同设备(如PC、平板、手机)上都能良好显示,适应多屏时代的需求...

    Angular-angular-gtag.zip

    Angular-angular-gtag.zip,用于angularangular gtag.js的google analytics gtag.js,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入。angular的设计目的是全面解决...

    基于ASP的企业营销型网站源码.zip

    - 客户跟踪和分析:可能涉及到集成Google Analytics或其他跟踪代码,收集用户行为数据。 - 营销功能:如购物车、支付接口、优惠券、订阅服务等的实现。 总的来说,这个基于ASP的企业营销型网站源码为学习和实践Web...

    PHP实例开发源码—DM企业建站系统 v2021.zip

    11. **数据分析**:系统可能内置或者支持集成Google Analytics或其他分析工具,以便跟踪和分析网站流量、用户行为等数据。 12. **响应式布局**:随着移动设备的普及,DM系统应具备响应式设计,自动调整网页布局以...

    南岳衡山旅游网(基于科汛cms) v5.5-ASP源码.zip

    6. 统计分析:集成Google Analytics或其他统计工具,追踪网站流量和用户行为。 开发者可以通过学习和研究这个源码,了解ASP编程技巧、CMS系统架构以及旅游网站的常见功能实现。同时,对于想要自建旅游网站的企业或...

    商业编程-源码-简单美观文章管理.zip

    9. **API集成**:商业环境中的系统往往需要与其他服务集成,如社交媒体分享按钮、第三方统计工具(如Google Analytics)、支付网关等。这需要通过API接口进行通信。 10. **性能优化**:为了提供良好的用户体验,...

    郑平国博客源码

    9. **插件与扩展**:Ality主题可能支持多种插件,如评论系统(Disqus、Gitalk)、统计分析工具(Google Analytics)或社交媒体分享按钮。 10. **响应式设计**:考虑到多设备访问,源码会采用响应式布局,确保在手机...

    ASP.NET一些有关搜索引擎的源码资料

    还有可能涉及如何集成Google Analytics或其他分析工具,以便跟踪和分析网站流量,为SEO决策提供数据支持。 总之,这个源码集合为开发者提供了一个深入理解并实施ASP.NET中SEO策略的宝贵资源。通过学习和实践,...

    某电脑公司整站程序

    10. **数据分析**:可能包含Google Analytics或其他分析工具的集成,以便监控和分析网站流量、用户行为等数据。 【标签】:“某电脑行业有限公司”表明这是一个针对电脑行业的公司定制的整站程序,因此可能特别注重...

    基于ASP的推广系统源码.zip

    10. **第三方集成**:可能集成了跟踪代码(如Google Analytics)、支付接口(如PayPal)或其他第三方服务。 要深入理解并使用这个源码,需要具备ASP编程、Web开发、数据库管理和网络安全等相关知识。对于开发者来说...

    ga4-ecom-to-eec-converter:GTM模板变量,可将GA4电子商务转换为GA增强型电子商务

    GA4电子商务到增强型电子商务转换器通过Google跟踪代码管理器变量,可以将转换为。 如果您想实施GA4电子商务,但同时需要并行运行Universal Analytics Enhanced电子商务,则此功能非常有用。 此GTM变量还可以将...

    Laravel开发-seo

    - 集成Google Analytics或其他分析工具,追踪用户行为,了解哪些页面最受欢迎,以便优化内容策略。 - 利用Laravel事件系统记录用户行为,为SEO决策提供数据支持。 9. **SEO工具集成**: - 可以通过Composer安装...

    JTBC内容管理系统(PHP) 企业版.7z

    11. 统计与分析:为了帮助企业了解用户行为,系统可能集成了访问统计和数据分析工具,如Google Analytics,以跟踪和报告网站性能。 12. 多语言支持:考虑到全球化需求,JTBC内容管理系统可能支持多语言环境,方便...

    搜索引擎优化高级编程(asp.net版)源码 Professional SEO with ASP

    书中可能包含如何使用Google Analytics、Google Search Console等工具进行数据分析。 通过学习《搜索引擎优化高级编程(asp.net版)源码》,开发者不仅能掌握理论知识,还能通过实际操作理解如何将SEO策略融入到ASP...

Global site tag (gtag.js) - Google Analytics