甲方工作的朋友可能會(huì)遇到這樣的問題晨汹,服務(wù)器或者系統(tǒng)經(jīng)常被掃描豹储,通過IP地址我們只能查到某一個(gè)市級(jí)城市,如下圖:
當(dāng)我們想具體到街道甚至門牌號(hào)淘这,該怎么辦剥扣?巩剖??
偶然間發(fā)現(xiàn)百度地圖有高精度IP定位API的接口钠怯,通過該接口我們可以通過IP地址定位到具體的地理位置佳魔,甚至能精確到門牌號(hào)及周圍的標(biāo)志性建筑。該接口的說明地址為:http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip
若想要使用該接口進(jìn)行查詢晦炊,必須先申請(qǐng)一個(gè)密鑰(AK)鞠鲜,如下圖:
申請(qǐng)過程就不進(jìn)行說明了。API的接口參數(shù)說明和返回參數(shù)說明也不過多的介紹刽锤,大家可以看一看镊尺。因?yàn)槲蚁敕祷鼗A(chǔ)定位結(jié)果+地址信息+POI信息,所以我將請(qǐng)求參數(shù)extensions的值設(shè)置為3并思。一次完整的http請(qǐng)求為:http://api.map.baidu.com/highacciploc/v1?qcip=183.55.116.90&qterm=pc&ak=“你的 密鑰(AK)”&coord=bd09ll&extensions=3 庐氮。請(qǐng)求結(jié)果如下圖:
結(jié)果為json格式數(shù)據(jù):
{"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。當(dāng)然我們也可以將location里面的經(jīng)度和緯度提取出來從而顯示在地圖上面宋彼。有的IP地址會(huì)返回pois數(shù)據(jù)弄砍,比如:183.55.116.95。返回參數(shù)如下:
{"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":"行政地標(biāo);村莊","location":{"lat":23.082422,"lng":115.465348},"uid":"18010998377147269119"},{"name":"雙墩村委會(huì)","address":"汕尾市海豐縣","tag":"政府機(jī)構(gòu);各級(jí)政府","location":{"lat":23.083394,"lng":115.465914},"uid":"17661602237861855231"},{"name":"長(zhǎng)聯(lián)塘尾","address":"汕尾市海豐縣","tag":"行政地標(biāo);村莊","location":{"lat":23.081358,"lng":115.467315},"uid":"18010998372852301823"},{"name":"雙墩小學(xué)","address":"335省道附近","tag":"教育培訓(xùn);小學(xué)","location":{"lat":23.083336,"lng":115.465061},"uid":"17661601958688980991"},{"name":"大溪頭","address":"汕尾市海豐縣","tag":"行政地標(biāo);村莊","location":{"lat":23.090326,"lng":115.465995},"uid":"18010998368557334527"}],"location_description":"雙墩村東104米"},"result":{"error":161,"loc_time":"2016-10-19 22:03:31"}}
此時(shí)我們可以把pois字段也提取出來输涕,值得注意的是pois為數(shù)組音婶,我們可以遍歷數(shù)組數(shù)據(jù)。
通過上面的分析莱坎,用python簡(jiǎn)單的寫了一個(gè)腳本衣式,具體代碼如下:
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
# author:allen權(quán)
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地址定位失敗i苁病2晡浴!'
if __name__ == '__main__':
get_ip_information('183.55.116.95')
大家把腳本上面的參數(shù)ak值改為自己的密鑰即可乃正。測(cè)試截圖如下:
再放一張自己IP的測(cè)試截圖:
確實(shí)精確到了路名住册,很準(zhǔn)確,雖然沒有pois的信息瓮具。
最后聲明一下荧飞,成功率:綜合定位成功率 65% ,精度:90% 誤差 80m 以內(nèi)名党;95% 誤差 350m叹阔。這是官方給出的數(shù)據(jù),所說有一定的概率是查詢失敗的4谩6薄!蒋歌!
*本文原創(chuàng)作者:allen權(quán)帅掘,轉(zhuǎn)載須注明來自FreeBuf.COM