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编写的导航条程序
Oct 09 PHP
从网上搜到的phpwind 0day的代码
Dec 07 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
深入密码加salt原理的分析
Jun 06 PHP
php实现水仙花数示例分享
Apr 03 PHP
PHP调用Linux命令权限不足问题解决方法
Feb 07 PHP
详解PHP中的PDO类
Jul 06 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
PHP 构造函数和析构函数原理与用法分析
Apr 21 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 header()函数常用方法总结
2014/04/11 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
python实现文件分组复制到不同目录的例子
2014/06/04 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
如何在Python中编写并发程序
2016/02/27 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
暑假家长评语大全
2014/04/17 职场文书
医师定期考核实施方案
2014/05/07 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python