首先,百度统计会要求我们在要统计的页面中嵌入一段js语句,类似如下:

<script type=”text/javascript”>
var _bdhmProtocol = ((“https:” == document.location.protocol) ? ” https://” : ” http://”);
document.write(unescape(“%3Cscript src=’” + _bdhmProtocol + “hm.baidu.com/h.js%3F3266e9d3684eaa1337dc7c4b4b64b0ae’ type=’text/javascript’%3E%3C/script%3E”));
</script>

  这段js,实质上是往页面中引入hm.baidu.com/h.js的这段代码,该代码的内容会根据后面的参数有所不同,h.js?后面的参数就是你在百度统计里的id。

获取该h.js代码的同时,百度统计会往你的浏览器写入一个名字为“HMACCOUNT”的cookie,该cookie的过期时间为2038年,所以只要你没有清空浏览器cookie,基本就永不过期。

h.js被下载后,便执行其脚本获取一些浏览器相关信息和访问来源,获取的信息包括屏幕尺寸、颜色深度、flash版本、用户语言等。

从js代码中可以得到,所有参数包括这些:”cc,cf,ci,ck,cl,cm,cp,cw,ds,ep,et,fl,ja,ln,lo,lt,nv,rnd,sb,se,si,st,su,sw,sse,v”。这些参数的意义大致如下:

cc: 不知道,一般为1
cf:url参数hmsr的值
ci:url参数hmci的值
ck:是否支持cookie 1:0
cl:颜色深度 如 “32-bit”
cm:url参数hmmd的值
cp:url参数hmpl的值
cw:url参数hmkw的值
ds:屏幕尺寸,如 ’1024×768′
ep:初始值为’0′,时间变量,反映页面停留时间,格式大概是:现在时间-载入时间+“,”+另一个很小的时间值
et:初始值为’0′,如果ep时间变量不是0的话,它会变成其他
fl:flash版本
ja:java支持 1:0
ln:语言 zh-cn
lo: 不知道,一般为0
lt:日期 time.time(),如“1327847756”, 在首次请求没有
nv: 不知道,一般为1或者0
rnd:十位随机数字
sb:如果是360se浏览器该值等于‘17’
se: 和搜索引擎相关
si:统计代码id
st:
su:上一页document.referrer
sw: 不知道,估计和搜索引擎有关,一般为空
sse:不知道,估计和搜索引擎有关,一般为空
v:统计代码的版本 ,目前该值为“1.0.17”

当这些参数都设置完毕了(有些参数并没有赋值),筛选出已经赋值了的参数,并作为hm.baidu.com/hm.gif的参数拼凑出一个url,如:http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=0&et=0&fl=11.0&ja=1&ln=zh-cn   。然后请求该图片。

百度统计服务端,通过接收到这个请求,并从这个图片的网址附带的参数获取相关信息,记录访客访问记录;当页面被用户关闭的时候,同样会触发一次请求hm.gif的过程,但这个过程不是所有浏览器和所有关闭动作都支持。

记下来通过程序模拟这一过程:

首先,使用Wireshark(一款网络抓包工具)对浏览器实际的过程进行捕获。首先是使用ie打开一个有超链接链接到有百度统计的网站,加载完毕后关闭浏览器。最后在Wireshark上得到这么的网络数据包。

http://hm.baidu.com/h.js?3266e9d3684e7a1307dc7c4b4a64b0ae
http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=0&et=0&fl=11.0&ja=1&ln=zh-cn&lo=0<=1328171561&nv=1&rnd=2889921&si=3266e9d3684e7a1307dc7c4b4a64b0ae&st=3&su=http%3A%2F%2Fwww.zhanghangbo.com%2F&v=1.0.17
http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=7289%2C115&et=3&fl=11.0&ja=1&ln=zh-cn&lo=0<=1328171561&nv=1&rnd=1444115283&si=3266e9d3684e7a1307dc7c4b4a64b0ae&st=3&su=http%3A%2F%2Fwww.zhanghangbo.com%2F&v=1.0.17
http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=212486%2C4614&et=3&fl=11.0&ja=1&ln=zh-cn&lo=0<=1328171541&nv=1&rnd=1067394506&si=0f9e2caa14d6d0a51371b168d182314a&st=1&v=1.0.17

可以发现,浏览器总共向服务器端发送了4次请求:

请求一段js脚本。
加载完毕时候出发一次请求,并传递参数
退出页面时候,发出一次请求,并传递参数,与上面对比,发现ep参数有变化。

百度统计是基于cookie的,当请求js脚本的时候,会在你电脑里保存一个永久cookie,该cookie作为你的用户标识。同时发现,但退出时候参数ep从最开始的0变为了“7289%2C115”,转义后是“7289,115”这是两个毫秒单位,即7.2秒和0.1秒的意思。同时前两次请求hm.gif的时候lt参数(时间,javascript:(new Date).getTime())是不变的。rnd随机数每次都变。

下面我们就来模拟一次请求,本次使用的python语言。

import urllib2
import urllib
import random
import math
import urlparse
import time
import cookielib########################################################################
class Baidu:""""""Referer='http://www.lixin.me'TargetPage='/www.lixin.me'BaiduID=''Hjs="http://hm.baidu.com/h.js?"Hgif="http://hm.baidu.com/hm.gif?"UserAgent='Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' #IE9MyData={'cc':'1','ck':'1','cl':'32-bit','ds':'1024x768','et':'0','ep':'0','fl':'11.0','ja':'1','ln':'zh-cn','lo':'0','nv':'1','st':'3','v':'1.0.17'}#----------------------------------------------------------------------def __init__(self,baiduID,targetPage=None,refererPage=None):"""Constructor"""self.TargetPage=targetPage or  self.TargetPageself.Referer=refererPage or self.Refererself.BaiduID=baiduIDself.MyData['si']=self.BaiduIDself.MyData['su']=urllib.quote(self.Referer)passdef run(self,timeout=5):cj=cookielib.CookieJar()opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  opener.addheaders=[("Referer",self.TargetPage),("User-Agent",self.UserAgent)]try:response=opener.open(self.Hjs+self.BaiduID).info()self.MyData['rnd']=int(random.random()*2147483647 )self.MyData['lt']=int(time.time())fullurl=self.Hgif+urllib.urlencode(self.MyData)response2=opener.open(fullurl,timeout=timeout).info()self.MyData['rnd']=int(random.random()*2147483647 )self.MyData['et']='3'self.MyData['ep']='2000,100'response3=opener.open(self.Hgif+urllib.urlencode(self.MyData),timeout=timeout).info()passexcept urllib2.HTTPError ,ex:print ex.code passexcept urllib2.URLError,ex:print ex.reasonpasspassif  __name__ =="__main__":a=Baidu('百度统计id','http://www.lixin.me/blog/test4','www.lixin.com.cn')a.run()

代码中,实际我没有模拟4次请求,发出3次就可以在百度统计的最新访客里看到记录,发出前两次的话,在百度统计里可以看到有访问记录,但是不显示来源和访问页面。用法很简单,只要实例化Baidu这个类,并给他传递3个参数,第一个为百度统计给你的统计id,第二个是被访问页面的url,这个url可以是不存在的,因为实际百度统计并没有验证页面的存在,第3个就是访问该页面的来源页面,这样就可以在百度统计的后台看到来自‘www.lixin.com.cn’的用户访问了test4这个页面。

如果你是别有用心的程序员或者博主,是不是窥探出利用价值了呢?

转载于:https://www.cnblogs.com/mana66ccff/p/11287170.html

百度统计的JS脚本原理分析 2013年文章转载相关推荐

  1. CSDN:手把手教你如何利用【百度统计工具】实现CSDN博客【文章访问流量】的数据统计图表可视化

    CSDN:手把手教你如何利用百度统计工具实现CSDN博客文章流量的数据统计的图表可视化 目录 实现结果 1.本博客访问的年龄属性 2.本博客访问的地理位置属性 国内第一大IT社区-CSDN让博主们得到 ...

  2. js如何实现侧边广告_百度统计后台总是被广告骚扰?看看应用python是如何实现的...

    相信不少老哥们在看百度统计后台流量来源的时候,都能看到很多莫名其妙的来源,其中很多都是广告垃圾网站以及匪夷所思的广告搜索词,心理莫名来一句,百度就是辣鸡,操蛋,是不是百度统计又开始抽风了,其实不然,这 ...

  3. javascript笔记:推荐使用“百度统计”并且拷贝百度统计的前端框架

    本篇博文讲两件事情,一个是推荐在博客园经常写博客的童鞋们一个很棒的工具--"百度统计",另一个是"拷贝百度统计"的页面框架. 首先讲第一个事情,我的博客里有不少 ...

  4. python对广告的应用_百度统计后台总是被广告骚扰?看看应用python是如何实现的...

    相信不少老哥们在看百度统计后台流量来源的时候,都能看到很多莫名其妙的来源,其中很多都是广告垃圾网站以及匪夷所思的广告搜索词,心理莫名来一句,百度就是辣鸡,操蛋,是不是百度统计又开始抽风了,其实不然,这 ...

  5. 动态加载JS脚本【转】

    原文:http://mario-design.iteye.com/blog/147810 要实现动态加载JS脚本有4种方法: 1.直接document.write <script languag ...

  6. 网站百度统计被恶意刷广告的处理方法

    在百度统计的数据中,查看网站的实时访客或者来源,有时候,会发现有一些乱七八糟的用户流量,这并不是网站被攻击或者被刷流量了,而是百度统计被被恶意刷广告,只是针对统计的行为,不影响网站的排名. 现象: 1 ...

  7. 百度统计数据导出服务踩的坑

    今天在项目中引入百度统计,我们是打算在我们的页面中引入百度提供的接口,而不仅仅是用百度统计里面的一些js,中途踩到一些坑,做下记录. 1. 开通百度统计导出服务 这个导出服务算是高级功能吧,开通完之后 ...

  8. JPEG原理分析及JPEG解码器的解析

    文章目录 JPEG原理分析及JPEG解码器的调试 原理分析 JPEG编解码流程图 DC系数编码 AC系数编码 JPEG文件格式 Segment组织形式 JPEG 的 Segment Marker no ...

  9. 推荐几款流量统计网站,通过流量分析管理自己的网站

    1.Google Analytics 谷歌分析: http://www.google.com/analytics/ 2.免费网站流量统计_商业媒体统计_广告联盟_数据专家cnzz.com CNZZ数据 ...

最新文章

  1. 查python的软件_[Python实战]Python制作天气查询软件
  2. 固态器件理论(2)价和晶体结构
  3. 209. 单点登录(SSO)
  4. MySQL中的日志类型(二)-General query log
  5. 1088 三人行 (20 分)
  6. Android自己的自动化测试Monkeyrunner和用法示例
  7. 【牛客 - 315C】排列(思维,贪心,同优则立证明法)
  8. oracle给日期加特定天数,oracle按照日期求连续天数的数据sql
  9. [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域
  10. 知识点收录01---关于Tomcat的一些知识点
  11. 史上最详细MFC调用mapX5.02.26步骤(附地图测试GST文件)
  12. HTML转PDF(Thymeleaf做模板)
  13. 2022年,给物联网专业的大学生的一些建议!
  14. 易基因|一文看懂:ChIP实验和qPCR定量分析怎么做
  15. python基础教程读书笔记_《Python基础教程》读书笔记10
  16. vmware15.5.5版本虚拟机(VMware Workstation 15 Pro)BUG(CentOS7.3下):切换大小写失效的解决方案
  17. Magento后台添加商品属性集属性集详细教程
  18. ResNeXt代码复现+超详细注释(PyTorch)
  19. TSMaster1.1版本更新补丁
  20. Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 15

热门文章

  1. (一)PBR材质理论
  2. java星星图案总结
  3. 【autojs】Auto.js Pro系统intent代码
  4. 我的世界服务器显示无法解析主机名什么意思,我开了我的世界服务器可为什么它出现无法解析主机名...
  5. 轻松入门Android直播相关技术 从0搭建直播系统
  6. 设计模式之调停者模式
  7. 炉石传说服务器维修,《炉石》服务器崩溃,全部被强制回档,玩家损失几百万!...
  8. 记一次HBuilder X 封装H5 + 微信登录
  9. 洛谷P5322 [BJOI2019]排兵布阵【分组背包】
  10. 从后端到前端的转变:如何选择框架?