首页 > 代码库 > 根据 HTTP header 收集客户端相关信息

根据 HTTP header 收集客户端相关信息

【课程】    web2.0程序设计
【作业要求】  用 tornado 编写一段小程序,根据 HTTP header 收集客户端相关信息:是否手机、操作系统、浏览器等信息*。
【作业提示】  主要解析 Request header[“User-Agent”] 。该字符串格式可通过 wiki 链接 查 到 ; 通 过 tornado 英 文 网 站 文 档 , 知 道 用 self.request 获 取
        tornado.httputil.HTTPServerRequest 对象实例,该实例有 headers 字典类型的属性。
【参考文档】  User-Agent定义及字符串格式(wiki)      tornado 英 文 网 站 文 档       常见的相关字符串和代表的版本信息

【实验环境】  操作系统:Ubantu 13.10   浏览器:firefox  python:2.7.5+  tornado:1.2.1版本

 

1.根据tonardo英文网站文档,了解到用self.request可以获取到客户端的相关信息。在这里,我先将request的比较重要的一些属性列出来,并作诠释

method
 HTTP 的请求方法:GET或POST

uri
 被请求的uri, 统一资源标识符,用来唯一的标识一个资源(关于uri)

path
 uri的路径部分

query
 uri的请求部分

version
HTTP协议的版本,如“HTTP/1.1”

headers
这是一个字典类型的属性,带有许多丰富的信息,HTTP headers是 HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。

接下来我们来一起看下这里面有哪些信息:
 ‘Accept-Language‘: ‘zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3‘,   //表示浏览器默认的语言设置,q表示优先级,q值越大等级越高
‘Accept-Encoding‘: ‘gzip, deflate‘,            //表示浏览器支持的的压缩方式
‘Connection‘: ‘keep-alive‘,               //表示浏览器和主机一直保持连接
‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,//表示浏览器支持的MIME类型
‘User-Agent‘: ‘Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0‘,//浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
‘Host‘: ‘localhost:8000‘,  //主机名
‘Cookie‘: ‘user=ZmZm|1417654344|5de24afe2a1e8c302f29211dfd4a726186bdc9af‘,//客户端存储的少量用户信息
‘Cache-Control‘: ‘max-age=0‘//响应缓存的有效秒速

headers[‘User-Agent‘]
浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息 

常见的相关字符串和代表的版本信息 

body
 请求内容的主体,如果存在,是一个string类型。

remote_ip
 一个表示客户端IP地址的字符串。

protocol
 程序所遵守的协议

host
 被请求的主机名

arguments
用来存储表示GET/POST的参数字典

files
 上传的文件

connection
 单个连接可以连接多个请求,通过该属性可以访问HTTP的请求

 

2.以下是我的这个小程序的核心代码(命名为t1.py):

#coding:utf-8  import tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webfrom tornado.httpclient import AsyncHTTPClient  from tornado.options import define, optionsdefine("port", default=8000, help="run on the given port", type=int)class IndexHandler(tornado.web.RequestHandler):     def get(self):        print "**************NOW let me show you something about HTTPServerRequest**********"        print "#method#:"              print self.request.method        print "#uri#:"        print self.request.uri        print "#path#:"        print self.request.path        print "#query#:"        print self.request.query        print "#version#:"        print self.request.version        print "#headers#:"        print self.request.headers        print "#headers[‘User-Agent‘]#:"        print self.request.headers[User-Agent]        print "#body#:"        print self.request.body        print "#remote_ip#:"        print self.request.remote_ip        print "#protocol#:"        print self.request.protocol        print "#host#:"        print self.request.host        print "#arguments#:"        print self.request.arguments        print "#files#:"        print self.request.files        print "#connection#:"        print self.request.connectionif __name__ == "__main__":    tornado.options.parse_command_line()    application = tornado.web.Application(        handlers = [(r"/", IndexHandler)])    HTTP_SERVER = tornado.httpserver.HTTPServer(application)    HTTP_SERVER.listen(options.port)    tornado.ioloop.IOLoop.instance().start()

 

打开终端,输入以下命令行:

~$ python t1.py

打开浏览器 并打开链接:localhost:8000

这时候可以在终端看见以下输出

技术分享

 从headers[‘User-Agent‘]可看出, 我的实验中,

操作系统是linux,浏览器是firefox,版本是29.0   其中Gecko 是 Firefox 的呈现引擎,版本是20100101

根据 HTTP header 收集客户端相关信息