1、第一种方式(此方式查询结果相当精确)
参考:http://www.lianyue.org/2013/2472/
<?php
/*
$ip = empty( $_GET['ip'] ) ? '' : (string) $_GET['ip'];
if ( !$ip || !filter_var( $ip, FILTER_VALIDATE_IP ) ) {
die('error');
}
*/
$ip = "175.6.2.6";
print_r( whois_ip($ip) );
/**
* ip whois 查询
*
* 1 参数 ip
*
* 返回值 数组
**/
function whois_ip( $ip ) {
// http://www.icann.org/zh/about/learning/glossary 这是 介绍 IP等的,
// inetnum = IP段
// netname = 公司名称
// descr = 公司地址
// country = 国家 中国 CN 美国US 日本JP
// address = IP 所在地址
// whois = 查询的服务器
// 非洲
$whois[ 'whois.afrinic.net']['inetnum' ] = 'inetnum';
$whois[ 'whois.afrinic.net']['netname' ] = 'netname';
$whois[ 'whois.afrinic.net']['country' ] = 'country';
$whois[ 'whois.afrinic.net']['address' ] = 'address';
$whois[ 'whois.afrinic.net']['descr' ] = 'descr';
// 美洲
$whois[ 'whois.arin.net']['inetnum' ] = 'netrange';
$whois[ 'whois.arin.net']['netname' ] = 'netname';
$whois[ 'whois.arin.net']['country' ] = 'country';
$whois[ 'whois.arin.net']['address' ] = 'address';
$whois[ 'whois.arin.net']['descr' ] = 'orgname';
// 亚太
$whois[ 'whois.apnic.net']['inetnum' ] = 'inetnum';
$whois[ 'whois.apnic.net']['netname' ] = 'netname';
$whois[ 'whois.apnic.net']['country' ] = 'country';
$whois[ 'whois.apnic.net']['address' ] = 'address';
$whois[ 'whois.apnic.net']['descr' ] = 'descr';
// 拉丁美洲和加勒比海
$whois[ 'whois.lacnic.net']['inetnum' ] = 'inetnum';
$whois[ 'whois.lacnic.net']['netname' ] = 'ownerid';
$whois[ 'whois.lacnic.net']['country' ] = 'country';
$whois[ 'whois.lacnic.net']['address' ] = 'address';
$whois[ 'whois.lacnic.net']['descr' ] = 'owner';
// 欧洲
$whois[ 'whois.ripe.net']['inetnum' ] = 'inetnum';
$whois[ 'whois.ripe.net']['netname' ] = 'netname';
$whois[ 'whois.ripe.net']['country' ] = 'country';
$whois[ 'whois.ripe.net']['address' ] = 'address';
$whois[ 'whois.ripe.net']['descr' ] = 'descr';
// 获得 ip 的查询地区
if ( !$sock = fsockopen( 'whois.iana.org' , 43, $errNum, $errStr, 5 ) ) {
return false;
}
fputs( $sock, $ip . "\n" );
$r = array( );
while( !feof( $sock ) ) {
$a = explode( ':', fgets( $sock, 4096 ), 2 );
if ( count( $a ) == 2 ) {
$a[1] = trim( $a[1] );
if ( in_array( $a[0], array( 'whois', 'refer' ) ) && in_array( $a[1], array_keys( $whois ) ) ) {
$refer = trim( $a[1] );
break;
}
}
if ( in_array( $a[0], array( 'inetnum', 'netname', 'descr' , 'address', 'country' ) ) ) {
$r[$a[0]] = $a[1];
}
if ( $a[0] == 'organisation' && empty( $r[ 'netname'] ) ) {
$r[ 'netname'] = $a[1];
}
}
fclose( $sock );
if ( $r && empty( $refer ) ) {
$r = array_pad_value( $r, array_keys( reset( $whois ) ) );
$r[ 'whois'] = 'whois.iana.org' ;
return $r;
}
if ( empty ( $refer ) ) {
return false;
}
$whois = $whois[$refer];
if ( !$sock = fsockopen( $refer, 43, $errNum, $errStr, 5 ) ) {
return false;
}
fputs( $sock, $ip . "\n" );
$arr = array();
while( !feof( $sock ) ) {
$a = explode( ':', fgets( $sock, 4096 ), 2 );
$a[0] = strtolower( trim( $a[0] ) );
if ( strpos( $a[0], ' ' ) || count( $a ) != 2 ) {
continue;
}
$arr[] = $a;
}
$r = array();
$all = array_flip( $whois );
foreach ( $arr as $k => $v ) {
if ( empty ( $all[$v[0]] ) ) {
continue;
}
$kk = $all[$v[0]];
if ( empty ( $r[$kk] ) ) {
$r[$kk] = trim( $v[1] );
} elseif ( $arr[$k-1][0] == $v[0] ) {
$r[$kk] .= "\n". trim( $v[1] );
}
}
$r = array_pad_value( $r, array_keys( $whois ) );
$r[ 'whois'] = $refer;
return $r;
}
/**
* 数组 填补值
*
* 1 参数 需要进行处理的数组
* 2 参数 只保留下哪些下标 和没有添加哪些下标 数组 或者 字符串 array( 'key', 'tmd' ) key,tmd
* 3 参数 添加的默认值
* 4 参数 是否进行过滤 过滤后只保留2参数里面有的值的KEY
*
* 返回值 处理后的数组
**/
function array_pad_value( $arr = array(), $pad = array(), $value = null, $intersect_key = true ) {
$arr = (array) $arr;
if( !is_array( $pad ) ) {
$pad = explode( ',', $pad );
}
$p = array();
foreach ( $pad as $v ) {
$p[$v] = $value;
}
$arr += $p;
if( $intersect_key ) {
return array_intersect_key( $arr , $p );
} else {
return $arr;
}
}
2、第二种方式
参考:http://blog.csdn.net/jiftlixu/article/details/7086969
<?php
$info = ip_Place("218.75.124.100");
list($IP,$Country,$Province,$City,$Net) = $info;
echo "IP: ".$IP. "<br>";
echo "国家:".$Country. "<br>";
echo "省: ".$Province. "<br>";
echo "城市:".$City. "<br>";
echo "运营商:".$Net. "<br>";
function ip_Place($ipAddr){
// $ipAddr = "218.75.124.100";
$ip138Addr = "http://counter.sina.com.cn/ip?ip=".$ipAddr;
$contents = file_get_contents($ip138Addr);
$intStart = strpos($contents, "new Array(")+10;
$intEnd = strpos($contents, ");");
$Info = substr($contents,$intStart,$intEnd-$intStart);
$Info = str_replace( "\"","" ,$Info);
$place = explode( ",",$Info);
return $place;
}
?>
参考:http://blog.163.com/pcttcnc2007@126/blog/static/5175295820143215735175/
<?php
define('ISP_NONE',0); //未知
define('ISP_DIANXIN',1); //电信
define('ISP_LIANTONG',2); //联通
define('ISP_YIDONG',3); //移动
define('ISP_TIETONG',4); //铁通
define('ISP_YITONG',5); //移通
define('ISP_DIANXINTONG',6); //电信通
define('ISP_JIAOYUWANG',7); //教育网
define('ISP_CHANGCHENGKUANGDAI',8); //长城宽带
define('ISP_YOUXIANTONG',9); //有线通
define('ISP_GUANGDIAN',10); //广电
define('ISP_KUANGDAITONG',11); //宽带通
define('ISP_YOUTIANKUANGDAI',12); //油田宽带
define('ISP_GEHUA',13); //歌华
define('ISP_SHIJIHULIAN',14); //世纪互联
define('ISP_SHIXUNKUANGDAI',15); //视讯宽带
define('ISP_FANGZHENGKUANGDAI',16); //方正宽带
define('ISP_HUATONGKUANGDAI',17); //华通宽带
define('ISP_HANGSHUKUANGDAI',18); //航数宽网
define('ISP_HUAYUKUANGDAI',19); //华宇宽带
define('ISP_WANGTONG',20); //网通
define('ISP_WANGSU',21); //网宿
define('ISP_LANBOKUANGDAI',22); //蓝波宽带
function get_responseText($url,$para){
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1); // 显示输出结果
curl_setopt($curl,CURLOPT_POST, true); // post传输数据
curl_setopt($curl,CURLOPT_POSTFIELDS,$para); // post传输数据
$responseText = curl_exec($curl);
//var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
curl_close($curl);
return $responseText;
}
function get_ips_num($ip){
$ips_num = 0;
$ip = trim($ip);
$url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=" .$ip;//新浪接口
$para = '';
$response_text = get_responseText($url,$para);
if($response_text && strlen($response_text) > 0){
$response_object = json_decode($response_text);
if(is_object($response_object)){
if(isset ($response_object->isp)){
$isp = trim($response_object-> isp);
switch($isp){
case '电信':
$ips_num = ISP_DIANXIN;
break;
case '联通':
$ips_num = ISP_LIANTONG;
break;
case '移动':
$ips_num = ISP_YIDONG;
break;
case '铁通':
$ips_num = ISP_TIETONG;
break;
case '移通':
$ips_num = ISP_YITONG;
break;
case '电信通':
$ips_num = ISP_DIANXINTONG;
break;
case '教育网':
$ips_num = ISP_JIAOYUWANG;
break;
case '长城宽带':
$ips_num = ISP_CHANGCHENGKUANGDAI;
break;
case '有线通':
$ips_num = ISP_YOUXIANTONG;
break;
case '广电':
$ips_num = ISP_GUANGDIAN;
break;
case '宽带通':
$ips_num = ISP_KUANGDAITONG;
break;
case '油田宽带':
$ips_num = ISP_YOUTIANKUANGDAI;
break;
case '歌华':
$ips_num = ISP_GEHUA;
break;
case '世纪互联':
$ips_num = ISP_SHIJIHULIAN;
break;
case '视讯宽带':
$ips_num = ISP_SHIXUNKUANGDAI;
break;
case '方正宽带':
$ips_num = ISP_FANGZHENGKUANGDAI;
break;
case '华通宽带':
$ips_num = ISP_HUATONGKUANGDAI;
break;
case '航数宽网':
$ips_num = ISP_HANGSHUKUANGDAI;
break;
case '华宇宽带':
$ips_num = ISP_HUAYUKUANGDAI;
break;
case '网通':
$ips_num = ISP_WANGTONG;
break;
case '网宿':
$ips_num = ISP_WANGSU;
break;
case '蓝波宽带':
$ips_num = ISP_LANBOKUANGDAI;
break;
}
}
}
}
return $ips_num;
}
$ip = "220.181.90.240";
$ips_num = get_ips_num($ip);
var_dump($ips_num);
3、其它如腾讯、淘宝ip库、ip138
通过ip138获取客户端ip物理地址和运营商
$ip138Addr = "http://www.ip138.com/ips1388.asp?ip=" . $ipAddr . "&action=2";
$ip138Html = iconv("GBK", "UTF-8", file_get_contents($ip138Addr));
preg_match("/本站主数据:(.+)<\/li><li>参考数据一/", $ip138Html, $subject);
$result = array();
$subject = isset($subject[1]) ? explode(' ', trim($subject[1])) : '';
$result['city'] = isset($subject[0]) ? $subject[0] : '';
$result['isp'] = isset($subject[1]) ? $subject[1] : '';
return $result;
}