Heim  >  Artikel  >  php教程  >  php ip地址库

php ip地址库

PHP中文网
PHP中文网Original
2016-05-25 17:06:362854Durchsuche

类文件    

<?php


function IpToInt($Ip) { 
  $array=explode(&#39;.&#39;,$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.&#39;.&#39;.$b2.&#39;.&#39;.$b3.&#39;.&#39;.$b4; 
  return $Ip; 
} 

class TQQwry 
{ 
  var $StartIP = 0; 
  var $EndIP = 0; 
  var $Country = &#39;&#39;; 
  var $Local = &#39;&#39;; 

  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(&#39;EndIpOffset=(%x)&#39;,$this->EndIpOff ); 
              $this->Local = ( 1 == $this->CountryFlag )? &#39;&#39; : $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 &#39;&#39;; 
      @fseek($this->fp , $offset , SEEK_SET ) ; 
      return $this->getStr(); 
  } 
  function getStr ( ) 
  { 
      $str = &#39;&#39; ; 
      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[&#39;DOCUMENT_ROOT&#39;]."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 = &#39;未知&#39; ; 
          $this->Local = &#39;&#39; ; 
      } 
      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[&#39;country&#39;] = $wry->Country;
  $ar[&#39;address&#39;] = $strRet;
  $ar[&#39;local&#39;] = $wry->Local;
  return  $ar; 
}


// test

var_dump( get_ip_array(&#39;173.192.132.232&#39;));

var_dump( get_ip_array(&#39;183.129.146.234&#39;));

?>

解压文件 ~ 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:失败。

                   

                   

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn