查看: 5600|回复: 0
打印 上一主题 下一主题

PHP直接从QQWry.dat解析IP地址的程序

[复制链接]
跳转到指定楼层
1#
发表于 2007-10-4 17:29:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
<?php
#文件名:QQWry.php
/*++++++++++++++++++++++++++++++++++++
程序名称:IP解析程序
程序功能:基于QQ的二进制数据库QQWry.Dat
程序作者:未知
使用方法:

请将文件 QQWry.Dat 置于当前目录中

#实例+++++++++++++++++++++++++++++++
$ip="202.201.48.1";#
$QQWry=new QQWry;
$ifErr=$QQWry->QQWry($ip);
echo "$QQWry->Country$QQWry->Local";

+++++++++++++++++++++++++++++++++++++*/

define('__QQWRY__' , dirname(__FILE__)."/QQWry.Dat");

//echo __QQWRY__;
class QQWry{
  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 ) ;
    //echo "$c\n" ;

    if(ord($c[0])== 0 )
      break ;
    $str.= $c ;
  }
  //echo "$str \n";
  return $str ;
  }


  function qqwry ($dotip='') {
    if(!$dotip)return;
        if(ereg("^(127)",$dotip)){$this->Country=本地网络;return;}
        elseif(ereg("^(192)",$dotip)) {$this->Country=局域网;return;}

  $nRet;
  $ip=$this->IpToInt ( $dotip );
  $this->fp= fopen(__QQWRY__, "rb");
  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 );
$this->Country=preg_replace("/(CZ88.NET)|(纯真网络)/","ZH5J.COM",$this->Country);
$this->Local=preg_replace("/(CZ88.NET)|(纯真网络)/","ZH5J.COM",$this->Local);
//////////////看看 $nRet在上面的值是什么0和3,于是将下面的行注释掉
    return $nRet ;

  //return "$this->Country $this->Local";#如此直接返回位置和国家便可以了
  }

  function IpToInt($Ip) {
  $array=explode('.',$Ip);
  $Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3];
  return $Int;
  }
}
function GetIP(){//获取IP
  return $_SERVER[REMOTE_ADDR]?$_SERVER[REMOTE_ADDR]:$GLOBALS[HTTP_SERVER_VARS][REMOTE_ADDR];
}
?>
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表