欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

php ip地址库

程序员文章站 2022-04-05 18:20:53
...

类文件

<?php


function IpToInt($Ip) { 
  $array=explode('.',$Ip); 
  $Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3]; 
  return $Int; 
}

function IntToIp($Int) { 
  $b1=($Int & 0xff000000)>>24; 
  if ($b1<0) $b1+=0x100; 
  $b2=($Int & 0x00ff0000)>>16; 
  if ($b2<0) $b2+=0x100; 
  $b3=($Int & 0x0000ff00)>>8; 
  if ($b3<0) $b3+=0x100; 
  $b4= $Int & 0x000000ff; 
  if ($b4<0) $b4+=0x100; 
  $Ip=$b1.'.'.$b2.'.'.$b3.'.'.$b4; 
  return $Ip; 
} 

class TQQwry 
{ 
  var $StartIP = 0; 
  var $EndIP = 0; 
  var $Country = ''; 
  var $Local = ''; 

  var $CountryFlag = 0; // 标识 Country位置 
                        // 0x01,随后3字节为Country偏移,没有Local 
                        // 0x02,随后3字节为Country偏移,接着是Local 
                        // 其他,Country,Local,Local有类似的压缩。可能多重引用。 
  var $fp; 

  var $FirstStartIp = 0; 
  var $LastStartIp = 0; 
  var $EndIpOff = 0 ; 

  function getStartIp ( $RecNo ) { 
      $offset = $this->FirstStartIp + $RecNo * 7 ; 
      @fseek ( $this->fp , $offset , SEEK_SET ) ; 
      $buf = fread ( $this->fp , 7 ) ; 
      $this->EndIpOff = ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])* 256*256); 
      $this->StartIp = ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256); 	  	  
      return $this->StartIp ; 
  } 

  function getEndIp ( ) { 
      @fseek ( $this->fp , $this->EndIpOff , SEEK_SET ) ; 
      $buf = fread ( $this->fp , 5 ) ; 
      $this->EndIp = ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256); 
      $this->CountryFlag = ord ( $buf[4] ) ; 
      return $this->EndIp ; 
  } 

  function getCountry ( ) { 

      switch ( $this->CountryFlag ) { 
          case 1: 
          case 2: 
              $this->Country = $this->getFlagStr ( $this->EndIpOff+4) ; 
              //echo sprintf('EndIpOffset=(%x)',$this->EndIpOff ); 
              $this->Local = ( 1 == $this->CountryFlag )? '' : $this->getFlagStr ( $this->EndIpOff+8); 
              break ; 
          default : 
              $this->Country = $this->getFlagStr ($this->EndIpOff+4) ; 
              $this->Local = $this->getFlagStr ( ftell ( $this->fp )) ; 

      } 
  } 

  function getFlagStr ( $offset ) 
  { 

      $flag = 0 ; 
      while ( 1 ){ 
          @fseek ( $this->fp , $offset , SEEK_SET ) ; 
          $flag = ord ( fgetc ( $this->fp ) ) ; 
          if ( $flag == 1 || $flag == 2 ) { 
              $buf = fread ($this->fp , 3 ) ; 
              if ($flag == 2 ){ 
                  $this->CountryFlag = 2 ; 
                  $this->EndIpOff = $offset - 4 ; 
              } 
              $offset = ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])* 256*256); 
          }else{ 
              break ; 
          } 

      } 
      if ( $offset < 12 ) 
          return ''; 
      @fseek($this->fp , $offset , SEEK_SET ) ; 
      return $this->getStr(); 
  } 
  function getStr ( ) 
  { 
      $str = '' ; 
      while ( 1 ) { 
          $c = fgetc ( $this->fp ) ; 
          if ( ord ( $c[0] ) == 0 ) 
             break ; 
          $str .= $c ; 
      } 
      return $str ; 
  } 

  function qqwry ($dotip) { 
      $nRet; 
      $ip = IpToInt ( $dotip ); 
      $this->fp= @fopen($_SERVER['DOCUMENT_ROOT']."ip/IPAddr.Dat", "r");
	  //var_dump($this->fp);exit;
      if ($this->fp == NULL) { 
            $szLocal= "OpenFileError"; 
		  return 1; 

        } 
        @fseek ( $this->fp , 0 , SEEK_SET ) ; 
      $buf = fread ( $this->fp , 8 ) ; 
      $this->FirstStartIp = ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256); 
      $this->LastStartIp = ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])*256*256) + (ord($buf[7])*256*256*256); 

      $RecordCount= floor( ( $this->LastStartIp - $this->FirstStartIp ) / 7); 
      if ($RecordCount <= 1){ 
          $this->Country = "FileDataError"; 
          fclose ( $this->fp ) ; 
          return 2 ; 
      } 
		
        $RangB= 0; 
      $RangE= $RecordCount; 
      // Match ... 
      while ($RangB < $RangE-1) 
      { 
        $RecNo= floor(($RangB + $RangE) / 2); 
        $this->getStartIp ( $RecNo ) ; 

          if ( $ip == $this->StartIp ) 
          { 
              $RangB = $RecNo ; 
              break ; 
          } 
        if ( $ip > $this->StartIp) 
          $RangB= $RecNo; 
        else 
          $RangE= $RecNo; 
      } 
      $this->getStartIp ( $RangB ) ; 
      $this->getEndIp ( ) ; 

      if ( ( $this->StartIp <= $ip ) && ( $this->EndIp >= $ip ) ){ 
          $nRet = 0 ; 
          $this->getCountry ( ) ; 
		  
          //转换
          $this->Local = str_replace("(我们一定要解放*!!!)", "", $this->Local); 

      }else { 
          $nRet = 3 ; 
          $this->Country = '未知' ; 
          $this->Local = '' ; 
      } 
      fclose ( $this->fp ) ; 
      return $nRet ; 
  } 
} 

function get_address($ip) 
{ 
  $wry = new TQQwry ; 
  $nRet = $wry->qqwry ( $ip );
   print_r($nRet);exit;
  //可以利用 $nRet做一些事情,我是让他自动记录未知IP到一个表,代码就不写了。
  $strRet=$wry->Country.$wry->Local;
  $strRet=str_replace("ETE.CN","",$strRet);
  return  $strRet; 
  //return $wry->Country; 
} 

function get_country($ip)
{
  $wry = new TQQwry ; 
  $nRet = $wry->qqwry ( $ip ); 
 
  //可以利用 $nRet做一些事情,我是让他自动记录未知IP到一个表,代码就不写了。
  $strRet=$wry->Country;
  $strRet=str_replace("ETE.CN","",$strRet);
  return  $strRet; 
}

function get_ip_array($ip){
  $wry = new TQQwry ; 
  $nRet = $wry->qqwry ( $ip ); 
  //可以利用 $nRet做一些事情,我是让他自动记录未知IP到一个表,代码就不写了。
  $strRet=$wry->Country.$wry->Local;
  $strRet=str_replace("ETE.CN","",$strRet);
  $ar['country'] = $wry->Country;
  $ar['address'] = $strRet;
  $ar['local'] = $wry->Local;
  return  $ar; 
}


// test

var_dump( get_ip_array('173.192.132.232'));

var_dump( get_ip_array('183.129.146.234'));

?>

解压文件 ~ 3MB

php ip地址库IPAddr.rar

淘宝的ip地址API

接口说明
1. 请求接口(GET):
http://www.php.cn/[ip地址字串]
2. 响应信息:
(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商
3. 返回数据格式:
{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317",
"region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",
"country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",
"county_id":"-1","isp_id":"100017"}}
其中code的值的含义为,0:成功,1:失败。
相关标签: php ip地址库