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 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
使用 eAccelerator加速PHP代码的方法
Sep 30 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
php的ZipArchive类用法实例
Oct 20 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
laravel 执行迁移回滚示例
Oct 23 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 utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
php单例模式的简单实现方法
2016/06/10 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
python中异常报错处理方法汇总
2016/11/20 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
Python和Sublime整合过程图示
2019/12/25 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
基于python实现操作redis及消息队列
2020/08/27 Python
python palywright库基本使用
2021/01/21 Python
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
党务公开方案
2014/05/06 职场文书
财务人员入职担保书
2015/09/22 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python