*本文原创作者:allen权,转载须注明来自FreeBuf.COM
在甲方工作的朋友可能会遇到这样的问题,服务器或者系统经常被扫描,通过IP地址我们只能查到某一个市级城市,如下图:
当我们想具体到街道甚至门牌号,该怎么办???
偶然间发现百度地图有高精度IP定位API的接口,通过该接口我们可以通过IP地址定位到具体的地理位置,甚至能精确到门牌号及周围的标志性建筑。该接口的说明地址为:http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip
若想要使用该接口进行查询,必须先申请一个密钥(AK),如下图:
申请过程就不进行说明了。API的接口参数说明和返回参数说明也不过多的介绍,大家可以看一看。因为我想返回基础定位结果+地址信息+POI信息,所以我将请求参数extensions的值设置为3。一次完整的http请求为:http://api.map.baidu.com/highacciploc/v1?qcip=183.55.116.90&qterm=pc&ak=“你的 密钥(AK)”&coord=bd09ll&extensions=3 。请求结果如下图:
结果为json格式数据:
{"content":{"location":{"lat":23.06588,"lng":115.404586},"locid":"925a2a9e3ac5be1cf003afd23c344ab3","radius":30,"confidence":0.5,"address_component":{"country":"中国","province":"广东省","city":"汕尾市","district":"海丰县","street":"新平路","street_number":"","admin_area_code":441521},"formatted_address":"广东省汕尾市海丰县新平路","business":"公平"},"result":{"error":161,"loc_time":"2016-10-19 21:53:28"}}
我们需要的字段为:content字段里面的formatted_address。当然我们也可以将location里面的经度和纬度提取出来从而显示在地图上面。有的IP地址会返回pois数据,比如:183.55.116.95。返回参数如下:
{"content":{"location":{"lat":23.082367,"lng":115.466276},"locid":"3fb96555906fff3100ff21119142ccd5","radius":30,"confidence":1.0,"address_component":{"country":"中国","province":"广东省","city":"汕尾市","district":"海丰县","street":"S335","street_number":"","admin_area_code":441521},"formatted_address":"广东省汕尾市海丰县S335","pois":[{"name":"双墩村","address":"汕尾市海丰县三三五省道","tag":"行政地标;村庄","location":{"lat":23.082422,"lng":115.465348},"uid":"18010998377147269119"},{"name":"双墩村委会","address":"汕尾市海丰县","tag":"政府机构;各级政府","location":{"lat":23.083394,"lng":115.465914},"uid":"17661602237861855231"},{"name":"长联塘尾","address":"汕尾市海丰县","tag":"行政地标;村庄","location":{"lat":23.081358,"lng":115.467315},"uid":"18010998372852301823"},{"name":"双墩小学","address":"335省道附近","tag":"教育培训;小学","location":{"lat":23.083336,"lng":115.465061},"uid":"17661601958688980991"},{"name":"大溪头","address":"汕尾市海丰县","tag":"行政地标;村庄","location":{"lat":23.090326,"lng":115.465995},"uid":"18010998368557334527"}],"location_description":"双墩村东104米"},"result":{"error":161,"loc_time":"2016-10-19 22:03:31"}}
此时我们可以把pois字段也提取出来,值得注意的是pois为数组,我们可以遍历数组数据。
通过上面的分析,用python简单的写了一个脚本,具体代码如下:
# -*- coding:utf-8 -*-
# author:allen权
import sys
import urllib2
import json
def get_ip_information(ip):
url='http://api.map.baidu.com/highacciploc/v1?qcip='+ip+'&qterm=pc&ak='你的密钥(AK)'&coord=bd09ll&extensions=3'
poiss=''
request = urllib2.Request(url)
page = urllib2.urlopen(request, timeout=10)
data_json = page.read()
data_dic = json.loads(data_json)
if(data_dic.has_key("content")):
content=data_dic["content"]
address_component=content["address_component"]
formatted_address=content["formatted_address"]
print "该IP地址的具体位置为:"
print address_component["country"]
print formatted_address
if (content.has_key("pois")):
print "该IP地址附近POI信息如下:"
pois = content["pois"]
for index in range(len(pois)):
pois_name = pois[index]["name"]
pois_address = pois[index]["address"]
print pois_name, pois_address
else:
print 'IP地址定位失败!!!'
if __name__ == '__main__':
get_ip_information('183.55.116.95')
大家把脚本上面的参数ak值改为自己的密钥即可。测试截图如下:
再放一张自己IP的测试截图:
确实精确到了路名,很准确,虽然没有pois的信息。
最后声明一下,成功率:综合定位成功率 65% ,精度:90% 误差 80m 以内;95% 误差 350m。这是官方给出的数据,所说有一定的概率是查询失败的!!!!
*本文原创作者:allen权,转载须注明来自FreeBuf.COM
已有 44 条评论
感谢发表作者~~带小弟弟我飞吧。
拿我家乡的IP想干嘛?
【评论中包含不友善的言论,已被多人举报】
@ cnboy 请问什么才叫有意义??
@ cnboy 你能耐你怎么不发啊
@ cnboy 不装逼能死吧你
@ cnboy 我感觉这篇文章挺好的啊
@ cnboy 你是什么东西?No can No BB
@ cnboy 你厉害,发个有意义的我看看
赞!
测了一下,挺精准的,也就偏差个10来公里而已
@ 暮暮 别把无知当勇气,有本事你发一个精确的啊,只会调侃。
谷歌地图:23.0797859486,115.4711522560
百度地图:23.0856931705,115.4776824973
低端秀。拿ip随便查就有经纬度了,经纬度到地图上地址不都一样吗
腾讯高德:23.0797668500,115.4711411100
图吧地图:23.0748070000,115.4651160000
谷歌地球:23.0823670000,115.4662760000
北纬N23°04′56.52″ 东经E115°27′58.59″
靠近:广东省汕尾市海丰县S335
参考:广东省汕尾市海丰县平东镇双墩村东北方向约1.10公里
@ 楼主是2b 这个可以可以,不过你能不能换个公共点的ip啊
可以,很实用
这个东西应该是移动端收集数据传送到远程服务器,然后服务器维护了一个大数据库。
如果被查询的ip从来没有接入过移动设备,或者接入的移动设备没有百度的应用,就查不到任何信息。
我刚查询了我的vps的ip地址(阿里云vps),返回信息什么都没有。
{"result":{"error":167,"loc_time":"2016-10-26 11:34:53"}}
不管怎么说….你努力了,你开心就好。
您查询的IP:183.55.116.90 相关信息:
本站数据:广东省汕尾市 电信
参考数据1:中国 华南 广东省 汕尾市 电信
参考数据2:中国 广东 汕尾 电信
参考数据3:广东省汕尾市 电信
参考数据4:中国 广东 汕尾 海丰 中国电信
参考数据5:广东省汕尾市海丰县中学前一街()
参考数据6:广东省汕尾市海丰县怡丰街东151号->在康民诊所附近, 在怡丰街旁边, 靠近东丽路–怡丰街路口
@ notolddriver = =你想干嘛= =
拿我家乡的IP想干嘛?
学习了,正好需要这个。。不过有的数据是错的
原理是什么呀
怎么拿到别人的ip,这个再出个文章吧
{"result":{"error":200,"loc_time":"1477468987"}}
??
个人感觉挺不错的,谢谢大兄弟了
前段时间还在想原理
http://www.hao7188.com/
不过撸主的帖子真的在13年就有讲。
但是我不知道 现在知道啦 一次知道两个知识点 还不够好么。。
如果你早就知道 你就淡淡一笑 深藏功与名 不够好么。。
何必喷楼主…… 真正的强者是不是强在实际行动 而不是嘴炮 你又不是漩涡鸣人
http://blog.csdn.net/daixinmei/article/details/10219893
@ yyy3333 我招你惹你了?
三角定位法
广东省汕尾市海丰县梅兴一路144号->在梅陇卫生站附近, 在梅兴一路旁边, 靠近梅兴一路–西兴中路路口
网民的ip是动态,你能查到地址? 能查到ip的,只有固定ip,如服务器,公司的,网吧的,电信热点的。
准不准?
不过百度准吗,有一次一个ip,实际上在美国,百度告诉我在直布罗陀。。。还是说国内的ip会准一些?
膜拜,不但对API分析的很透彻,还能利用python实例出来,厉害
百度的API很多,我以前也用过一个天气的,好久没再去看了
不是都有人搞出来分享了么
http://ditu.amap.com/service/pl/pl.json 高德精度维度 非SDK
http://map.baidu.com/?qt=ipLocation 百度精度维度 非SDK
https://api.map.baidu.com/highacciploc/v1?qcip=IP地址&ak=YIogecncCOvlq2oGgWqnYRUCWhKma8dY&qterm=pc&extensions=1&callback_type=json
不用那么麻烦..增加一个IP的协议头即可…高德的要比百度的好很多.
基本上 原理就是维护一个大的数据表 然后 根据手机等定位信息 去刷新表.同一IP 内 无上网定位的手机 或者 导航 之类的智能设备是查不到的.
还有一种就是 根据 电信商的机房分布 每期区段是维护的 可以根据区段 大体定位 定位精准 需要去机房查接口了..
t.cn/RVhm1EH
能不能定位到妹子的卧室啊[dog]
这种文章也发》。….这智商;令人捉急
喷子真多!!!
我APP的IP定位都搞出来- -你现在才发文章….而且是这样没有营养的- -这样的接口一大堆
这个要赞一个