百度总计的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>

 

这段js,实质上是往页面中引进hm.baidu.com/h.js的这段代码,该代码的源委会基于前面包车型客车参数有所分裂,h.js?前面包车型大巴参数就是您在百度计算里的id。

获得该h.js代码的同有的时候候,百度计算会往你的浏览器写入3个名称为“HMACCOUNT”的cookie,该cookie的晚点时间为203八年,所以1旦您从未清空浏览器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:显示屏尺寸,如 ’10二四×76八′
ep:开始值为’0′,时间变量,反映页面停留时间,格式大致是:今后光阴-载入时间+“,”+另2个非常的小的时刻值
et:开首值为’0′,如若ep时间变量不是0的话,它会化为任何
fl:flash版本
ja:java支持 1:0
ln:语言 zh-cn
lo: 不知道,一般为0
lt:日期 time.time(),如“132784775陆”, 在第贰回呼吁未有
nv: 不知道,一般为1或者0
rnd:十一位随机数字
sb:借使是360se浏览器该值等于‘17’
se: 和查找引擎相关
si:总结代码id
st:
su:上一页document.referrer
sw: 不通晓,估量和寻找引擎有关,一般为空
sse:不知情,测度和查找引擎有关,一般为空
v:总括代码的本子 ,方今该值为“一.0.17”

当那几个参数都安装甘休了(某个参数并从未赋值),筛选出曾经赋值了的参数,并作为hm.baidu.com/hm.gif的参数拼凑出1个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的经过,但那些过程不是富有浏览器和全部关闭动作都援救。

 

接下去通进度序模拟那1进程:

首先,使用Wireshark(1款网络抓包工具)对浏览器实际的经过进展捕获。首先是使用ie打开1个有超链接链接到有百度总括的网址,加载达成后关门浏览器。最终在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

能够发现,浏览器总共向劳动器端发送了九次呼吁:

  1. 呼吁壹段js脚本。
  2. 加载达成时候出发一遍呼吁,并传递参数
  3. 脱离页面时候,发出三遍呼吁,并传递参数,与地点相比,发掘ep参数有变动。

       
百度总结是依照cookie的,当呼吁js脚本的时候,会在你计算机里保存三个永恒cookie,该cookie作为你的用户标记。同时开采,但剥离时候参数ep从最开端的0变为了“728玖%2C1壹5”,转义后是“728九,115”那是三个飞秒单位,即7.2秒和0.一秒的乐趣。相同的时间前一遍呼吁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)’ #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

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