淘宝公司提供了一个很好用的IP地理信息查询接口。
在这里:http://ip.taobao.com/
TaobaoIPQuery2这个类将极大的简化相关的信息查询。
类 TaobaoIPQuery2 文件:
<?php
/* Usage:
* $IPInfo = TaobaoIPQuery2::getIPInfo(\'IPAddress\');
*/
Class TaobaoIPQuery2{
private static $_requestURL = \'http://ip.taobao.com/service/getIpInfo.php\';
public static function getIPInfo($ip){
$long = ip2long($ip);
if($long === 0){
throw new Exception(\'IP address error\', 5);
}
$ip=long2ip($long);
$IPInfo = self::queryIPInfo($ip);
return self::parseJSON($IPInfo);
}
private static function queryIPInfo($ip){
$query = http_build_query(array(\'ip\'=>$ip));
$ch = curl_init();
$options = array(
CURLOPT_URL => sprintf(\'%s?%s\', self::$_requestURL, $query),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_AUTOREFERER => false,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_HEADER => false,
CURLOPT_TIMEOUT => 3.0,
);
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
private static function parseJSON($json){
$O = json_decode ($json, true);
if(false === is_null($O)){
return $O;
}
if (version_compare(PHP_VERSION, \'5.3.0\', \'>=\')) {
$errorCode = json_last_error();
if(isset(self::$_JSONParseError[$errorCode])){
throw new Exception(self::$_JSONParseError[$errorCode], 5);
}
}
throw new Exception(\'JSON parse error\', 5);
}
private static $_JSONParseError = array(
JSON_ERROR_NONE=>\'No error has occurred\',
JSON_ERROR_DEPTH=>\'The maximum stack depth has been exceeded\',
JSON_ERROR_CTRL_CHAR=>\'Control character error, possibly incorrectly encoded\',
JSON_ERROR_STATE_MISMATCH=>\'Invalid or malformed JSON\',
JSON_ERROR_SYNTAX=>\'Syntax error\',
JSON_ERROR_UTF8=>\'Malformed UTF-8 characters, possibly incorrectly encoded\',
);
}
TaobaoIPQuery2.Class.php:
<?php
Class TaobaoIPQuery2{
private static $_requestURL = \'http://ip.taobao.com/service/getIpInfo.php\';
public static function getIPInfo($ip){
$long = ip2long($ip);
if($long === 0){
throw new Exception(\'IP address error\', 5);
}
$ip=long2ip($long);
$IPInfo = self::queryIPInfo($ip);
return self::parseJSON($IPInfo);
}
private static function queryIPInfo($ip){
$query = http_build_query(array(\'ip\'=>$ip));
$ch = curl_init();
$options = array(
CURLOPT_URL => sprintf(\'%s?%s\', self::$_requestURL, $query),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_AUTOREFERER => false,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_HEADER => false,
CURLOPT_TIMEOUT => 3.0,
);
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
private static function parseJSON($json){
$O = json_decode ($json, true);
if(false === is_null($O)){
return $O;
}
if (version_compare(PHP_VERSION, \'5.3.0\', \'>=\')) {
$errorCode = json_last_error();
if(isset(self::$_JSONParseError[$errorCode])){
throw new Exception(self::$_JSONParseError[$errorCode], 5);
}
}
throw new Exception(\'JSON parse error\', 5);
}
private static $_JSONParseError = array(
JSON_ERROR_NONE=>\'No error has occurred\',
JSON_ERROR_DEPTH=>\'The maximum stack depth has been exceeded\',
JSON_ERROR_CTRL_CHAR=>\'Control character error, possibly incorrectly encoded\',
JSON_ERROR_STATE_MISMATCH=>\'Invalid or malformed JSON\',
JSON_ERROR_SYNTAX=>\'Syntax error\',
JSON_ERROR_UTF8=>\'Malformed UTF-8 characters, possibly incorrectly encoded\',
);
}
调用:
$ip = $_SERVER[\"REMOTE_ADDR\"]; $ipquery = new taobaoIPQuery($ip); $region = $ipquery->get_region(); $country = $ipquery->get_country(); $city = $ipquery->get_city();
我们再来看个腾讯api接口的
/*
*根据腾讯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;
}
腾讯的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成功
接下来是新浪网的API接口
新浪的IP查询接口地址是:http://int.dpool.sina.com.cn/iplookup/iplookup.php,该连接后面也带有get参数,参数ip=你要查询的IP地址,format=返回的查询结果格式。为了方便起见,返回的格式采用json,即format=json,因此,PHP出来扩展curl外,还得扩展json:
/*
*根据新浪IP查询接口获取IP所在地
*/
function getIPLoc_sina($queryIP){
$url = \'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=\'.$queryIP;
$ch = curl_init($url);
//curl_setopt($ch,CURLOPT_ENCODING ,\'utf8\');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
$location = curl_exec($ch);
$location = json_decode($location);
curl_close($ch);
$loc = \"\";
if($location===FALSE) return \"\";
if (emptyempty($location->desc)) {
$loc = $location->province.$location->city.$location->district.$location->isp;
}else{
$loc = $location->desc;
}
return $loc;
}
使用getIPLoc_sina(\"183.37.209.57\")即可得到IP地址所在的地址位置。
本文地址:https://www.stayed.cn/item/12362
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我