前作 实现了收款码多合一的功能,这是基于我们能够正确识别不同 App 的不同 UserAgent 特征字段之上的。前作没有解说我们是如何获取相应 UA 的。通过嗅探抓包当然是一个解决方案,在计算机上运行模拟器也可行。但这些方法都太重量级了。
本文用 Python 实现一个简单的 HTTP 报文头回声服务;这个服务什么也不干,就只是把发向服务的请求中的 HTTP 报文头返回。
Python 代码 代码位于 GitHub Repository 。核心功能实现在 RequestHandler
类的 do_GET
方法中。该方法将受到的 HTTP 请求的报文头写入响应正文,而后打印在本地标准输出上。此外,HTTP 中其它三种请求方法的处理与 GET
完全相同。可谓一目了然。
实际我们只需执行 python HTTP_header_echo_service.py
即可在 8080 端口运行服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 try : from http.server import HTTPServer, BaseHTTPRequestHandler except : from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler from optparse import OptionParserimport jsonclass RequestHandler (BaseHTTPRequestHandler ): def do_GET (self ): request_path = self.path self.send_response(200 ) self.send_header('Content-Type' , 'application/json' ) self.end_headers() json_string = json.dumps(dict (self.headers)) self.wfile.write(json_string) print ('%sBegin of Headers%s' % ('-' * 5 , '-' * 5 )) for k, v in self.headers.items(): print ('%s: %s' % (k, v)) print ('%sEnd of Headers%s' % ('-' * 5 , '-' * 5 )) return None do_POST = do_GET do_PUT = do_GET do_DELETE = do_GET def main (): port = 8080 print ('Listening on all interfaces:%s' % port) server = HTTPServer(('' , port), RequestHandler) server.serve_forever() if __name__ == "__main__" : parser = OptionParser() parser.usage = ("Creates an HTTP-header-echo-server." ) (options, args) = parser.parse_args() main()
实际运行看看 执行 python HTTP_header_echo_service.py
后,服务会监听本机 8080 端口。在浏览器中访问 http://localhost:8080
得到返回结果:
1 2 3 4 5 6 7 8 9 10 11 { "accept-language" : "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4" , "accept-encoding" : "gzip, deflate" , "host" : "localhost:8080" , "accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" , "user-agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36" , "dnt" : "1" , "connection" : "keep-alive" , "cookie" : "cna=k8yHEPvog1oCAdoedAmhk3yz; l=AoGB/bWp8ixmk2ng-8I0OpNAEcebrvWg; __guid=242983815.4140311236197044700.1504064960140.7058; HULK_TD=t%3D1511410881%26s%3D2cb9fedc6e59ac22bbc416f796970add%26a%3D1; HULK_QD=u%3Duhnatpurapurat%26m%3Duhnatpurapurat%2540360.pa%26d%3D%25E9%25BB%2584%25E6%2599%25A8%25E6%2588%2590; TD=t%3D1511410881%26s%3Da97b7edff5f3e6e7a0920ae7ee326d88%26a%3D1; QD=u%3Duhnatpurapurat%26m%3Duhnatpurapurat%2540360.pa; Prif_66de_st_t=0%7C1522123196%7C06e665a5949159cee56367609a66caaf; Prif_66de_auth=ec018ze%2FGmPt4LA3C3BcDLxQ4Pov3O1HlZIv0EnN%2BBthlGx4IKvidZKtxA; Prif_66de_smile=1D1; Prif_66de_lip=10.18.120.109%2C1522123532; Prif_66de_ulastactivity=9b2dELqg1p%2F6AAzSO8dz8XylvfWBBj748PyquvcqvdLlGncXc5Dy; Prif_66de_saltkey=kRuuho96; Prif_66de_lastvisit=1526726055; Prif_66de_st_p=0%7C1527160289%7C7bae096d1c2d9c2271f9ad539cafc6e4; Prif_66de_visitedfid=106; Prif_66de_viewid=tid_30518" , "upgrade-insecure-requests" : "1" }
以内网 IP 192.168.0.101
生成二维码,用微信扫描后,访问得到结果中可见微信的特征字段:「MicroMessenger」。
1 2 3 4 5 6 7 8 9 { "accept-language" : "zh-cn" , "accept-encoding" : "gzip, deflate" , "connection" : "keep-alive" , "accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" , "user-agent" : "Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E302 MicroMessenger/6.6.6 NetType/WIFI Language/zh_CN" , "host" : "192.168.0.101:8080" , "upgrade-insecure-requests" : "1" }
以上。