php通过淘宝API查询IP地址归属等信息


Posted in PHP onDecember 25, 2015

淘宝公司提供了一个很好用的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地址所在的地址位置。

PHP 相关文章推荐
一个程序下载的管理程序(四)
Oct 09 PHP
谈谈新手如何学习PHP
Dec 23 PHP
动易数据转成dedecms的php程序
Apr 07 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
PHP实现GIF图片验证码
Nov 04 PHP
php处理复杂xml数据示例
Jul 11 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
php读取XML的常见方法实例总结
Apr 25 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
php实现统计目录文件大小的函数
Dec 25 #PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 #PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 #PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 #PHP
PHP实现文件上传和多文件上传
Dec 24 #PHP
纯PHP代码实现支付宝批量付款
Dec 24 #PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 #PHP
You might like
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
许愿墙中用到的函数
2006/10/07 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
innerText 使用示例
2014/01/23 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
Python中使用ElementTree解析XML示例
2015/06/02 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
Python流程控制语句的深入讲解
2020/06/15 Python
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
介绍一下木马病毒的种类
2015/07/26 面试题
教师评优的个人自我评价分享
2013/09/19 职场文书
学生偷窃检讨书
2014/09/25 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
Golang实现可重入锁的示例代码
2022/05/25 Golang
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL