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 相关文章推荐
PHP 七大优势分析
Jun 23 PHP
PHP 多维数组排序实现代码
Aug 05 PHP
php抽奖小程序的实现代码
Jun 18 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
PHP实现批量生成App各种尺寸Logo
Mar 19 PHP
Smarty保留变量用法分析
May 23 PHP
简单谈谈PHP中的trait
Feb 25 PHP
PHP微信PC二维码登陆的实现思路
Jul 13 PHP
PHP PDOStatement::nextRowset讲解
Feb 01 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
php连接mssql数据库的几种方法
2013/02/21 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
简单的php购物车代码
2020/06/05 PHP
Jquery Ajax请求代码(2)
2011/01/07 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
javascript实现二叉树的代码
2017/06/08 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
django使用html模板减少代码代码解析
2017/12/12 Python
Python实现感知机(PLA)算法
2017/12/20 Python
查看Django和flask版本的方法
2018/05/14 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
Python 字符串换行的多种方式
2018/09/06 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
Tensorflow累加的实现案例
2020/02/05 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
企业安全生产承诺书
2014/05/22 职场文书
神农溪导游词
2015/02/11 职场文书
JavaScript 原型与原型链详情
2021/11/02 Javascript