通过IP地址获取用户所在地
时间: 作者:刘泽霖
我们经常会看到某些网站在你打开之后会显示你当前所在的城市,那这个信息是怎么获取到的呢?
其实原理就是通过查库的方法实现的。拥有一个大而全的数据库,其中存储着各个ip对应的所在地信息。当我们想知道某一个ip对应的地理位置时就想普通的查询一样查出想要的信息。
但是这样的数据库不是轻易地就能建立并维护的。而且早已有人想到这个问题,我们想实现这个功能也不必重复制造轮子。
实现的方法就是调用别人提供的接口。已经有很多网站都提供了通过ip查询所在地的接口。如腾讯、新浪、淘宝、百度等。
下面用淘宝和百度的接口实现ip地址获取用户所在地。一、淘宝接口
- 请求接口(GET):
/service/getIpInfo.php?ip=[ip地址字串]- 响应信息:
(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商- 返回数据格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 {
"code": 0,
"data": {
"ip": "210.75.225.254",
"country": "中国",
"area": "华北",
"region": "北京市",
"city": "北京市",
"county": "",
"isp": "电信",
"country_id": "86",
"area_id": "100000",
"region_id": "110000",
"city_id": "110000",
"county_id": "-1",
"isp_id": "100017"
}
}
其中code的值的含义为,0:成功,1:失败。
访问限制
为了保障服务正常运行,每个用户的访问频率需小于10qps。
二、百度接口
服务地址
http://api.map.baidu.com/location/ip
接口参数
|参数| 含义| 格式| 说明|
|-|-|-|-|
|ip|ip地址|string|可选,ip不出现,或者出现且为空字符串的情况下,会使用当前访问者的IP地址作为定位参数|
|ak|用户密钥|string|必选,在lbs云官网注册的access key,作为访问的依据
|sn|用户的权限签名|string|可选,若用户所用ak的校验方式为sn校验时该参数必须。(sn生成算法)
|coor|输出的坐标格式|string|可选,coor不出现时,默认为百度墨卡托坐标;coor=bd09ll时,返回为百度经纬度坐标|
返回值说明
返回结果(地址解析的结果)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19{
address: "CN|北京|北京|None|CHINANET|1|None", #地址
content: { #详细内容
address: "北京市", #简要地址
address_detail: { #详细地址信息
city: "北京市", #城市
city_code: 131, #百度城市代码
district: "", #区县
province: "北京市", #省份
street: "", #街道
street_number: "" #门址
},
point: { #百度经纬度坐标值
x: "116.39564504",
y: "39.92998578"
}
},
status: 0 #返回状态码
}
接口示例
服务示例:
http://api.map.baidu.com/location/ip?ak=E4805d16520de693a3fe707cdc962045&ip=202.198.16.3&coor=bd09ll
返回值:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 {
address: "CN|吉林|长春|None|CERNET|1|None",
content: {
address: "吉林省长春市",
address_detail: {
city: "长春市",
city_code: 53,
district: "",
province: "吉林省",
street: "",
street_number: ""
},
point: {
x: "125.31364243",
y: "43.89833761"
}
},
status: 0
}
总结
- 想要通过ip获取所在地首先要获得用户的真实ip,内网ip是无法查询到所在地信息的。
- 获得了用户的真实ip,由于已经有很多第三方接口,只需调用接口即可获得信息。其原理是通过查库的方式查询用户的所在地信息。库中信息定期维护。
- 每个接口的定义都有所不同,返回的数据格式也有所不同。例如:JSON、HTML、XML等。得到返回的结果还需要进行一定的处理才能最终在程序中使用。