百度总括的JS脚本原理分析

首先,百度总结会供给大家在要总计的页面中放到一段js语句,类似如下:

首先,百度总括会供给大家在要计算的页面中放置一段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>

<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。

那段js,实质上是往页面中引入hm.baidu.com/h.js的那段代码,该代码的始末会基于前面包车型大巴参数有所差异,h.js?前边的参数正是您在百度总结里的id。

获得该h.js代码的同时,百度总计会往你的浏览器写入多个名字为“HMACCOUNT”的cookie,该cookie的过期时间为2038年,所以假如您从未清空浏览器cookie,基本就绝然而期。

收获该h.js代码的还要,百度总括会往你的浏览器写入三个名字为“HMACCOUNT”的cookie,该cookie的逾期时间为2038年,所以假若你从未清空浏览器cookie,基本就毫无过期。

h.js被下载后,便执行其脚本获取一些浏览器相关音信和做客来源,获取的音信包涵显示器尺寸、颜色深浅、flash版本、用户语言等。

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”。那一个参数的含义差不多如下:

从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”

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:11人随机数字
sb:若是是360se浏览器该值等于‘17’
se: 和查找引擎相关
si:计算代码id
st:
su:上一页document.referrer
sw: 不明了,估量和查找引擎有关,一般为空
sse:不亮堂,预计和搜索引擎有关,一般为空
v:总括代码的版本 ,方今该值为“1.0.17”

当这个参数都安装甘休了(有个别参数并不曾赋值),筛选出曾经赋值了的参数,并视作hm.baidu.com/hm.gif的参数拼凑出2个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.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
  。然后请求该图片。

百度总括服务端,通过吸收到那个请求,并从这一个图形的网址附带的参数获取相关消息,记录访客访问记录;当页面被用户关闭的时候,同样会接触2遍呼吁hm.gif的进度,但以此进程不是怀有浏览器和拥有关闭动作都支持。

百度计算服务端,通过吸收到那么些请求,并从那些图形的网址附带的参数获取有关音信,记录访客访问记录;当页面被用户关闭的时候,同样会触发一遍呼吁hm.gif的历程,但这些进程不是负有浏览器和全数关闭动作都援救。

 

 

接下去通进程序模拟这一经过:

接下去通进度序模拟这一进程:

率先,使用Wireshark(一款互连网抓包工具)对浏览器实际的经过进行捕获。首先是利用ie打开七个有超链接链接到有百度总括的网站,加载完成后关门浏览器。末了在Wireshark上收获如此的互连网数据包。

先是,使用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&lt;=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&lt;=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&lt;=1328171541&nv=1&rnd=1067394506&si=0f9e2caa14d6d0a51371b168d182314a&st=1&v=1.0.17

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&lt;=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&lt;=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&lt;=1328171541&nv=1&rnd=1067394506&si=0f9e2caa14d6d0a51371b168d182314a&st=1&v=1.0.17

能够窥见,浏览器总共向劳动器端发送了伍遍呼吁:

能够窥见,浏览器总共向服务器端发送了六次呼吁:

  1. 恳请一段js脚本。
  2. 加载完结时候动身三遍呼吁,并传递参数
  3. 退出页面时候,发出二次呼吁,并传递参数,与地点比较,发现ep参数有浮动。
  1. 伸手一段js脚本。
  2. 加载达成时候动身一遍呼吁,并传递参数
  3. 剥离页面时候,发出三次呼吁,并传递参数,与地点相比,发现ep参数有转变。

       
百度总结是基于cookie的,当呼吁js脚本的时候,会在您电脑里保存3个永久cookie,该cookie作为你的用户标识。同时发现,但剥离时候参数ep从最伊始的0变为了“7289%2C115”,转义后是“7289,115”那是五个飞秒单位,即7.2秒和0.1秒的意趣。同时前两遍呼吁hm.gif的时候lt参数(时间,javascript:(new
Date).getTime())是不变的。rnd随机数每一趟都变。

       
百度总计是根据cookie的,当呼吁js脚本的时候,会在你电脑里保存1个永久cookie,该cookie作为你的用户标识。同时发现,但剥离时候参数ep从最起先的0变为了“7289%2C115”,转义后是“7289,115”这是多少个纳秒单位,即7.2秒和0.1秒的趣味。同时前五回呼吁hm.gif的时候lt参数(时间,javascript:(new
Date).getTime())是不变的。rnd随机数每便都变。

上边大家就来模拟1遍呼吁,这一次使用的python语言。

下边大家就来效仿一遍呼吁,这次使用的python语言。

import urllib2
import urllib
import random
import math
import urlparse
import time
import cookielib

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)’ #IE9
MyData={‘cc’:’1′,’ck’:’1′,’cl’:’32-bit’,’ds’:’1024×768′,’et’:’0′,’ep’:’0′,’fl’:’11.0′,’ja’:’1′,’ln’:’zh-cn’,’lo’:’0′,’nv’:’1′,’st’:’3′,’v’:’1.0.17′}
#———————————————————————-

########################################################################
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)’ #IE9
MyData={‘cc’:’1′,’ck’:’1′,’cl’:’32-bit’,’ds’:’1024×768′,’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.TargetPage
self.Referer=refererPage or self.Referer
self.BaiduID=baiduID
self.MyData[‘si’]=self.BaiduID
self.MyData[‘su’]=urllib.quote(self.Referer)
pass
def 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()
pass
except urllib2.HTTPError ,ex:
print ex.code
pass
except urllib2.URLError,ex:
print ex.reason
pass
pass

def __init__(self,baiduID,targetPage=None,refererPage=None):
“””Constructor”””
self.TargetPage=targetPage or self.TargetPage
self.Referer=refererPage or self.Referer
self.BaiduID=baiduID
self.MyData[‘si’]=self.BaiduID
self.MyData[‘su’]=urllib.quote(self.Referer)
pass
def 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()
pass
except urllib2.HTTPError ,ex:
print ex.code
pass
except urllib2.URLError,ex:
print ex.reason
pass
pass

if __name__ ==”__main__”:
a=Baidu(‘百度总结id’,’http://www.lixin.me/blog/test4','www.lixin.com.cn‘)
a.run()

if __name__ ==”__main__”:
a=Baidu(‘百度总计id’,’http://www.lixin.me/blog/test4','www.lixin.com.cn‘)
a.run()

 

 

相关文章

admin

网站地图xml地图