器→工具, 工具软件, 数据, 术→技巧

深入分析Google Analytics原理与实现

钱魏Way · · 1,811 次浏览

以下内容是自己十年前整理的,期间翻看了Google Analytics的所有帮助文档,查看了商业版本的Urchin及代码。最终对Google Analytics有了大致了解,并基于实际需求,搭建了一套更加完善的数据跟踪体系,相关资料分享给大家。

Google Analytics的技术框架

Google Analytics功能非常强大,只要在网站的页面上加入一段代码,就可以提供的丰富详尽的图表式报告。Google Analytics的数据采集功能是采用AJAX技术来实现,整体架构如图所示:

在使用Google Analytics需要在网站上加上跟踪代码(Google Analytics Tracking Code,简称GATC),谷歌分析跟踪代码(GATC) 检索网页数据如下:

  • 浏览器请求的网页包含跟踪代码。
  • GATC创建并初始化一个对象的属性与网络相关的跟踪ID在代码中。
  • GATC执行你自定义任何跟踪方法。
  • 跟踪代码初始化和管理以下信息:跟踪检索查看是否包括广告系列;收集HTTP请求中的各种用户信息的到Google GATC。
  • 将访问者HTTP请求包含GATC跟踪信息收集到参数名单。

看了上面的说明,或许你还是不明白Google Analytics的具体原理,下面就进行更深层次的剖析。

Google Analytics收集的信息

