前言:
正文:由于前言中的故事,我忽然想看看网上有没有获取客户端IP以及根据IP得到具体的IP所在地的API,当然容易找到的,否则那么多小网站都写着“欢迎来自上海电信的笑遍世界”,这么容易实现的。所以用Python做了简单的小程序。我使用了腾讯的API来获得IP,使用网易有道的API来获得IP所在地。(因为感觉上腾讯的IP库比较强大,也发现网易有道的IP所在地信息比较详细,所以取二者的长处实验了一下)我的Python小程序返回结果为:
your ip is:124.78.242.245
you are here:上海市黄浦区 电信
腾讯,网易,新浪,搜狐都提供了IP地址转换为实际地址的接口.结合这些门户网站api接口你就可以找到浏览者准确地址了。
下面是几个门户网站的IP查询地址和API接口。
腾讯:http://fw.qq.com/ipaddress 返回格式为 javascript格式对象. 形如: var IPData = new Array(“124.204.70.160″,”",”北京市”,”");
可以在页面中引入js文件 直接调用。
<script lang ge="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress" charset="gb2312"> </script>
<script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>
搜狐: http://pv.sohu.com/cityjson 也是浏览器 js 调用的。返回 var returnCitySN = {“cip”: “124.204.70.160″, “cid”: “110000″, “cname”: “北京市”}; 的格式。
新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
返回var remote_ip_info = {“ret”:1,”start”:”124.205.0.0″,”end”:”124.205.136.255″,”country”:”\中\国”,”province”:”\北\京”,”city”:”\北\京”,”district”:”",”isp”:”\电\信\通”,”type”:”",”desc”:”"};
新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=124.204.70.160
网易有道IP地址查询:http://www.yo?o.com/smartresult-xml/search.s?type=ip&q=124.204.70.160
下面是获取IP和IP所在地的Python小程序(适用于Python3版本)。
主要的注意点有两点:
1.要对API调用的返回对象根据encoding来做decode;
2.就是正则表达式了,哎,再次遇到,发现它真的很好很强大啊。
#! /usr/bin/python3
# -*- coding: utf-8 -*-
'''
Created on 2011-8-15
@author: Jay Ren 笑遍世界
'''
import re
import urllib.reqst
def get_reponse_from_url(url):
req = urllib.reqst.Reqst(url)
encoding = 'gbk'
try:
doc = urllib.reqst.urlopen(req).read()
# print(doc.decode(encoding))
return doc.decode(encoding)
except Exception as e:
print("urlopen Exception : %s" %e)
def get_ip_and_location():
url_ip_qq = "http://fw.qq.com/ipaddress"
url_location_yo?o = "http://www.yo?o.com/smartresult-xml/search.s?type=ip&q="
re_ip = "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))"
str_ip = get_reponse_from_url(url_ip_qq)
ip = re.search(re_ip, str_ip).group(1)
# print("ip="+ip.group(1))
print("your ip is:"+ip)
url_location_yo?o += ip
str_location = get_reponse_from_url(url_location_yo?o)
re_location = '<location>(.*)</location>'
location = re.search(re_location,str_location).group(1)
print("you are here:"+location)
if __name__ == '__main__':
get_ip_and_location()
参考资料:http://www.oophper.com/html/particle/partpage_49.php