以下内容是自己十年前整理的,期间翻看了 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 = ""; // 设置统计账号 setup 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; // 开启 flash 版本跟踪 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."") == 0" data-mce-href="http://www."") == 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('ShockwaveFlash') != -1) { f = n.plugins[ii].description.split('ShockwaveFlash')[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); }```html // 哈希算法 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("www.google.") == 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', 'slowhead', '/pagepath/', _now - _head_start]); _gaq.push(['_trackEvent', 'Performance', 'slowbody', '/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。
```phphttp://www.google-analytics.com/__utm.gif"; 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 .= "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"] : "(notset)"; $utmcct = isset($_GET["utm_content"]) ? $_GET["utm_content"] : "(notset)"; return array( "utmgclid" => "", "utmcsr" => $_GET["utm_source"], "utmccn" => $utmccn, "utmcmd" => $_GET["utm_medium"], "utmctr" => $_GET["utm_term"], "utmcct" => $utmcct ); } elseif ($this->ga_referer != "") { //从引荐网站过来的流量 $search_engine = $this->GetSearchEngine(); //判断是否是搜索引擎 if ($search_engine) return $search_engine; elseif (!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" => "(notset)", "utmcmd" => "(notset)", "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 .= "
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 .= "
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: TrackingRobotsWithGoogleAnalytics * 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})' => 'GoogleNews', 'Googl(e|ebot)(-News)/' => 'GoogleNews', 'Googl(e|ebot)(-Image)/([0-9.]{1,10})' => 'GoogleImage', 'Googl(e|ebot)(-Image)/' => 'GoogleImage', 'Googl(e|ebot)(-Video)/([0-9.]{1,10})' => 'GoogleVideo', 'Googl(e|ebot)(-Video)/' => 'GoogleVideo', 'Googl(e|ebot)(-Sitemaps)/([0-9.]{1,10})?' => 'Google-Sitemaps', 'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps', 'compatible; Googlebot-Mobile/([0-9.]{1,10})?' => 'GoogleMobile', 'Googl(e|ebot)(-Mobile)/([0-9.]{1,10})?' => 'GoogleMobile', 'compatible; Mediapartners-Google/([0-9.]{1,10})?' => 'GoogleMediapartners', 'Mediapartners-Google[/]([0-9.]{1,10})' => 'GoogleMediapartners', 'Mediapartners-Google' => 'GoogleMediapartners', '^AdsBot-Google' => 'Google-AdsBot', '^Feedfetcher-Google' => 'Google-Feedfetcher', 'compatible; Baiduspider/([0-9.]{1,10})?' => 'Baidu', 'Baiduspider' => 'Baidu', 'BaiduCustomer' => 'BaiduCustomer', 'Baidu-Thumbnail' => 'BaiduThumbnail', 'Baidu-Transcoder' => 'BaiduMobile', 'baiduspider-mobile-gate' => 'BaiduMobile', 'Yahoo(!([a-z]{1,3})?Slurp|-)' => 'Yahoo', 'Yahoo!SlurpChina' => 'YahooChina', 'YahooFeedSeeker' => 'YahooFeed', 'Yahoo-Blogs' => 'YahooBlog', 'YahooContentMatchCrawler' => 'YahooAds', 'Yahoo-MMCrawler' => 'YahooImage', 'MSN(BOT|PTC)[/]([0-9.]{1,10})' => 'MSN', 'MSSearch([0-9.]{1,10})Robot' => 'MSN', 'MSNBOT_Mobile' => 'MSNMobile', 'MSMOBOT' => 'MSNMobile', 'MSNBOT-(MEDIA|PRODUCTS|ACADEMIC|NEWSBLOGS)[/]([0-9.]{1,10})' => 'MSLiveSearch', 'Sosospider' => 'SoSo', 'Sosoblogspider' => 'SoSoBlog', 'Sosoimagespider' => 'SoSoIMAGE', 'Sogouwebspider[/]([0-9.]{1,10})' => 'Sogou', 'Sogou-Test-Spider[/]([0-9.]{1,10})' => 'Sogou', 'Sogouwebrobot' => 'Sogou', 'Sogouorionspider[/]([0-9.]{1,10})' => 'Sogou', 'YodaoBot[/]([0-9.]{1,10})' => 'Youdao', 'YodaoBot-Image[/]([0-9.]{1,10})' => 'YoudaoImage', 'YodaoBot-Reader[/]([0-9.]{1,10})' => 'YoudaoReader', 'QihooBot[/]([0-9.]{1,10})' => 'Qihoo', 'gougou' => 'GouGou', '(robot|spider|harvest|bot|(?<!msie)crawler)' => 'UnknownRobot' ); $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', 'Mac10.([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参数避免重复页面方法
使用 Google Analytics 构造跟踪网址中讲到为了避免产生高恒重复页面可以使用#来连接添加的跟踪参数。代码中只需添加 _gaq.push(['_setAllowAnchor', true]); 即可。
使用jQuery来方便的布置事件跟踪代码
Google Analytics 的事件跟踪是个神器,基本上你能想到什么他就能帮你做什么。但是按照 Google Analytics 的帮助文章中方法去布置可能会让你觉得麻烦。解决方法有很多种。以下为我使用的小技巧分享给大家。
如果你需要跟踪某几个链接在页面上的点击数。事先给需要记录的点击链接上添加一个类。如:
当每个需要跟踪的链接上都添加了 class="tracklink" 后,你只需添加如下 jQuery 代码就可以统计所有要统计的链接的点击了。