当我们访问带有Google Analyitcs追踪代码的页面时,页面中的GA追踪代码被执行,然后会向Google服务器发送一个1像素的图片请求。(http://www.google-analytics.com/__utm.gif )并将所收集到的数据作为请求__utm.gif图片链接的变量一起发送回google服务器。然后经过google服务器的处理发布到我们的数据报告里。Google Analytics统计代码中的Javascript的主要作用是给请求URL赋值。

例如:当访问www.douban.com首页的时候,Google Analyitcs就会发回这样一条数据给Google服务器。

http://www.google-analytics.com/__utm.gif?utmwv=4.8.9&utmn=444576131&utmhn=www.douban.com&utmcs=utf-8&utmsr=1280×768&utmsc=32-bit&utmul=zh-cn&utmje=1&utmfl=10.2%20r152&utmdt=%E8%B1%86%E7%93%A3&utmhid=974895699&utmr=-&utmp=%2F&utmac=UA-7019765-1&utmcc=__utma%3D30149280.845782037.1298725704.1298782111.1299505037.3%3B%2B__utmz%3D30149280.1298725704.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmu=qBM

Google到底追踪到了哪些数据呢?通过分析链接里的这些变量,我们就可以知道个大概了。

  • http://www.google-analytics.com/__utm.gif  请求文件地址
  • ?utmwv=4.8.9 Google Analyitcs追踪代码的版本
  • &utmn=444576131 utm.gif的唯一ID编号,防止GIF图像缓存
  • &utmhn=www.douban.com  用户访问的主机名(就是我域名)
  • &utmcs=UTF-8 用户浏览器语言编码
  • &utmsr=1280×768 用户屏幕分辨率
  • &utmsc=32-bit 用户的屏幕颜色
  • &utmul=zh-cn 用户浏览器语言设置
  • &utmje=1 用户浏览器是否支持JAVA
  • &utmfl=10.2%20r152 Flash的版本
  • &utmdt=%E8%B1%86%E7%93%A3 当前网页的标题(title里的内容),在这里是经过编码的字符串。
  • &utmhid=974895699 随机数字
  • &utmr=- 流量来源,这里为直接来源。
  • &utmp=%2F 当前页面产生的请求,记录你在这个页面的点击行为及其他自定义的返回值。
  • &utmac=UA-7019765-1 帐户字符串。在所有请求中显示。
  • &utmcc=__utma%3D30149280.845782037.1298725704.1298782111.1299505037.3%3B%2B__utmz%3D30149280.1298725704.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B 用户Cookie数据。
  • &utmu=qBM
  • &utmcc=__utma%3D30149280.845782037.1298725704.1298782111.1299505037.3%3B%2B__utmz%3D30149280.1298725704.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B

以上都是Cookie里存储的数据,__utma用来分析唯一用户,访问次数,停留时间,新访或回访等等。__utmz用来记录流量来源。__utmv存储细分用户所定义的值。

以上这些并不是全部的返回数据,只是Google Analyitcs追踪的基本数据。如果你的网站开通了电子商务追踪功能或是你自定义了事件追踪。那么在返回Google服务器的链接中就会看到更多的变量值。比如:

  • &utme 事件追踪数据
  • &utmipc 用户购买的产品编号
  • &utmipn用户购买的产品名称
  • &utmipr 用户购买的产品单价
  • &utmtsp 运费
  • &utmttx 税款

当你使用Google Analytics分析时需要你创建 Google Analytics的用户“网站配置文件” ,创建“网站配置文件”的目的是为了方便网站多个管理员从各种对网站不同的关注角度对网站的访问进行分析,每个用户之间的分析数据也是私密性的,尽管它可能需要几分钟额外设立一个新的帐户配置文件,它通常是值得的,因为它可以帮助访问安全性和数据完整性,确保能给你更准确和有用的信息。

Google Analytics中organic和referral的区别

刚接触Google Analytics的朋友可能对流量来源媒介中的organic和referral表示困惑。下面就来一起认识下这两个扰人的英文单词到底是什么意思。

简单的说organic代表的是来自搜索引擎的流量(正常情况下包括竞价+非竞价)。referral的流量就是除organic以外其他网站带过来的流量。除了以上两个,还会出现的搜索引擎渠道为none,意思上是该用户过来的渠道未知或直接来源。

以上区分都是通过获取浏览器中当前访问页面的referer的值进行划分的,查看当前页面的referer的值的最简单方法是在浏览器中输入:javascript:alert(document.referrer) 来获取。如果获取的referer值为空,则此部分流量被归为(direct)/(none)中。产生referer值为空的情况有很多种,一些常见的原因:

  • 用户直接通过浏览器输入的网址,或在其他地方复制了网址在浏览器中打开。
  • 用户通过浏览器中的收藏夹打开网址。
  • 用户通过其他网站或文档中的链接打开网址,比如说Word/PDF/Excel中的链接地址或类似QQ聊天窗口。
  • 用户打开网址前的页面使用的是HTTPS安全协议。
  • 用户通过鼠标拖拽打开的新窗口。
  • 用户通过页面中flash文件中的链接打开。
  • 用户打开的链接使用的是Javascript方式,比如:<a href=”#” onclick=”window.open(‘https://www.biaodianfu.com’)”>标点符</a>
  • 用户访问的页面使用了Location对象,如:location.hostname = www.biaodianfu.com。

上图中给人造成疑惑的主要是baidu/organic和baidu/referral,很多人认为baidu/organic是来自竞价的流量,baidu/referral是来自自然搜索的流量,这是完全错误的。baidu/organic包含自然+竞价的流量,同样的baidu/referral也包含自然+竞价的流量。产生的原因是Google Analytics对国内搜索引擎没有最大程度的支持。

我们使用百度进行搜索时,网址会是:http://www.baidu.com/s?wd=keywords或http://www.baidu.com/s?bs=keyword1&f=8&wd=keyword2 这样的。Google将referer地址中域名包含baidu,查询参数名含有wd的统一归为organic,在上述百度页面中不管你点击的是竞价还是自然链接,都会将流量算进baidu/organic。但是百度除了上述的URL规则以外,还有另外的一套URL机制,即百度联盟搜索的URL,我们以hao123首页上的百度搜索框为例,使用它进行搜索后产生的URL会是:http://www.baidu.com/s?word=keywords&tn=sitehao123,可以看到和从百度首页打开的搜索不一样的是wd变成的word,而Google Analytics并没有将Word过滤进organic,所以此部分URL开发的链接会是baidu/referral。

除了百度以外,国内的很多搜索引擎,如搜狗、有道、搜搜等都没有在Google Analytics的organic的过滤项中,解决方法是在Google Analytics的布置代码中加入:

_gaq.push(['_addOrganic', 'baidu', 'word']);
_gaq.push(['_addOrganic', 'soso', 'w']);
_gaq.push(['_addOrganic', '3721', 'name']);
_gaq.push(['_addOrganic', 'yodao', 'q']);
_gaq.push(['_addOrganic', 'vnet', 'kw']);
_gaq.push(['_addOrganic', 'sogou', 'query']);

Google Analytics为了防止referer地址的丢失和方便网站管理员区分各种渠道的流量,提供了一个通过给链接添加标签的方式来区别流量来源的方法,及在原有的链接地址后面添加utm参数。

Google URL Builder

在Google Analytics里要区分百度的竞价广告和自然流量是有写困难的,Google URL Builder 可以根据自定义跟踪码来区分流量的来源 用户只要自己定义几个参数 URL Builder就能自己生成出新的跟踪代码,URL Builder参数基本有以下几个:

广告系列来源(utm_source) 要求。 使用 utm_source 来标识搜索引擎、简报名称或其他来源。
示例:utm_source=google
广告系列媒介(utm_medium) 要求。 使用 utm_medium 来标识电子邮件或每次点击费用等媒介。
示例:utm_medium=cpc
广告系列字词 (utm_term) 用于付费搜索。 使用 utm_term 来注明此广告的关键字。
示例: utm_term=running+shoes
广告系列内容 (utm_content) 用于 A/B 测试和以网页内容定位的广告。 使用 utm_content 区分指向同一网址的广告或链接。
示例:utm_content=logolink 或 utm_content=textlink
广告系列名称 (utm_campaign) 用于关键字分析。 使用 utm_campaign 来标识特定的产品促销活动或战略性广告系列。
示例:utm_campaign=spring_sale

在URL Builder的官方说明中 utm_source、utm_medium和utm_campaign是必须的。

  • 参考URL1:https://www.biaodianfu.com/?utm_source=gmail&utm_medium=edm&utm_campaign=tell_your_friends
  • 参考URL2:https://www.biaodianfu.com/?utm_source=baidu&utm_medium=cpc&utm_campaign=click_here

如上所示你只需在您自己网站的URL后面添加几个参数即可创建便于GA统计的URL,无需修改您网站上的任何程序,注意到URL Builder构建出来的URL有可能会导致搜索引擎抓取重复的页面,所以使用的时候一定要注意。

Google Analytics Cookies解析

在默认的配置和使用情况下Google Analytics设置不同的cookie,__utma, __utmb, __utmc, __utmz和__utmv。分别用来存储不同的信息。所有的cookie统一使用__utm开头,所以我们看到这三个字母就知道是google的cookie。

__utma=30149280.1874138961.1300022121.1300022121.1300022121.1;+__utmz=30149280.1300023895.1.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=Excel%E5%9B%BE%E8%A1%A8%E4%B9%8B%E9%81%93;

__utma

此 Cookie 通常会在该网络浏览器首次访问您的网站时写入其中。 如果此 Cookie 被浏览器操作者删除,而该浏览器又对您的网站进行了后续访问,一个拥有不同唯一 ID 的 __utma Cookie 将会写入其中。此 Cookie 用于确定您网站的唯一身份访问者,并会在每次网页浏览时获得更新。此外,Google Analytics(分析)会将为此 Cookie 指定的唯一 ID 作为额外的安全措施,以确保此 Cookie 的有效性和可访问性。

__utma的有效期为2年。其中第二组的随机唯一ID和第三组的时间戳联合组成了访问者ID,Google Analytics通过这个ID来辨别网站的唯一访问者。而后面的几个时间戳用户计算网站停留时间和访问次数。

utma Cookie存储的内容:30149280.1874138961.1300022121.1300022121.1300022121.1

  • 第一组数字被叫做“域哈希”,是GA表示这个域的唯一代码。同一域中每个cookie的第一组数据都是“域哈希”,并且值都是一样的。
  • 第二组数字是一个随机产生的唯一ID。
  • 第三,四,五组数字是时间戳,其中第三组数字表示初次访问的时间。第四组数字表示上一次访问的时间,第五组数字表示本次访问开始的时间。
  • 第六组数字是访问次数计数器。这个数字随着访问次数的增加而增加。

__utmb

此 Cookie 用于建立和保持用户与您的网站之间的会话。当用户浏览您网站的某个网页时,Google Analytics(分析)代码会尝试更新此 Cookie。如果未能找到此 Cookie,Google Analytics(分析)会写入一个新的该 Cookie 并建立新的会话。每当用户访问您网站中的其他网页时,此 Cookie 的有效期会重新更新为 30 分钟,因此只要在 30 分钟周期内重复发生了用户活动,单个会话就会一直持续下去。如果用户在您网站中某网页的停留时间超过了 30 分钟,此 Cookie 就会过期。您可以通过 _setSessionCookieTimeout() 方法修改默认的用户会话时间的长度。

__utmc

此 Cookie 会和 __utmb Cookie 结合使用,确定是否为用户建立新的会话。具体来说,此 Cookie 没有特定的有效期,所以它将在用户退出浏览器时失效。如果某用户访问过您的网站后退出了浏览器并在 30 分钟内再次访问了您的网站,该用户将会由于缺少 __utmc Cookie 而必须建立新的会话,尽管事实上 __utmb Cookie 还尚未失效。

__utmz

此 Cookie 会储存访问者到达您的网站通过的引荐类型,即是否通过直接方法、引荐连接、网站搜索或广告系列(例如广告或电子邮件)到达。这些信息会用来计算您网站的搜索引擎流量、广告系列和网页的导航方式。此 Cookie 会在每次网页浏览时获得更新。

_utmz的有效期是6个月,_utmz中存储了所有流量的来源信息。

_utmz的内容中一共有4组数字:30149280.1300023895.1.3.

  • 第一组数字是“域哈希”。
  • 第二组数字是时间戳。
  • 第三组数字是session number。
  • 第四组数字是campaign number 记录通过不同来源访问网站的次数。

utmcsr、utmccn、utmcmd、utmctr、utmcct这些信息代表流量的来源,即存储URL builder的参数。

__utmv

此 Cookie 正常情况下在默认跟踪代码配置中不会出现。__utmv Cookie 通过 _setVar() 方法传递所提供的信息,您可以使用该方法创建自定义用户细分。然后,此字符串将通过 utmcc 参数传递到 GIF 请求网址中记录的 Google Analytics(分析)服务器。仅当您将 _setVar() 方法添加到您网站页面的跟踪代码中时,此 Cookie 才会写入浏览器中。

__utmx

此 Cookie 用于 Website Optimizer,并且仅当您的网页正确安装并配置了 Website Optimizer 跟踪代码时才会设置。当优化脚本执行时,此 Cookie 会储存该访问者针对每个实验所分配到的变量,确保用户在您的网站体验的一致性。有关详情,请参阅 Website Optimizer 帮助中心。

Google Analytics会话定义

Google 在2011年的时候修改了Analalytics 对会话的定义,下面就来分析下Google 为什么要做这样的修改,及修改后对统计到的数据有何影响?

在 Google Analytics(分析)报告界面中,会话个数会被计为访问次数。新来看看Google Analytics 先前Session 的定义是什么样子的。

2011年8月11日前下列事件将终止会话(后续活动将会被视为新会话):

  • 某个访问者的两次网页浏览间隔超过三十分钟;
  • 每天结束的时候;
  • 当一个访问者关闭浏览器时

2011年8月11日后下列事件将终止会话(后续活动将会被视为新会话):

  • 用户退出浏览器。
  • 用户离开了您的网站,并且在会话时间结束之前没有回来。
  • 用户访问您网站上的某个网页,直到会话结束还停留在该网页上(没有触发任何事件或虚拟网页浏览)。
  • 用户清除了其浏览器中的 Cookie。
  • 在该报告的配置文件中设置时区时时间到了午夜。
  • 当访问者的流量来源参数改变时。这些流量来源参数包括:utm_source, utm_medium, utm_term, utm_content, utm_id, utm_campaign, and gclid(autotagging参数)

以下活动不会导致会话结束:

  • 用户在您的网站上打开了多个标签/窗口,并在其中至少一个标签/窗口上保持活动状态。
  • 用户在没有退出浏览器的情况下离开您的网站,并在会话时间结束之前返回。

这次Session的主要变动就是当用户从新的渠道进入网站时会标注新的Session。

对于此次Session的改变,以下为我自己的理解:

  • Session是针对js进行设置的,所以“在该报告的配置文件中设置时区时时间到了午夜”应该不是在ga.js中控制的,因为其无法获取配置文件中设置的时区。并不是按照用户的电脑上的时间进行设置的。需要对Session做这样的设置应该是和数据处理有关。与统计本身无关。认定是Google是在数据处理中财将Seesion终止是因为同个统计可能会有不同的配置时区。
  • Session的改变时为了更好的进行流量归属的划分。能更好的支撑起Google Analytics的多渠道转化。每次新的渠道都会被认为是一次新的访问。

Google Urchin的深入分析

Google Urchin是一个来自Google的日志分析软件,和免费的Google Analytics不同, Urchin 并非免费(许可费为 2995 美元),并且需要有经验的技术人员进行安装。该软件可免费试用30天。

Google Urchin支持的操作系统:

  • FreeBSD 4
  • FreeBSD 5.3+
  • FreeBSD 6.2+
  • 内核为4 或 2.6 的 Linux
  • Windows:Windows 2000、Windows XP、Windows 2003 Server、Windows 2008 Server、Vista

Urchin 的主要功能

  • 能够灵活地自定义:您可以配置 Urchin 来满足您自己的特定需求,也可以根据需要随时处理和重新处理日志文件。
  • 非常适合 Intranet:Urchin 可以分析受防火墙保护的内容,例如没有任何外部互联网连接的企业 Intranet。
  • 页标记或 IP+用户代理:选择最适合您的方法。 您甚至可以让页标记调用您的 Google Analytics(分析)帐户,同时运行两种产品,从而审核处理前与处理后的数据。
  • 高级访问者群体细分功能:可以按照语言、地理位置和其他因素来对访问者的行为进行跨群体细分。
  • 地理定位:找出访问者来源及最有可能赢利的市场。
  • 渠道可视化:消除客户转换瓶颈,减少潜在客户的流失(未转换)数量。
  • 全面的转换指标:查看您的投资回报率 (ROI)、每次点击收入、平均访问者价值等数据。
  • 关键字分析:比较各个搜索引擎和关键字的转换指标。
  • A/B 测试报告:检测横幅广告、电子邮件和关键字,并对广告内容进行优化,以便取得更佳效果。
  • 电子商务分析:跟踪广告系列和关键字带来的交易,获取客户忠诚度和等待时间指标,并查看产品销售方面的报告。
  • 搜索引擎漫游器、服务器错误和文件类型报告:取得报告日志数据所必需的内容。
  • 访问者历史记录细目:能够查看各个访问者的会话/路径、平台、地理位置、浏览器/平台等数据(请注意:此数据为匿名), 借以深入探索访问者的行为。
功能 Urchin 6 Google Analytics(分析)
在自己的服务器上进行安装和管理
可用于受防火墙保护的企业 Intranet
重新处理历史数据(通过日志文件)
可于本地处理/重新处理您的日志文件
可通过标记收集信息
可报告漫游器/Spider 的活动
可报告服务器错误/状态代码
可与 AdWords 紧密集成
可报告付费的搜索广告系列
电子商务/转换报告
地理定位
免费
访问者会话/浏览路径分析
可用来生成自定义报告的原始数据
由授权顾问专门支持

Google Urchin 是 Google Analytics 的前身,通过对Google Urchin 代码的分析可以让你更好的理解Google Analytics的实现原理,更好的了解其整个运行机制。下面是详细的统计代码,已添加注释。

//-- Google Analytics Urchin Module
//-- Copyright 2007 Google, All Rights Reserved.
//-- Urchin On Demand Settings ONLY
var _uacct = ""; // 设置统计账号 set up the Urchin Account
var _userv = 0; // 设置统计模式service mode (0=local,1=remote,2=both)
//-- UTM User Settings
var _ufsc = 1; // 是否收集客户端信息 set client info flag (1=on|0=off)
var _udn = "auto"; // 为域设置Cookie (auto|none|domain) set the domain name for cookies
var _uhash = "on"; // 是否设置域哈希 (on|off) unique domain hash for cookies
var _utimeout = "1800"; // 会话失效时间 set the inactive session timeout in seconds
var _ugifpath = "/__utm.gif"; // 请求图片文件 set the web path to the __utm.gif file
var _utsp = "|"; // Cookie中的内容分隔符 transaction field separator
var _uflash = 1; // 开启flahs版本跟踪 set flash version detect option (1=on|0=off)
var _utitle = 1; // 开启Title内容跟踪 set the document title detect option (1=on|0=off)
var _ulink = 0; // 是否开启跨域跟踪 enable linker functionality (1=on|0=off)
var _uanchor = 0; // 是否收集井号符后面参数 enable use of anchors for campaign (1=on|0=off)
var _utcp = "/"; // cookies存放地址 the cookie path for tracking
var _usample = 100; // 采样百分比 The sampling % of visitors to track (1-100).
//-- UTM Campaign Tracking Settings
var _uctm = 1; // set campaign tracking module (1=on|0=off)
var _ucto = "15768000"; // set timeout in seconds (6 month default)
var _uccn = "utm_campaign"; // name
var _ucmd = "utm_medium"; // medium (cpc|cpm|link|email|organic)
var _ucsr = "utm_source"; // source
var _uctr = "utm_term"; // term/keyword
var _ucct = "utm_content"; // content
var _ucid = "utm_id"; // id number
var _ucno = "utm_nooverride"; // don't override
//-- Auto/Organic Sources and Keywords 搜索引擎来源及关键词参数名
var _uOsr = new Array();
var _uOkw = new Array();
_uOsr[0] = "google";
_uOkw[0] = "q";
_uOsr[1] = "yahoo";
_uOkw[1] = "p";
_uOsr[2] = "msn";
_uOkw[2] = "q";
_uOsr[3] = "aol";
_uOkw[3] = "query";
_uOsr[4] = "aol";
_uOkw[4] = "encquery";
_uOsr[5] = "lycos";
_uOkw[5] = "query";
_uOsr[6] = "ask";
_uOkw[6] = "q";
_uOsr[7] = "altavista";
_uOkw[7] = "q";
_uOsr[8] = "netscape";
_uOkw[8] = "query";
_uOsr[9] = "cnn";
_uOkw[9] = "query";
_uOsr[10] = "looksmart";
_uOkw[10] = "qt";
_uOsr[11] = "about";
_uOkw[11] = "terms";
_uOsr[12] = "mamma";
_uOkw[12] = "query";
_uOsr[13] = "alltheweb";
_uOkw[13] = "q";
_uOsr[14] = "gigablast";
_uOkw[14] = "q";
_uOsr[15] = "voila";
_uOkw[15] = "rdata";
_uOsr[16] = "virgilio";
_uOkw[16] = "qs";
_uOsr[17] = "live";
_uOkw[17] = "q";
_uOsr[18] = "baidu";
_uOkw[18] = "wd";
_uOsr[19] = "alice";
_uOkw[19] = "qs";
_uOsr[20] = "yandex";
_uOkw[20] = "text";
_uOsr[21] = "najdi";
_uOkw[21] = "q";
_uOsr[22] = "aol";
_uOkw[22] = "q";
_uOsr[23] = "club-internet";
_uOkw[23] = "q";
_uOsr[24] = "mama";
_uOkw[24] = "query";
_uOsr[25] = "seznam";
_uOkw[25] = "q";
_uOsr[26] = "search";
_uOkw[26] = "q";
_uOsr[27] = "szukaj";
_uOkw[27] = "szukaj";
_uOsr[28] = "szukaj";
_uOkw[28] = "qt";
_uOsr[29] = "netsprint";
_uOkw[29] = "q";
_uOsr[30] = "google.interia";
_uOkw[30] = "q";
_uOsr[31] = "szukacz";
_uOkw[31] = "q";
_uOsr[32] = "yam";
_uOkw[32] = "k";
_uOsr[33] = "pchome";
_uOkw[33] = "q";
_uOsr[34] = "bing";
_uOkw[34] = "q";
//-- Auto/Organic Keywords to Ignore 设置忽略关键词
var _uOno = new Array();
//_uOno[0]="urchin";
//_uOno[1]="urchin.com";
//_uOno[2]="<a href="http://www.urchin.com" data-mce-href="http://www.urchin.com">www.urchin.com</a>";
//-- Referral domains to Ignore 设置忽略直接来源域
var _uRno = new Array();
//_uRno[0]=".urchin.com";
//-- **** Don't modify below this point ***
var _uff, _udh, _udt, _ubl = 0,
_udo = "",
_uu, _ufns = 0,
_uns = 0,
_ur = "-",
_ufno = 0,
_ust = 0,
_ubd = document,
_udl = _ubd.location,
_udlh = "",
_uwv = "1";
var _ugifpath2 = "<a href="
http: //www.google-analytics.com/__utm.gif" data-mce-href="http://www.google-analytics.com/__utm.gif">http://www.google-analytics.com/__utm.gif</a>";
if (_udl.hash) _udlh = _udl.href.substring(_udl.href.indexOf('#'));
if (_udl.protocol == "https:") _ugifpath2 = "<a href="
https: //ssl.google-analytics.com/__utm.gif" data-mce-href="https://ssl.google-analytics.com/__utm.gif">https://ssl.google-analytics.com/__utm.gif</a>";
if (!_utcp || _utcp == "") _utcp = "/";
var _ecm = {};
_ecm['\''] = "'0";
_ecm[')'] = "'1";
_ecm['*'] = "'2";
_ecm['!'] = "'3";
//统计主方法
function urchinTracker(page, opt) {
if (_udl.protocol == "file:") return;
if (_uff && (!page || page == "")) return;
var a, b, c, xx, v, z, k, x = "",
s = "",
f = 0;
var nx = " expires=" + _uNx() + ";";
var dc = _ubd.cookie;
_udh = _uDomain();
if (!_uVG()) return;
_uu = Math.round(Math.random() * 2147483647);
_udt = new Date();
_ust = Math.round(_udt.getTime() / 1000);
a = dc.indexOf("__utma=" + _udh);
b = dc.indexOf("__utmb=" + _udh);
c = dc.indexOf("__utmc=" + _udh);
if (_udn && _udn != "") {
_udo = " domain=" + _udn + ";";
}
if (_utimeout && _utimeout != "") {
x = new Date(_udt.getTime() + (_utimeout * 1000));
x = " expires=" + x.toGMTString() + ";";
}
if (_ulink) {
if (_uanchor && _udlh && _udlh != "") s = _udlh + "&";
s += _udl.search;
if (s && s != "" && s.indexOf("__utma=") >= 0) {
if (!(_uIN(a = _uGC(s, "__utma=", "&")))) a = "-";
if (!(_uIN(b = _uGC(s, "__utmb=", "&")))) b = "-";
if (!(_uIN(c = _uGC(s, "__utmc=", "&")))) c = "-";
v = _uGC(s, "__utmv=", "&");
z = _uGC(s, "__utmz=", "&");
k = _uGC(s, "__utmk=", "&");
xx = _uGC(s, "__utmx=", "&");
if ((k * 1) != ((_uHash(a + b + c + xx + z + v) * 1) + (_udh * 1))) {
_ubl = 1;
a = "-";
b = "-";
c = "-";
xx = "-";
z = "-";
v = "-";
}
if (a != "-" && b != "-" && c != "-") f = 1;
else if (a != "-") f = 2;
}
}
if (f == 1) {
_ubd.cookie = "__utma=" + a + "; path=" + _utcp + ";" + nx + _udo;
_ubd.cookie = "__utmb=" + b + "; path=" + _utcp + ";" + x + _udo;
_ubd.cookie = "__utmc=" + c + "; path=" + _utcp + ";" + _udo;
} else if (f == 2) {
a = _uFixA(s, "&", _ust);
_ubd.cookie = "__utma=" + a + "; path=" + _utcp + ";" + nx + _udo;
_ubd.cookie = "__utmb=" + _udh + "; path=" + _utcp + ";" + x + _udo;
_ubd.cookie = "__utmc=" + _udh + "; path=" + _utcp + ";" + _udo;
_ufns = 1;
} else if (a >= 0 && b >= 0 && c >= 0) {
_ubd.cookie = "__utmb=" + _udh + "; path=" + _utcp + ";" + x + _udo;
} else {
if (a >= 0) a = _uFixA(_ubd.cookie, ";", _ust);
else a = _udh + "." + _uu + "." + _ust + "." + _ust + "." + _ust + ".1";
_ubd.cookie = "__utma=" + a + "; path=" + _utcp + ";" + nx + _udo;
_ubd.cookie = "__utmb=" + _udh + "; path=" + _utcp + ";" + x + _udo;
_ubd.cookie = "__utmc=" + _udh + "; path=" + _utcp + ";" + _udo;
_ufns = 1;
}
if (_ulink && xx && xx != "" && xx != "-") {
xx = _uUES(xx);
if (xx.indexOf(";") == -1) _ubd.cookie = "__utmx=" + xx + "; path=" + _utcp + ";" + nx + _udo;
}
if (_ulink && v && v != "" && v != "-") {
v = _uUES(v);
if (v.indexOf(";") == -1) _ubd.cookie = "__utmv=" + v + "; path=" + _utcp + ";" + nx + _udo;
}
_uInfo(page, opt);
_ufns = 0;
_ufno = 0;
if (!page || page == "") _uff = 1;
}
//发送页面信息请求
function _uInfo(page, opt) {
var p, s = "",
dm = "",
pg = _udl.pathname + _udl.search;
if (page && page != "") pg = _uES(page, 1);
_ur = _ubd.referrer;
if (!_ur || _ur == "") {
_ur = "-";
} else {
dm = _ubd.domain;
if (_utcp && _utcp != "/") dm += _utcp;
p = _ur.indexOf(dm);
if ((p >= 0) && (p <= 8)) {
_ur = "0";
}
if (_ur.indexOf("[") == 0 && _ur.lastIndexOf("]") == (_ur.length - 1)) {
_ur = "-";
}
}
s += "&utmn=" + _uu;
if (opt) s += opt;
if (_ufsc) s += _uBInfo();
if (_uctm) s += _uCInfo();
if (_utitle && _ubd.title && _ubd.title != "") s += "&utmdt=" + _uES(_ubd.title);
if (_udl.hostname && _udl.hostname != "") s += "&utmhn=" + _uES(_udl.hostname);
s += "&utmr=" + _ur;
s += "&utmp=" + pg;
if ((_userv == 0 || _userv == 2) && _uSP()) {
var i = new Image(1, 1);
i.src = _ugifpath + "?" + "utmwv=" + _uwv + s;
i.onload = function() {
_uVoid();
}
}
if ((_userv == 1 || _userv == 2) && _uSP()) {
var i2 = new Image(1, 1);
i2.src = _ugifpath2 + "?" + "utmwv=" + _uwv + s + "&utmac=" + _uacct + "&utmcc=" + _uGCS();
i2.onload = function() {
_uVoid();
}
}
return;
}
//定义返回
function _uVoid() {
return;
}
//设置Cookies信息
function _uCInfo() {
if (!_ucto || _ucto == "") {
_ucto = "15768000";
}
if (!_uVG()) return;
var c = "",
t = "-",
t2 = "-",
t3 = "-",
o = 0,
cs = 0,
cn = 0,
i = 0,
z = "-",
s = "";
if (_uanchor && _udlh && _udlh != "") s = _udlh + "&";
s += _udl.search;
var x = new Date(_udt.getTime() + (_ucto * 1000));
var dc = _ubd.cookie;
x = " expires=" + x.toGMTString() + ";";
if (_ulink && !_ubl) {
z = _uUES(_uGC(s, "__utmz=", "&"));
if (z != "-" && z.indexOf(";") == -1) {
_ubd.cookie = "__utmz=" + z + "; path=" + _utcp + ";" + x + _udo;
return "";
}
}
z = dc.indexOf("__utmz=" + _udh);
if (z > -1) {
z = _uGC(dc, "__utmz=" + _udh, ";");
} else {
z = "-";
}
t = _uGC(s, _ucid + "=", "&");
t2 = _uGC(s, _ucsr + "=", "&");
t3 = _uGC(s, "gclid=", "&");
if ((t != "-" && t != "") || (t2 != "-" && t2 != "") || (t3 != "-" && t3 != "")) {
if (t != "-" && t != "") c += "utmcid=" + _uEC(t);
if (t2 != "-" && t2 != "") {
if (c != "") c += "|";
c += "utmcsr=" + _uEC(t2);
}
if (t3 != "-" && t3 != "") {
if (c != "") c += "|";
c += "utmgclid=" + _uEC(t3);
}
t = _uGC(s, _uccn + "=", "&");
if (t != "-" && t != "") c += "|utmccn=" + _uEC(t);
else c += "|utmccn=(not+set)";
t = _uGC(s, _ucmd + "=", "&");
if (t != "-" && t != "") c += "|utmcmd=" + _uEC(t);
else c += "|utmcmd=(not+set)";
t = _uGC(s, _uctr + "=", "&");
if (t != "-" && t != "") c += "|utmctr=" + _uEC(t);
else {
t = _uOrg(1);
if (t != "-" && t != "") c += "|utmctr=" + _uEC(t);
}
t = _uGC(s, _ucct + "=", "&");
if (t != "-" && t != "") c += "|utmcct=" + _uEC(t);
t = _uGC(s, _ucno + "=", "&");
if (t == "1") o = 1;
if (z != "-" && o == 1) return "";
}
if (c == "-" || c == "") {
c = _uOrg();
if (z != "-" && _ufno == 1) return "";
}
if (c == "-" || c == "") {
if (_ufns == 1) c = _uRef();
if (z != "-" && _ufno == 1) return "";
}
if (c == "-" || c == "") {
if (z == "-" && _ufns == 1) {
c = "utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)";
}
if (c == "-" || c == "") return "";
}
if (z != "-") {
i = z.indexOf(".");
if (i > -1) i = z.indexOf(".", i + 1);
if (i > -1) i = z.indexOf(".", i + 1);
if (i > -1) i = z.indexOf(".", i + 1);
t = z.substring(i + 1, z.length);
if (t.toLowerCase() == c.toLowerCase()) cs = 1;
t = z.substring(0, i);
if ((i = t.lastIndexOf(".")) > -1) {
t = t.substring(i + 1, t.length);
cn = (t * 1);
}
}
if (cs == 0 || _ufns == 1) {
t = _uGC(dc, "__utma=" + _udh, ";");
if ((i = t.lastIndexOf(".")) > 9) {
_uns = t.substring(i + 1, t.length);
_uns = (_uns * 1);
}
cn++;
if (_uns == 0) _uns = 1;
_ubd.cookie = "__utmz=" + _udh + "." + _ust + "." + _uns + "." + cn + "." + c + "; path=" + _utcp + "; " + x + _udo;
}
if (cs == 0 || _ufns == 1) return "&utmcn=1";
else return "&utmcr=1";
}
//引荐网站来源的解析
//utmcsr 来源域名
//utmcct 来源域名下的路径
function _uRef() {
if (_ur == "0" || _ur == "" || _ur == "-") return "";
var i = 0,
h, k, n;
if ((i = _ur.indexOf("://")) < 0) return "";
h = _ur.substring(i + 3, _ur.length);
if (h.indexOf("/") > -1) {
k = h.substring(h.indexOf("/"), h.length);
if (k.indexOf("?") > -1) k = k.substring(0, k.indexOf("?"));
h = h.substring(0, h.indexOf("/"));
}
h = h.toLowerCase();
n = h;
if ((i = n.indexOf(":")) > -1) n = n.substring(0, i);
for (var ii = 0; ii < _uRno.length; ii++) {
if ((i = n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length == (i + _uRno[ii].length)) {
_ufno = 1;
break;
}
}
if (h.indexOf("<a href="
http: //www.&quot;)==0" data-mce-href="http://www.&quot;)==0">www.")==0</a>) h=h.substring(4,h.length);
return "utmccn=(referral)|utmcsr=" + _uEC(h) + "|" + "utmcct=" + _uEC(k) + "|utmcmd=referral";
}
//搜索引擎来源的解析
function _uOrg(t) {
if (_ur == "0" || _ur == "" || _ur == "-") return "";
var i = 0,
h, k;
if ((i = _ur.indexOf("://")) < 0) return "";
h = _ur.substring(i + 3, _ur.length);
if (h.indexOf("/") > -1) {
h = h.substring(0, h.indexOf("/"));
}
for (var ii = 0; ii < _uOsr.length; ii++) {
if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) {
if ((i = _ur.indexOf("?" + _uOkw[ii] + "=")) > -1 || (i = _ur.indexOf("&" + _uOkw[ii] + "=")) > -1) {
k = _ur.substring(i + _uOkw[ii].length + 2, _ur.length);
if ((i = k.indexOf("&")) > -1) k = k.substring(0, i);
for (var yy = 0; yy < _uOno.length; yy++) {
if (_uOno[yy].toLowerCase() == k.toLowerCase()) {
_ufno = 1;
break;
}
}
if (t) return _uEC(k);
else return "utmccn=(organic)|utmcsr=" + _uEC(_uOsr[ii]) + "|" + "utmctr=" + _uEC(k) + "|utmcmd=organic";
}
}
}
return "";
}
//获取浏览器信息
function _uBInfo() {
var sr = "-",
sc = "-",
ul = "-",
fl = "-",
cs = "-",
je = 1;
var n = navigator;
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;
}
if (n.language) {
ul = n.language.toLowerCase();
} else if (n.browserLanguage) {
ul = n.browserLanguage.toLowerCase();
}
je = n.javaEnabled() ? 1 : 0;
if (_uflash) fl = _uFlash();
if (_ubd.characterSet) cs = _uES(_ubd.characterSet);
else if (_ubd.charset) cs = _uES(_ubd.charset);
return "&utmcs=" + cs + "&utmsr=" + sr + "&utmsc=" + sc + "&utmul=" + ul + "&utmje=" + je + "&utmfl=" + fl;
}
//电子商务功能
//交易
//utmtid 订单 ID,为网址编码字符串。
//utmtst 关联企业。通常用于电子商务中的实体商户。
//utmtto 总计。单位和价格的值。
//utmttx 税款。单位和价格的值。
//utmtsp 运费,单位和价格的值。
//utmtci 帐单邮寄地址所在城市。
//utmtrg 帐单邮寄地址所在区域,为网址编码字符串。
//utmtco 帐单邮寄地址所在国家/地区
//商品
//utmtid
//utmipc 产品码。这是一个特定产品SKU码
//utmipn 产品名称,是一个URL-encoded 字串
//utmiva Variations on an item. For example: large, medium, small, pink, white, black, green. String is URL-encoded.
//utmipr 单品价格。仅美元格式
//utmiqt 数量
//utmwv 跟踪代码版本
function __utmSetTrans() {
var e;
if (_ubd.getElementById) e = _ubd.getElementById("utmtrans");
else if (_ubd.utmform && _ubd.utmform.utmtrans) e = _ubd.utmform.utmtrans;
if (!e) return;
var l = e.value.split("UTM:");
var i, i2, c;
if (_userv == 0 || _userv == 2) i = new Array();
if (_userv == 1 || _userv == 2) {
i2 = new Array();
c = _uGCS();
}
for (var ii = 0; ii < l.length; ii++) {
l[ii] = _uTrim(l[ii]);
if (l[ii].charAt(0) != 'T' && l[ii].charAt(0) != 'I') continue;
var r = Math.round(Math.random() * 2147483647);
if (!_utsp || _utsp == "") _utsp = "|";
var f = l[ii].split(_utsp),
s = "";
if (f[0].charAt(0) == 'T') {
s = "&utmt=tran" + "&utmn=" + r;
f[1] = _uTrim(f[1]);
if (f[1] && f[1] != "") s += "&utmtid=" + _uES(f[1]);
f[2] = _uTrim(f[2]);
if (f[2] && f[2] != "") s += "&utmtst=" + _uES(f[2]);
f[3] = _uTrim(f[3]);
if (f[3] && f[3] != "") s += "&utmtto=" + _uES(f[3]);
f[4] = _uTrim(f[4]);
if (f[4] && f[4] != "") s += "&utmttx=" + _uES(f[4]);
f[5] = _uTrim(f[5]);
if (f[5] && f[5] != "") s += "&utmtsp=" + _uES(f[5]);
f[6] = _uTrim(f[6]);
if (f[6] && f[6] != "") s += "&utmtci=" + _uES(f[6]);
f[7] = _uTrim(f[7]);
if (f[7] && f[7] != "") s += "&utmtrg=" + _uES(f[7]);
f[8] = _uTrim(f[8]);
if (f[8] && f[8] != "") s += "&utmtco=" + _uES(f[8]);
} else {
s = "&utmt=item" + "&utmn=" + r;
f[1] = _uTrim(f[1]);
if (f[1] && f[1] != "") s += "&utmtid=" + _uES(f[1]);
f[2] = _uTrim(f[2]);
if (f[2] && f[2] != "") s += "&utmipc=" + _uES(f[2]);
f[3] = _uTrim(f[3]);
if (f[3] && f[3] != "") s += "&utmipn=" + _uES(f[3]);
f[4] = _uTrim(f[4]);
if (f[4] && f[4] != "") s += "&utmiva=" + _uES(f[4]);
f[5] = _uTrim(f[5]);
if (f[5] && f[5] != "") s += "&utmipr=" + _uES(f[5]);
f[6] = _uTrim(f[6]);
if (f[6] && f[6] != "") s += "&utmiqt=" + _uES(f[6]);
}
if ((_userv == 0 || _userv == 2) && _uSP()) {
i[ii] = new Image(1, 1);
i[ii].src = _ugifpath + "?" + "utmwv=" + _uwv + s;
i[ii].onload = function() {
_uVoid();
}
}
if ((_userv == 1 || _userv == 2) && _uSP()) {
i2[ii] = new Image(1, 1);
i2[ii].src = _ugifpath2 + "?" + "utmwv=" + _uwv + s + "&utmac=" + _uacct + "&utmcc=" + c;
i2[ii].onload = function() {
_uVoid();
}
}
}
return;
}
//捕获flash版本信息
function _uFlash() {
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;
}
//跨域GET参数
function __utmLinker(l, h) {
if (!_ulink) return;
var p, k, a = "-",
b = "-",
c = "-",
x = "-",
z = "-",
v = "-";
var dc = _ubd.cookie;
if (!l || l == "") return;
var iq = l.indexOf("?");
var ih = l.indexOf("#");
if (dc) {
a = _uES(_uGC(dc, "__utma=" + _udh, ";"));
b = _uES(_uGC(dc, "__utmb=" + _udh, ";"));
c = _uES(_uGC(dc, "__utmc=" + _udh, ";"));
x = _uES(_uGC(dc, "__utmx=" + _udh, ";"));
z = _uES(_uGC(dc, "__utmz=" + _udh, ";"));
v = _uES(_uGC(dc, "__utmv=" + _udh, ";"));
k = (_uHash(a + b + c + x + z + v) * 1) + (_udh * 1);
p = "__utma=" + a + "&__utmb=" + b + "&__utmc=" + c + "&__utmx=" + x + "&__utmz=" + z + "&__utmv=" + v + "&__utmk=" + k;
}
if (p) {
if (h && ih > -1) return;
if (h) {
_udl.href = l + "#" + p;
} else {
if (iq == -1 && ih == -1) _udl.href = l + "?" + p;
else if (ih == -1) _udl.href = l + "&" + p;
else if (iq == -1) _udl.href = l.substring(0, ih - 1) + "?" + p + l.substring(ih);
else _udl.href = l.substring(0, ih - 1) + "&" + p + l.substring(ih);
}
} else {
_udl.href = l;
}
}
//跨域POST参数
function __utmLinkPost(f, h) {
if (!_ulink) return;
var p, k, a = "-",
b = "-",
c = "-",
x = "-",
z = "-",
v = "-";
var dc = _ubd.cookie;
if (!f || !f.action) return;
var iq = f.action.indexOf("?");
var ih = f.action.indexOf("#");
if (dc) {
a = _uES(_uGC(dc, "__utma=" + _udh, ";"));
b = _uES(_uGC(dc, "__utmb=" + _udh, ";"));
c = _uES(_uGC(dc, "__utmc=" + _udh, ";"));
x = _uES(_uGC(dc, "__utmx=" + _udh, ";"));
z = _uES(_uGC(dc, "__utmz=" + _udh, ";"));
v = _uES(_uGC(dc, "__utmv=" + _udh, ";"));
k = (_uHash(a + b + c + x + z + v) * 1) + (_udh * 1);
p = "__utma=" + a + "&__utmb=" + b + "&__utmc=" + c + "&__utmx=" + x + "&__utmz=" + z + "&__utmv=" + v + "&__utmk=" + k;
}
if (p) {
if (h && ih > -1) return;
if (h) {
f.action += "#" + p;
} else {
if (iq == -1 && ih == -1) f.action += "?" + p;
else if (ih == -1) f.action += "&" + p;
else if (iq == -1) f.action = f.action.substring(0, ih - 1) + "?" + p + f.action.substring(ih);
else f.action = f.action.substring(0, ih - 1) + "&" + p + f.action.substring(ih);
}
}
return;
}
//设置用户群体
function __utmSetVar(v) {
if (!v || v == "") return;
if (!_udo || _udo == "") {
_udh = _uDomain();
if (_udn && _udn != "") {
_udo = " domain=" + _udn + ";";
}
}
if (!_uVG()) return;
var r = Math.round(Math.random() * 2147483647);
_ubd.cookie = "__utmv=" + _udh + "." + _uES(v) + "; path=" + _utcp + "; expires=" + _uNx() + ";" + _udo;
var s = "&utmt=var&utmn=" + r;
if ((_userv == 0 || _userv == 2) && _uSP()) {
var i = new Image(1, 1);
i.src = _ugifpath + "?" + "utmwv=" + _uwv + s;
i.onload = function() {
_uVoid();
}
}
if ((_userv == 1 || _userv == 2) && _uSP()) {
var i2 = new Image(1, 1);
i2.src = _ugifpath2 + "?" + "utmwv=" + _uwv + s + "&utmac=" + _uacct + "&utmcc=" + _uGCS();
i2.onload = function() {
_uVoid();
}
}
}
//事件跟踪方法
function __utmTrackEvent(category, action, opt_label, opt_value, opt_page) {
if (!category || category == "" || !action || action == "") return;
var pg = opt_page,
opt = "";
if (!pg || pg == "") pg = _udl.pathname + _udl.search;
opt += "&utmt=event&utme=" + "5(" + _UEE(category) + "*" + _UEE(action);
if (opt_label && opt_label != "") opt += "*" + opt_label;
opt += ")";
if (opt_value && opt_value != "") opt += "(" + opt_value + ")";
urchinTracker(pg, opt);
}
//设置Cookies
//__utma 此 Cookie 通常会在该网络浏览器首次访问您的网站时写入其中。 如果此 Cookie 被浏览器操作者删除,而该浏览器又对您的网站进行了后续访问,一个拥有不同唯一 ID 的 __utma Cookie 将会写入其中。此 Cookie 用于确定您网站的唯一身份访问者,并会在每次网页浏览时获得更新。此外,Google Analytics(分析)会将为此 Cookie 指定的唯一 ID 作为额外的安全措施,以确保此 Cookie 的有效性和可访问性。
//__utmx 此 Cookie 用于 Website Optimizer,并且仅当您的网页正确安装并配置了 Website Optimizer 跟踪代码时才会设置。当优化脚本执行时,此 Cookie 会储存该访问者针对每个实验所分配到的变量,确保用户在您的网站体验的一致性。
//__utmz 此 Cookie 会储存访问者到达您的网站通过的引荐类型,即是否通过直接方法、引荐连接、网站搜索或广告系列(例如广告或电子邮件)到达。这些信息会用来计算您网站的搜索引擎流量、广告系列和网页的导航方式。此 Cookie 会在每次网页浏览时获得更新。
//__utmv 此 Cookie 正常情况下在默认跟踪代码配置中不会出现。__utmv Cookie 通过 _setVar() 方法传递所提供的信息,您可以使用该方法创建自定义用户细分。然后,此字符串将通过 utmcc 参数传递到 GIF 请求网址中记录的 Google Analytics(分析)服务器。仅当您将 _setVar() 方法添加到您网站页面的跟踪代码中时,此 Cookie 才会写入浏览器中。
function _uGCS() {
var t, c = "",
dc = _ubd.cookie;
if ((t = _uGC(dc, "__utma=" + _udh, ";")) != "-") c += _uES("__utma=" + t + ";+");
if ((t = _uGC(dc, "__utmb=" + _udh, ";")) != "-") c += _uES("__utmb=" + t + ";+");
if ((t = _uGC(dc, "__utmc=" + _udh, ";")) != "-") c += _uES("__utmc=" + t + ";+");
if ((t = _uGC(dc, "__utmx=" + _udh, ";")) != "-") c += _uES("__utmx=" + t + ";+");
if ((t = _uGC(dc, "__utmz=" + _udh, ";")) != "-") c += _uES("__utmz=" + t + ";+");
if ((t = _uGC(dc, "__utmv=" + _udh, ";")) != "-") c += _uES("__utmv=" + t + ";");
if (c.charAt(c.length - 1) == "+") c = c.substring(0, c.length - 1);
return c;
}
//截取URL参数方法(需处理URL参数字符串,参数名[a=],截止字符)
function _uGC(l, n, s) {
if (!l || l == "" || !n || n == "" || !s || s == "") return "-";
var i, i2, i3, c = "-";
i = l.indexOf(n);
i3 = n.indexOf("=") + 1;
if (i > -1) {
i2 = l.indexOf(s, i);
if (i2 < 0) {
i2 = l.length;
}
c = l.substring((i + i3), i2);
}
return c;
}
//获取域哈希
function _uDomain() {
if (!_udn || _udn == "" || _udn == "none") {
_udn = "";
return 1;
}
if (_udn == "auto") {
var d = _ubd.domain;
if (d.substring(0, 4) == "www.") {
d = d.substring(4, d.length);
}
_udn = d;
}
_udn = _udn.toLowerCase();
if (_uhash == "off") return 1;
return _uHash(_udn);
}
//哈希算法
function _uHash(d) {
if (!d || d == "") return 1;
var h = 0,
g = 0;
for (var i = d.length - 1; i >= 0; i--) {
var c = parseInt(d.charCodeAt(i));
h = ((h << 6) & 0xfffffff) + c + (c << 14);
if ((g = h & 0xfe00000) != 0) h = (h ^ (g >> 21));
}
return h;
}
//新请求时重新组装__utma参数,更新最后2组时间戳,并对计数器计数,主要是对访问次数进行计数。
function _uFixA(c, s, t) {
if (!c || c == "" || !s || s == "" || !t || t == "") return "-";
var a = _uGC(c, "__utma=" + _udh, s);
var lt = 0,
i = 0;
if ((i = a.lastIndexOf(".")) > 9) {
_uns = a.substring(i + 1, a.length);
_uns = (_uns * 1) + 1;
a = a.substring(0, i);
if ((i = a.lastIndexOf(".")) > 7) {
lt = a.substring(i + 1, a.length);
a = a.substring(0, i);
}
if ((i = a.lastIndexOf(".")) > 5) {
a = a.substring(0, i);
}
a += "." + lt + "." + t + "." + _uns;
}
return a;
}
//去掉空格回车
function _uTrim(s) {
if (!s || s == "") return "";
while ((s.charAt(0) == ' ') || (s.charAt(0) == '\n') || (s.charAt(0, 1) == '\r')) s = s.substring(1, s.length);
while ((s.charAt(s.length - 1) == ' ') || (s.charAt(s.length - 1) == '\n') || (s.charAt(s.length - 1) == '\r')) s = s.substring(0, s.length - 1);
return s;
}
//将URL中的空格替换成+
function _uEC(s) {
var n = "";
if (!s || s == "") return "";
for (var i = 0; i < s.length; i++) {
if (s.charAt(i) == " ") n += "+";
else n += s.charAt(i);
}
return n;
}
//解析Cookies(主要用于分配采样数据)
function __utmVisitorCode(f) {
var r = 0,
t = 0,
i = 0,
i2 = 0,
m = 31;
var a = _uGC(_ubd.cookie, "__utma=" + _udh, ";");
if ((i = a.indexOf(".", 0)) < 0) return;
if ((i2 = a.indexOf(".", i + 1)) > 0) r = a.substring(i + 1, i2);
else return "";
if ((i = a.indexOf(".", i2 + 1)) > 0) t = a.substring(i2 + 1, i);
else return "";
if (f) {
return r;
} else {
var c = new Array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9');
return c[r >> 28 & m] + c[r >> 23 & m] + c[r >> 18 & m] + c[r >> 13 & m] + "-" + c[r >> 8 & m] + c[r >> 3 & m] + c[((r & 7) << 2) + (t >> 30 & 3)] + c[t >> 25 & m] + c[t >> 20 & m] + "-" + c[t >> 15 & m] + c[t >> 10 & m] + c[t >> 5 & m] + c[t & m];
}
}
//判断字符串是否完全由数字组成,包含“.”
function _uIN(n) {
if (!n) return false;
for (var i = 0; i < n.length; i++) {
var c = n.charAt(i);
if ((c < "0" || c > "9") && (c != ".")) return false;
}
return true;
}
//特殊字符替换
function _UEE(s) {
var r = '',
i, c, e;
if (!s || s == "") return "";
for (i = 0; i < s.length; i++) {
c = s.charAt(i);
e = _ecm[c];
r += (undefined != e) ? e : c;
}
return r;
}
//URI编码
function _uES(s, u) {
if (typeof(encodeURIComponent) == 'function') {
if (u) return encodeURI(s);
else return encodeURIComponent(s);
} else {
return escape(s);
}
}
//URI解码
function _uUES(s) {
if (typeof(decodeURIComponent) == 'function') {
return decodeURIComponent(s);
} else {
return unescape(s);
}
}
//判断是否设置cookie域名变量,并判断值是否包含google.org,若不包含,返回false
function _uVG() {
if ((_udn.indexOf("<a href="
http: //www.google" data-mce-href="http://www.google">www.google</a>.") == 0 || _udn.indexOf(".google.") == 0 || _udn.indexOf("google.") == 0) && _utcp=='/' && _udn.indexOf("google.org")==-1) {
return false;
}
return true;
}
//控制采样数据的比例
function _uSP() {
var s = 100;
if (_usample) s = _usample;
if (s >= 100 || s <= 0) return true;
return ((__utmVisitorCode(1) % 10000) < (s * 100));
}
//设定虚拟URL
function urchinPathCopy(p) {
var d = document,
nx, tx, sx, i, c, cs, t, h, o;
cs = new Array("a", "b", "c", "v", "x", "z");
h = _uDomain();
if (_udn && _udn != "") o = " domain=" + _udn + ";";
nx = _uNx() + ";";
tx = new Date();
tx.setTime(tx.getTime() + (_utimeout * 1000));
tx = tx.toGMTString() + ";";
sx = new Date();
sx.setTime(sx.getTime() + (_ucto * 1000));
sx = sx.toGMTString() + ";";
for (i = 0; i < 6; i++) {
t = " expires=";
if (i == 1) t += tx;
else if (i == 2) t = "";
else if (i == 5) t += sx;
else t += nx;
c = _uGC(d.cookie, "__utm" + cs[i] + "=" + h, ";");
if (c != "-") d.cookie = "__utm" + cs[i] + "=" + c + "; path=" + p + ";" + t + o;
}
}
//页面加载后调用,获取授权,创建授权
function _uCO() {
if (!_utk || _utk == "" || _utk.length < 10) return;
var d = 'www.google.com';
if (_utk.charAt(0) == '!') d = 'analytics.corp.google.com';
_ubd.cookie = "GASO=" + _utk + "; path=" + _utcp + ";" + _udo;
var sc = document.createElement('script');
sc.type = 'text/javascript';
sc.id = "_gasojs";
sc.src = 'https://' + d + '/analytics/reporting/overlay_js?gaso=' + _utk + '&' + Math.random();
document.getElementsByTagName('head')[0].appendChild(sc);
}
//判断URL中是否包含#gaso参数并获取值,URL中没有则从cookie中获取
function _uGT() {
var h = location.hash,
a;
if (h && h != "" && h.indexOf("#gaso=") == 0) {
a = _uGC(h, "gaso=", "&");
} else {
a = _uGC(_ubd.cookie, "GASO=", ";");
}
return a;
}
//首步执行
var _utk = _uGT(); //获取授权令牌
if (_utk && _utk != "" && _utk.length > 10) {
if (window.addEventListener) {
window.addEventListener('load', _uCO, false); //火狐等浏览器添加事件监听
} else if (window.attachEvent) {
window.attachEvent('onload', _uCO); //IE浏览器添加事件监听
}
}
//获取时间值【2年】返回格林威治标准时间
function _uNx() {
return (new Date((new Date()).getTime() + 63072000000)).toGMTString();
}

Google Analytics Hack

在了解完Google Analytics的原理后,除了自己能搭建一套类似的统计分析系统外,还可以利用已有的Google Analytics系统实现一些默认无法跟踪的问题。

使用谷歌统计来跟踪网页加载时间

Google Analytics可以用来记录网站的加载时间或网页内各个模块的加载时间,其实整个原理非常的简单,只是记录页面呢不同位置javascript的执行时间,两者相减即加载时间。比如我想知道用户加载页面中head部分JS和CSS的时间和加载页面中主体内容body的时间。具体实现方式如下:

1、在页面head中CSS和JS文件加载前添加如下代码:

<script type="text/javascript">var _head_start = new Date();</script>

2、在页面<body>位置后面添加下面的代码:

<script type="text/javascript">var  _body_start = new Date();</script>

3、在页面页脚中,即</body>前添加下面的GA代码:

<script type="text/javascript">var _now= new Date();</script>

4、通过Google Analytics的事件跟踪将加载时间记录下来:

<script type = "text/javascript";>
if (typeof(_head_start) == typeof(_now)) {
if (_now - _head_start < 1000 * 10) {
_gaq.push(['_trackEvent', 'Performance', 'head', '/pagepath/', _now - _head_start]);
_gaq.push(['_trackEvent', 'Performance', 'body', '/pagepath/', _now - _body_start]);
} else {
_gaq.push(['_trackEvent', 'Performance', 'slow head', '/pagepath/', _now - _head_start]);
_gaq.push(['_trackEvent', 'Performance', 'slow body', '/pagepath/', _now - _body_start]);
}
} </script>

使用Google Analytics来统计手机网站的流量

使用Javascript来给Page 打上Tagging来传递数据,但是用户的浏览器不支持javascript的情况下(比如手机网站、EDM等)怎么进行流量统计呢?那就需要通过后台程序来给gif图片加上Tagging,学习了Google Analytics统计代码的原理后,我们就可以自己动手写PHP或ASP.NET或JAVA版的统计程序了。以下为整理的PHP版Google Analytics统计代码,仅供大家学习参考。关于EDM邮件效果如何跟踪,考虑到还有很多影响因素,以后会单独进行讲解~

备注:当年的手机网站采用的是WAP协议,页面内不支持添加Javascript。

<?php
class GoogleAnlayticsMobile
{
private $__utma; // __utma cookie 记录唯一身份访问者
private $__utma_c_time = 63072000; // 两年 (默认情况下是两年)
private $__utmb; // __utmb cookie 记录用户的一次Session失效时间
private $__utmb_c_time = 1800; // 30分钟 (默认情况下是两年)
private $__utmc; // __utmc cookie 用户退出浏览器后失效
private $__utmz; // __utmz cookie 主要功能记录访问来源
private $__utmz_c_time = 1800; // 30分钟 (默认情况下是半年)
private $ga_utmhn; // 网站域名
private $ga_utmac; // GA 账号
private $ga_utmwv = "4.9.2"; // 谷歌跟踪代码版本
private $ga_hash; // GA域名哈希值
private $ga_img = "<a href="http: //www.google-analytics.com/__utm.gif" data-mce-href="http://www.google-analytics.com/__utm.gif">http://www.google-analytics.com/__utm.gif</a>";
private $ga_search = array(
array(
"baidu",
"wd"
) ,
array(
"baidu",
"word"
) array(
"google",
"q"
) ,
array(
"sogou",
"q"
) ,
array(
"soso",
"w"
) ,
array(
"youdao",
"q"
) ,
array(
"bing",
"q"
) ,
array(
"sogou",
"yahoo"
) ,
array(
"114118",
"kw"
)
);
private $ga_referer;
// private $remote_address;
private $time;
private $html;
function __construct($ga_utmac, $ga_utmhn, $URI = NULL, $ga_params = array())
{
$this->ga_utmac = $ga_utmac;
$this->ga_utmhn = $ga_utmhn;
$this->ga_hash = $this->Hash($ga_utmhn);
$this->time = time();
// 获取请求页面URI
if ($URI == NULL) $URI = $_SERVER['REQUEST_URI'];
// 获取引荐网站URL
$this->ga_referer = $_SERVER['HTTP_REFERER'];
// 获取用户IP地址只保存前三位
$this->remote_address = $_SERVER['REMOTE_ADDR'];
// 获取流量来源
$source = $this->GetTrafficSource();
if ($source["utmgclid"] != "") $source_str = "utmgclid=" . $source["utmgclid"];
else $source_str = "utmcsr=" . $source["utmcsr"];
$source_str .= "|utmccn=" . $source["utmccn"] . "|utmcmd=" . $source["utmcmd"];
if ($source["utmctr"] != "") $source_str .= "|utmctr=" . $source["utmctr"];
if ($source["utmcct"] != "") $source_str .= "|utmcct=" . $source["utmcct"];
// Set all extra parameters like screen resolution, color depth
if (is_array($ga_params)) foreach ($ga_params as $key => $value) $ga_set_params .= "&" . $key . "=" . rawurlencode($value);
else $ga_set_params = "";
// 检查"__utma"是否存在
if (isset($_COOKIE["__utma"]))
{
$this->__utma = $_COOKIE["__utma"];
$this->__utmb = $_COOKIE["__utmb"];
$this->__utmz = $_COOKIE["__utmz"];
$__utmb = split("\.", $this->__utmb);
if (strpos($this->__utmz, "utmgclid") > - 1) $pos = strpos($this->__utmz, "utmgclid");
else $pos = strpos($this->__utmz, "utmcsr");
$__utmz = split("\.", substr($this->__utmz, 0, $pos));
$__utmz[4] = substr($this->__utmz, $pos);
$__utma = split("\.", $this->__utma);
// 检查"__utmc"是否存在,如果不存在,更新"__utma"中的访问次数。
if (!isset($_COOKIE["__utmc"]))
{
// 增加访问次数
$__utma[5] = $__utma[5] + 1;
// 更新访问时间
$__utma[3] = $__utma[4];
$__utma[4] = $this->time;
// 保存Cookies
$this->__utma = join(".", $__utma);
setcookie("__utma", $this->__utma, $this->time + $this->__utma_c_time, "/", "." . $this->ga_utmhn);
setcookie("__utmc", $__utma[0], 0, "/", "." . $this->ga_utmhn);
// 生成"__utmb"或更新"__utmb"中的访问页数。
if (isset($_COOKIE["__utmb"])) $__utmb[1] = 1;
else $__utmb = array(
$__utma[0],
1,
10,
$this->time
);
}
else $__utmb[1] = $__utmb[1] + 1; // 在"__utmb"中添加访问页数
// 更新流量来源
if ($__utmz[4] != $source_str && $source["utmcsr"] != "(direct)") $__utmz = array(
$__utmz[0],
$this->time,
$__utma[5],
$__utmz[3] + 1,
$source_str
);
// 保存 "__utmb" and "__utmz"
$this->__utmb = join(".", $__utmb);
setcookie("__utmb", $this->__utmb, $this->time + $this->__utmb_c_time, "/", "." . $this->ga_utmhn);
$this->__utmz = join(".", $__utmz);
setcookie("__utmz", $this->__utmz, $this->time + $this->__utmz_c_time, "/", "." . $this->ga_utmhn);
}
else
{
$c_id = sprintf("%f", (rand(1000000000, 2147483647) ^ $this->ga_hash) * 2147483647);
$c_id = split("\.", $c_id);
$this->__utma = $this->ga_hash . "." . $c_id[0] . "." . $this->time . "." . $this->time . "." . $this->time . ".1";
$this->__utmb = $this->ga_hash . ".1.10." . $this->time;
$this->__utmc = $this->ga_hash;
$this->__utmz = $this->ga_hash . "." . $this->time . ".1.1." . $source_str;
setcookie("__utma", $this->__utma, $this->time + $this->__utma_c_time, "/", "." . $this->ga_utmhn);
setcookie("__utmb", $this->__utmb, $this->time + $this->__utmb_c_time, "/", "." . $this->ga_utmhn);
setcookie("__utmc", $this->__utmc, 0, "/", "." . $this->ga_utmhn);
setcookie("__utmz", $this->__utmz, $this->time + $this->__utmz_c_time, "/", "." . $this->ga_utmhn);
}
// 发送页面图片请求
$this->html .= "<img src=\"" . $this->ga_img . "?utmwv=" . $this->ga_utmwv . "&utmn=" . rand(1000000000, 9999999999) . "&utmhn=" . $this->ga_utmhn . "" . $ga_set_params . "&utmhid=" . rand(1000000000, 9999999999) . "&utmr=" . rawurlencode($this->ga_referer) . "&utmp=" . rawurlencode($URI) .
//  "&utmip=".rawurlencode($this->remote_address).
"&utmac=" . $this->ga_utmac . "&utmcc=__utma%3D" . $this->__utma . "%3B%2B__utmz%3D" . rawurlencode($this->__utmz) . "%3B\" width=\"1\" height=\"1\" />\n";
}
//哈希算法
function Hash($d)
{
if (!$d || $d == "") return 1;
$h = 0;
$g = 0;
for ($i = strlen($d) - 1;$i >= 0;$i--)
{
$c = (int)(ord($d[$i]));
$h = (($h << 6) & 0xfffffff) + $c + ($c << 14);
$g = ($h & 0xfe00000);
if ($g != 0) $h = ($h ^ ($g >> 21));
}
return $h;
}
function GetTrafficSource()
{
if (isset($_GET["utm_source"]) && isset($_GET["utm_medium"]))
{
// 链接中设置了来源
$utmccn = isset($_GET["utm_campaign"]) ? $_GET["utm_campaign"] : "(not set)";
$utmcct = isset($_GET["utm_content"]) ? $_GET["utm_content"] : "(not set)";
return array(
"utmgclid" => "",
"utmcsr" => $_GET["utm_source"],
"utmccn" => $utmccn,
"utmcmd" => $_GET["utm_medium"],
"utmctr" => $_GET["utm_term"],
"utmcct" => $utmcct
);
}
else if ($this->ga_referer != "")
{
// 从引荐网站过来的流量
$search_engine = $this->GetSearchEngine();
// 判断是否是搜索引擎
if ($search_engine) return $search_engine;
else if (!isset($_COOKIE["__utmc"]))
{
// 如果是新用户或不是搜索引擎,设置referer
$ref = $this->GetReferer();
if (substr($ref["host"], 0, 4) == "www.") $ref["host"] = substr($ref["host"], 4); // Remove www from URL
return array(
"utmgclid" => "",
"utmcsr" => $ref["host"],
"utmccn" => "(referral)",
"utmcmd" => "referral",
"utmctr" => "",
"utmcct" => $ref["uri"]
);
}
}
return array(
"utmgclid" => "",
"utmcsr" => "(direct)",
"utmccn" => "(direct)",
"utmcmd" => "(none)",
"utmctr" => "",
"utmcct" => ""
);
}
function GetSearchEngine()
{
$ref = $this->GetReferer();
for ($ii = 0;$ii < count($this->ga_search);$ii++)
{
if (strpos(strtolower($ref["host"]) , strtolower($this->ga_search[$ii][0])) > - 1)
{
$test1 = strpos($ref["referer"], "?" . $this->ga_search[$ii][1] . "=");
$test2 = strpos($ref["referer"], "&" . $this->ga_search[$ii][1] . "=");
$i = ($test1 > - 1) ? $test1 : $test2;
if ($i > - 1)
{
$k = substr($ref["referer"], $i + strlen($this->ga_search[$ii][1]) + 2, strlen($ref["referer"]));
$i = strpos($k, "&");
if ($i > - 1) $k = substr($k, 0, $i);
if (isset($_GET["gclid"])) return array(
"utmgclid" => $_GET["gclid"],
"utmcsr" => "",
"utmccn" => "(not set)",
"utmcmd" => "(not set)",
"utmctr" => $k,
"utmcct" => ""
);
else return array(
"utmgclid" => "",
"utmcsr" => $this->ga_search[$ii][0],
"utmccn" => "(organic)",
"utmcmd" => "organic",
"utmctr" => $k,
"utmcct" => ""
);
}
}
}
return false;
}
function GetReferer()
{
$referer_tmp = $this->ga_referer;
$pos = strpos($referer_tmp, "://");
if ($pos > 0) $referer_tmp = $referer_tmp = substr($referer_tmp, $pos + 3);
$pos = strpos($referer_tmp, "/");
if ($pos > 0) return array(
"host" => substr($referer_tmp, 0, $pos) ,
"uri" => substr($referer_tmp, $pos) ,
"referer" => $this->ga_referer
);
else return array(
"host" => $referer_tmp,
"uri" => "",
"referer" => $this->ga_referer
);
}
function SetTransaction($order_id, $amount, $shipping, $tax, $city, $region, $country)
{
// 交易记录
$this->html .= "<img src=\"" . $this->ga_img . "?utmwv=" . $this->ga_utmwv . "&utmn=" . rand(1000000000, 9999999999) . "&utmhn=" . $this->ga_utmhn . "&utmt=tran&utmtid=" . $order_id . "&utmtto=" . $amount . "&utmttx=" . $tax . "&utmtsp=" . $shipping . "&utmtci=" . rawurlencode($city) . "&utmtrg=" . rawurlencode($region) . "&utmtco=" . rawurlencode($country) . "&utmac=" . $this->ga_utmac . "&utmcc=__utma%3D" . $this->__utma . "%3B%2B__utmz%3D" . rawurlencode($this->__utmz) . "%3B\" width=\"1\" height=\"1\" />\n";
}
function SetTransactionItem($order_id, $item_id, $category, $name, $price, $quantity)
{
// 交易商品记录
$this->html .= "<img src=\"" . $this->ga_img . "?utmwv=" . $this->ga_utmwv . "&utmn=" . rand(1000000000, 9999999999) . "&utmhn=" . $this->ga_utmhn . "&utmt=item&utmtid=" . $order_id . "&utmipc=" . $item_id . "&utmipn=" . rawurlencode($name) . "&utmiva=" . rawurlencode($category) . "&utmipr=" . $price . "&utmiqt=" . $quantity . "&utmac=" . $this->ga_utmac . "&utmcc=__utma%3D" . $this->__utma . "%3B%2B__utmz%3D" . rawurlencode($this->__utmz) . "%3B\" width=\"1\" height=\"1\" />\n";
}
function GetTrackingCode()
{
// 执行跟踪程序
return $this->html;
}
}

使用Google Analytics跟踪搜索引擎的抓取记录

由于Google Analytics是基于javascript创建的,所以在正常情况下Google Analytics是无法跟踪到搜索引擎蜘蛛的爬行轨迹的。但是通过对google analytics原理的学习,你就可以自己动手去实现跟踪爬虫轨迹。(当然开启服务器日志的方法记录爬虫信息是最简单的)方法和前面的使用Google Analytics跟踪手机站流量类似。

<?php
/*
* Name:Tracking Robots With Google Analytics
* Author:biaodianfu
*/
$utmac = 'UA-16811947-5'; //输入Goolgle Analytics配置生成的跟踪ID
$domain = 'biaodianfu.com'; //输入要统计的网站的域名
$utmGifLocation = "http://www.google-analytics.com/__utm.gif"; //请求URL地址
$utmv = "4.8.9"; //Google Analytics统计版本
$title = ""; //网站标题,wp_title() ;
$bots = array(
'compatible; Googlebot/([0-9.]{1,10})?' => 'Google',
'Googlebot/([0-9.]{1,10})?' => 'Google',
'Googl(e|ebot)(-News)/([0-9.]{1,10})' => 'Google News',
'Googl(e|ebot)(-News)/' => 'Google News',
'Googl(e|ebot)(-Image)/([0-9.]{1,10})' => 'Google Image',
'Googl(e|ebot)(-Image)/' => 'Google Image',
'Googl(e|ebot)(-Video)/([0-9.]{1,10})' => 'Google Video',
'Googl(e|ebot)(-Video)/' => 'Google Video',
'Googl(e|ebot)(-Sitemaps)/([0-9.]{1,10})?' => 'Google-Sitemaps',
'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps',
'compatible; Googlebot-Mobile/([0-9.]{1,10})?' => 'Google Mobile',
'Googl(e|ebot)(-Mobile)/([0-9.]{1,10})?' => 'Google Mobile',
'compatible; Mediapartners-Google/([0-9.]{1,10})?' => 'Google Mediapartners',
'Mediapartners-Google[ /]([0-9.]{1,10})' => 'Google Mediapartners',
'Mediapartners-Google' => 'Google Mediapartners',
'^AdsBot-Google' => 'Google-AdsBot',
'^Feedfetcher-Google' => 'Google-Feedfetcher',
'compatible; Baiduspider/([0-9.]{1,10})?' => 'Baidu',
'Baiduspider' => 'Baidu',
'BaiduCustomer' => 'Baidu Customer',
'Baidu-Thumbnail' => 'Baidu Thumbnail',
'Baidu-Transcoder' => 'Baidu Mobile',
'baiduspider-mobile-gate' => 'Baidu Mobile',
'Yahoo(! ([a-z]{1,3} )?Slurp|-)' => 'Yahoo',
'Yahoo! Slurp China' => 'Yahoo China',
'YahooFeedSeeker' => 'Yahoo Feed',
'Yahoo-Blogs' => 'Yahoo Blog',
'Yahoo ContentMatch Crawler' => 'Yahoo Ads',
'Yahoo-MMCrawler ' => 'Yahoo Image',
'MSN(BOT|PTC)[ /]([0-9.]{1,10})' => 'MSN',
'MS Search ([0-9.]{1,10}) Robot' => 'MSN',
'MSNBOT_Mobile' => 'MSN Mobile',
'MSMOBOT' => 'MSN Mobile',
'MSNBOT-(MEDIA|PRODUCTS|ACADEMIC|NEWSBLOGS)[ /]([0-9.]{1,10})' => 'MS Live Search',
'Sosospider' => 'SoSo',
'Sosoblogspider' => 'SoSo Blog',
'Sosoimagespider' => 'SoSo IMAGE',
'Sogou web spider[ /]([0-9.]{1,10})' => 'Sogou',
'Sogou-Test-Spider[ /]([0-9.]{1,10})' => 'Sogou',
'Sogou web robot' => 'Sogou',
'Sogou orion spider[ /]([0-9.]{1,10})' => 'Sogou',
'YodaoBot[ /]([0-9.]{1,10})' => 'Youdao',
'YodaoBot-Image[ /]([0-9.]{1,10})' => 'Youdao Image',
'YodaoBot-Reader[ /]([0-9.]{1,10})' => 'Youdao Reader',
'QihooBot[ /]([0-9.]{1,10})' => 'Qihoo',
'gougou' => 'GouGou',
'(robot|spider|harvest|bot|(?<!msie)crawler)' => 'Unknown Robot'
);
$os = array(
'wi(n|ndows)?' => 'windows',
'linux[ /\-]([a-z0-9._]{1,10})' => 'linux',
'linux' => 'linux',
'Mac[ _]?OS[ _]?X[ /]([0-9.]{1,10})' => 'macosx',
'Mac[ _]?OS[ _]?X' => 'macosx',
'Mac 10.([0-9.]{1,10})' => 'macosx',
'Mac(_Power|intosh.+P)PC' => 'macppc',
'beos[ a-z]*([0-9.]{1,10})' => 'beos',
'beos' => 'beos',
'fedora' => 'fedora',
'free[ \-]?bsd[ /]([a-z0-9._]{1,10})' => 'freebsd',
'free[ \-]?bsd' => 'freebsd',
'open[ \-]?bsd[ /]([a-z0-9._]{1,10})' => 'openbsd',
'open[ \-]?bsd' => 'openbsd',
'PCLinuxOS[ /]?([0-9.]{1,10})' => 'pclinux',
'ubuntu' => 'ubuntu'
);
function domainHash($domain)
{
if (!$domain || $domain == "") return 1;
$h = 0;
$g = 0;
for ($i = strlen($domain) - 1;$i >= 0;$i--)
{
$c = (int)(ord($domain[$i]));
$h = (($h << 6) & 0xfffffff) + $c + ($c << 14);
$g = ($h & 0xfe00000);
if ($g != 0) $h = ($h ^ ($g >> 21));
}
return $h;
}
function httpRequest($utmUrl)
{
if (function_exists('curl_exec'))
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $utmUrl);
$data = curl_exec($ch);
curl_close($ch);
}
elseif (function_exists('file_get_contents'))
{
$options = array(
"http" => array(
"method" => "GET",
"user_agent" => $_SERVER["HTTP_USER_AGENT"],
"header" => ("Accepts-Language: " . $_SERVER["HTTP_ACCEPT_LANGUAGE"])
)
);
$data = file_get_contents($utmUrl, false, stream_context_create($options));
}
}
if (empty($_SERVER['HTTP_REFERER']) && $_SERVER["HTTP_USER_AGENT"])
{
foreach ($os as $patternos => $o)
{
if (preg_match('#' . $patternos . '#msi', $_SERVER["HTTP_USER_AGENT"]) == 0)
{
foreach ($bots as $patternbots => $bot)
{
if (preg_match('#' . $patternbots . '#i', $_SERVER['HTTP_USER_AGENT']) == 1)
{
$botname = preg_replace("/\\s{1,}/i", '-', $bot);
$utmUrl = $utmGifLocation . "?" . "utmwv=" . $utmv . "&utmn=" . rand(0, 0x7fffffff) . "&utmhn=" . urlencode($_SERVER["SERVER_NAME"]) . "&utmdt=" . urlencode($title) . "&utmr=-" . "&utmp=" . urlencode($_SERVER["REQUEST_URI"]) . "&utmac=" . $utmac . "&utmcc=" . '__utma%3D' . domainHash($domain) . '.' . rand(0, 0x7fffffff) . '.' . time() . '.' . time
() . '.' . time() . '.1%3B%2B' . '__utmb%3D' . domainHash($domain) . '%3B%2B' . '__utmc%3D' . domainHash($domain) . '%3B%2B' . '__utmz%3D' . domainHash($domain) . '.' . time() . '.1.1.utmccn%3D(organic)%7Cutmcsr%
3D' . $botname . '%7Cutmctr%3D' . $_SERVER["REQUEST_URI"] . '%7Cutmcmd%3Dorganic%3B%2B' . '__utmv%3D' . domainHash($domain) . '.Robot%20hostname%3A%20' . gethostbyaddr($_SERVER
['REMOTE_ADDR']) . '%3B';
httpRequest($utmUrl);
}
}
}
}
}
?>

在URL上添加UTM参数避免重复页面方法

使用Gooogle Analytics构造跟踪网址中讲到为了避免产生高恒重复页面可以使用#来连接添加的跟踪参数。代码中只需添加_gaq.push([‘_setAllowAnchor’, true]);即可。

使用jQuery来方便的布置事件跟踪代码

Google Analytics的事件跟踪是个神器,基本上你能想到什么他就能帮你做什么。但是按照Google Analytics的帮助文章中方法去布置可能会让你觉得麻烦。解决方法有很多种。以下为我使用的小技巧分享给大家。

如果你需要跟踪某几个链接在页面上的点击数。事先给需要记录的点击链接上添加一个类。如:

<a href=”http://www.domain.com/” class=”tracklink”>跟踪地址</a>

当每个需要跟踪的链接上都添加了class=”tracklink” 后,你只需添加如下jQuery代码就可以统计所有要统计的链接的点击了。

<script type = "text/javascript" >
$(document).ready(function() {
$('a.tracklink').click(function() {
_gaq.push(['_trackEvent', 'tracklink', 'Click', $(this).attr('href')]);
});
}); </script>

代码非常的短,也非常的简单。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注