API之IP地址查询---权威的IP地
原文地址:http://yushine.iteye.com/blog/1717586
因为要做天气预报这件事,发现搜狐好像没有一个实时的判断浏览器所在城市的方法——已有的都是把判断结果放在某定期失效的cookie里,这样可以减少服务器压力。
仔细一想就觉得这玩意其实对资源消耗没有那么大,于是就要求整一个实时的。。。。。然后就觉得该接口也可以给外部开发者调用:http://pv.sohu.com/cityjson
这个接口是给浏览器JS来调用的,缺省返回 gbk 编码的数据;如果你的应用是 UTF-8,加一个参数 http://pv.sohu.com/cityjson?ie=utf-8
目前这个接口只是搜狐在用,所以参数很简单,返回的那个 cid 还很魔幻;如果觉得这个接口确实有帮助,可以把需求发给俺们来继续改进之
未来也许搜狐会提供给互联网开发者更多的接口和服务。
BTW:写这篇blog之前突然想到,中国互联网应该有类似的接口了吧,一查之下果然 QQ 有一个 http://fw.qq.com/ipaddress ,但好像不是官方支持,而且它只有 gbk,哇咔咔
=================================================================
各门户/大型网站IP地址查询接口:
腾讯 : http://fw.qq.com/ipaddress
直接返回本机的IP地址对应的地区,准确度较高。
其实还可以利用腾讯的IP分享计划根据IP地址来获取更准确的IP地址,详看教程:http://bbs.pinluo.com/thread-28505-1-1.html
新浪 :http://counter.sina.com.cn/ip?ip=IP 地址
或http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=IP 地址
返回Js数据,感觉不是很精确,可以把问号后面的去掉,直接返回本机对应的IP所在地。
搜狐 :http://pv.sohu.com/cityjson?ie=utf-8 或者http://txt.go.sohu.com/ip/soip
网易有道 :http://www.youdao.com/smartresult-xml/search.s?type=ip&q=0.0.0.0
把0.0.0.0换成需查询的IP地址即可,以下同,这个应该是用纯真的数据库。
(还可查手机号码)
http://www.youdao.com/smartresult-xml/search.s?type=mobile&q=13888880000
太平洋电脑网 :http://whois.pconline.com.cn/?ip=0.0.0.0
把0.0.0.0换成IP地址,页面上还有其他无关内容。
IP138 :http://www.ip138.com/ips.asp?ip=IP 地址
准确度非常高,IP经常更新。
纯真IP数据库 :http://www.cz88.net/
====================================================
我用新浪打开是显示:1 116.1.204.0 116.1.205.255 中国 广西 崇左 电信 广西南宁市电信
用腾讯打开是显示:var IPData = new Array("116.1.205.88","","广西","南宁市");
用www.ip138.com 打开是显示:116.1.205.88 本站主数据:广西自治区南宁市 电信
很明显,新浪是错误的,它IP显示错误,并且将南宁市显示为崇左市了。这是两个不同的城市啊!
===========调用方法示例=====================
使用JS代码进行调取:
Js代码
<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"></script> <script>document.write("你的IP是:"+IPData[0]+",来 自:"+IPData[2]);</script>
<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"></script> <script>document.write("你的IP是:"+IPData[0]+",来 自:"+IPData[2]);</script>
使用PHP解析的方法:
Php代码
<?php function getIpPlace(){ $ip=file_get_contents("http://fw.qq.com/ipaddress"); $ip=str_replace('"',' ',$ip); $ip2=explode("(",$ip); $a=substr($ip2[1],0,-2); $b=explode(",",$a); return $b; } $ip=getIpPlace(); print_r($ip); ?>
<?phpfunction getIpPlace(){ $ip=file_get_contents("http://fw.qq.com/ipaddress"); $ip=str_replace('"',' ',$ip); $ip2=explode("(",$ip); $a=substr($ip2[1],0,-2); $b=explode(",",$a); return $b;}$ip=getIpPlace();print_r($ip);?>
=============================================================
PHP利用腾讯IP分享计划获取IP地理位置 腾讯的IP分享计划的查询接口连接是:http://ip.qq.com/cgi-bin/searchip,该连接后面会带有一个get参数searchip1,即searchip1=你要查询的IP地址。
使用方法是:采用PHP向http://ip.qq.com/cgi-bin/searchip 发送http get request,然后获取相应,获得相应结果后,将结果用正则表达式将需要的地理位置信息提取出来就OK了。当然,PHP发送get请求的方法有很多,我用curl来模拟http请求的方法。
Curl 是PHP的一个扩展,进行测试之前,先确认PHP已经加载了curl扩展。打开PHP配置文件php.ini,搜索 “extension=php_curl.dll”,将其前面的分号(;)去掉,然后重启HTTP服务器,查看phpinfo(),若能看到curl的信 息,说明PHP扩展curl成功。
接下来就简单了,一段代码就可以搞定:
/**根据腾讯IP分享计划的地址获取IP所在地,比较精确 */
function getIPLoc_QQ($queryIP){
$url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
$result = curl_exec($ch);
$result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
curl_close($ch);
preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
使用getIPLoc_QQ("183.37.209.57")即可得到IP地址所在的地址位置。
腾讯IP分享计划这个网站用的是gb2312编码,获取的响应需要用mb_convert_encoding函数进行编码转换,否则会有乱码。