实用技巧:如何通过IP地址进行精准定位

2016-10-26 +16 5846613人围观 ,发现 76 个不明物体 其他工具

*本文原创作者:allen权,转载须注明来自FreeBuf.COM

在甲方工作的朋友可能会遇到这样的问题,服务器或者系统经常被扫描,通过IP地址我们只能查到某一个市级城市,如下图:

QQ截图20161019182710.png

当我们想具体到街道甚至门牌号,该怎么办???

偶然间发现百度地图有高精度IP定位API的接口,通过该接口我们可以通过IP地址定位到具体的地理位置,甚至能精确到门牌号及周围的标志性建筑。该接口的说明地址为:http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip

若想要使用该接口进行查询,必须先申请一个密钥(AK),如下图:

QQ截图20161019183624.png

申请过程就不进行说明了。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 。请求结果如下图:

QQ截图20161019220405.png

结果为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值改为自己的密钥即可。测试截图如下:

QQ截图20161019221754.png

再放一张自己IP的测试截图:

QQ截图20161019222602.png

确实精确到了路名,很准确,虽然没有pois的信息。

最后声明一下,成功率:综合定位成功率 65%  ,精度:90% 误差 80m 以内;95% 误差 350m。这是官方给出的数据,所说有一定的概率是查询失败的!!!!

*本文原创作者:allen权,转载须注明来自FreeBuf.COM

相关推荐

这些评论亮了

  • 暮暮 回复
    测了一下,挺精准的,也就偏差个10来公里而已
    )352( 亮了
  • 百度ceo 回复
    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 内 无上网定位的手机 或者 导航 之类的智能设备是查不到的.
    还有一种就是 根据 电信商的机房分布 每期区段是维护的 可以根据区段 大体定位 定位精准 需要去机房查接口了..
    )51( 亮了
  • mengxp 回复
    这个东西应该是移动端收集数据传送到远程服务器,然后服务器维护了一个大数据库。
    如果被查询的ip从来没有接入过移动设备,或者接入的移动设备没有百度的应用,就查不到任何信息。
    我刚查询了我的vps的ip地址(阿里云vps),返回信息什么都没有。
    {"result":{"error":167,"loc_time":"2016-10-26 11:34:53"}}
    )50( 亮了
  • cnboy 回复
    【评论中包含不友善的言论,已被多人举报】
    )36( 亮了
  • yyy3333 回复
    不过撸主的帖子真的在13年就有讲。
    但是我不知道 现在知道啦 一次知道两个知识点 还不够好么。。
    如果你早就知道 你就淡淡一笑 深藏功与名 不够好么。。
    何必喷楼主…… 真正的强者是不是强在实际行动 而不是嘴炮 你又不是漩涡鸣人
    http://blog.csdn.net/daixinmei/article/details/10219893
    )28( 亮了
发表评论

已有 75 条评论

取消
Loading...

这家伙太懒,还未填写个人描述!

1 文章数 8 评论数 0 关注者

特别推荐

推荐关注

活动预告

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php