PHP: 当前是:全文显示 <?php define('QQWRY' , $qqwry_root_path . 'QQWry.dat' ) ; 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(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 ) ; return $nRet ; } } function GetRealClientIP() { if( getenv("HTTP_CLIENT_IP") ) { $ip_real = getenv("HTTP_CLIENT_IP") ; } else if( getenv("HTTP_X_FORWARDED_FOR") ) { $ip_real = getenv("HTTP_X_FORWARDED_FOR") ; } else { $ip_real = getenv("REMOTE_ADDR") ; } return $ip_real ; } function ip2location ( $ip ) { $wry = new TQQwry ; $nRet = $wry->qqwry ( $ip ); return $wry->Country.$wry->Local ; } //$ip = $getip; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>IP 地址查询:</title> <style type="text/css"> body, input, td{font: 12px Verdana} .btn{font: 11px Tahoma; text-decoration:none;} </style> <script type="text/javascript" language="JavaScript"> function copyText(obj) { obj = document.getElementById(obj); var rng = document.body.createTextRange(); rng.moveToElementText(obj); rng.scrollIntoView(); rng.select(); rng.execCommand("Copy"); rng.collapse(false); } </script> </head> <body style="margin:20px 20px 20px 20px" onLoad="f.s.focus()"> <h3>IP Service</h3> <p> <? $ip_addr = ""; if ( IsSet($_REQUEST['s']) ) { $ip_addr = $_REQUEST['s']; } else { $ip_addr = GetRealClientIP(); } if ( preg_match("/[a-zA-Z\-_]+/si", $ip_addr) ) { $ip_addr = gethostbyname($ip_addr); } //echo str_replace("CZ88.NET","",ip2location($ip_addr)); ?> <form action="" method="post" id="f"> Enter a domain name or IP number:<br><br> <input name="s" size="40"> <input type="submit"> </form> <table> <tr> <td>IP<? if(!IsSet($_REQUEST['s'])) echo "(您的)" ?>: </td> <td height="30"><div id="ip_addr" style="color:#0000FF"><? echo $ip_addr; ?></div> </td> <td width="10"></td> <td>[<a href="#" onClick="copyText('ip_addr'); return false;" class="btn">Copy to clipboard</a>]</td> </tr> <tr> <td>位置: </td> <td><div id="ip_pos" style="color:#FF0000"><b><? echo str_replace("CZ88.NET","",ip2location($ip_addr)); ?></b></div> </td> <td width="10"></td> <td>[<a href="#" onClick="copyText('ip_pos'); return false;" class="btn">Copy to clipboard</a>]</td> </tr> </table> </body> </html> 下个QQ数据,在这里指定位置define('QQWRY' , $qqwry_root_path . 'QQWry.dat' ) ; 就可以用了