本文目的:
通过分析ip地址归属地解析过程,分享探究问题的基本步骤,逐步认识基础知识的重要。
声明一下:
基于本人知识视野,个人理解能力的限制,文中难免有不当之处,敬请理解。
大家都知道,网上有很多可以查询ip地址归属地的网站,ip138,淘宝,qq等各大网站都提供这种查询,下面以QQ为例,来探究一下如何通过命令行来查询获取归属地的问题。
/cgi-bin/index打开网站,输入要查询的ip
输入要查询的ip地址,于此同时,准备好抓包工具,以便对查询数据进行分析,此处,我开了2个抓包工具,一个是httpwatch网页抓包,一个是wireshark数据包分析。
通过分析数据包,可以看到如下信息
看到绿色部分,采用post提交数据,提交的内容为searchip1=114.114.114.114
OK,此处已经找出规律了,查询采用post提交叫,内容为searchip1=X.X.X.X
那么,可以采用curl进行浏览器模拟提交数据了,命令格式如下
curl URL -d "post提交内容" -e "refer地址" -A "浏览器标识"
#!/bin/bashIP=114.114.114.114curl/cgi-bin/searchip-d"searchip1=$IP"-e"/cgi-bin/index"-A"Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0;QQDownload718;.NETCLR2.0.50727)"
说明:由于curl打开的字符和系统不符合,故无法显示汉字,
可以将结果保存为html,通过浏览器打开,将会看到解析的地址结果。
查看网页源代码
到这里,已经替代了浏览器直接访问,初步取得成果。
事情并未到此结束,下面继续解决字符编码问题
将gh2312字符转换为Utf-8标准字符,借助系统iconv转换
iconv-fgb2312-tutf-8因此命令变为#!/bin/bashIP=114.114.114.114 curl/cgi-bin/searchip-d"searchip1=$IP"-e"/cgi-bin/index"-A"Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0;QQDownload718;.NETCLR2.0.50727)" | iconv-fgb2312-tutf-8|grep "<p>.*"|sed "s/<p>\(.*\).*<span>\(.*\) \(.*\)<\/span><\/p>/\1\2\3/g"
运行结果如下
需求基本搞定,然后是细节完善,写成一个脚本,可以接参数ip地址就自动解析,此处不再写了。当然,这个用python写也许会更好。
这里提供的仅仅是一种思路,解决问题的思路,而解决问题之前,需要具备一定的基础知识
这里需要的知识:
1.能用抓包工具进行抓包,并进行数据包分析2.熟悉curl命令3.熟悉sed,grep等命令进行文本过滤4.其他知识整合能力
完毕,谢谢阅读!
祝大家五一节快乐!
附录一个ip地址归属地解析的python版
#!/usr/bin/envpython#coding=utf8#Filename:monitor_idc.py#Lastmodified:-04-2316:54#Author:itnihao#Mail:itnihao@#Description:importurllib,re,sysdefgetip(ip='114.114.114.114'):url="/cgi-bin/searchip"data="searchip1="+iphtml=urllib.urlopen(url,data).read().decode("gb2312")pat=pile(r'<span>(.*)</span></p>')result=re.findall(pat,html)printip+":"+result[0].encode("utf-8").replace(' ','')#getip('8.8.8.8')getip()
taobao版本#!/usr/bin/envpython#coding=utf8#Filename:get_out_ip.py#Lastmodified:-04-2817:02#Author:itnihao#Mail:itnihao@#Description:importurllib,re,simplejson#获取出口ip地址html=urllib.urlopen('').read()pat=pile('red">([0-9]+.[0-9]+.[0-9]+.[0-9]+)</span>')ip=re.findall(pat,html)ip=ip[0]#获取ip地址归属地解析url='/service/getIpInfo.php?ip=%s'%ipf=urllib.urlopen(url).read()s=simplejson.loads(f)printip+":"+s['data']['country']+s['data']['area']+s['data']['region']+s['data']['city']+s['data']['isp']
效果如下图
本文转自it你好 51CTO博客,原文链接:/itnihao/1189770,如需转载请自行联系原作者