PHP调用纯真IP数据库返回具体地址

举报
lxw1844912514 发表于 2022/03/27 04:12:53 2022/03/27
1.4k+ 0 0
【摘要】 function convertip($ip) { $ip1num = 0; $ip2num = 0; $ipAddr1 =""; $ipAddr2 =""; $dat_path = './QQWry.Dat'; ...

           function convertip($ip) {
             $ip1num = 0;
             $ip2num = 0;
             $ipAddr1 ="";
             $ipAddr2 ="";
             $dat_path = './QQWry.Dat';
             if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
               return 'IP Address Error';
              }
             if(!$fd = @fopen($dat_path, 'rb')){
               return 'IP date file not exists or access denied';
              }
             $ip = explode('.', $ip);
             $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
             $DataBegin = fread($fd, 4);
             $DataEnd = fread($fd, 4);
             $ipbegin = implode('', unpack('L', $DataBegin));
             if($ipbegin < 0) $ipbegin += pow(2, 32);
               $ipend = implode('', unpack('L', $DataEnd));
             if($ipend < 0) $ipend += pow(2, 32);
               $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
             $BeginNum = 0;
             $EndNum = $ipAllNum;
             while($ip1num>$ipNum || $ip2num<$ipNum) {
               $Middle= intval(($EndNum + $BeginNum) / 2);
                fseek($fd, $ipbegin + 7 * $Middle);
               $ipData1 = fread($fd, 4);
               if(strlen($ipData1) < 4) {
                  fclose($fd);
                 return 'System Error';
                }
               $ip1num = implode('', unpack('L', $ipData1));
               if($ip1num < 0) $ip1num += pow(2, 32);
               if($ip1num > $ipNum) {
                 $EndNum = $Middle;
                 continue;
                }
               $DataSeek = fread($fd, 3);
               if(strlen($DataSeek) < 3) {
                  fclose($fd);
                 return 'System Error';
                }
               $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
                fseek($fd, $DataSeek);
               $ipData2 = fread($fd, 4);
               if(strlen($ipData2) < 4) {
                  fclose($fd);
                 return 'System Error';
                }
               $ip2num = implode('', unpack('L', $ipData2));
               if($ip2num < 0) $ip2num += pow(2, 32);
                 if($ip2num < $ipNum) {
                   if($Middle == $BeginNum) {
                      fclose($fd);
                     return 'Unknown';
                    }
                   $BeginNum = $Middle;
                  }
                }
               $ipFlag = fread($fd, 1);
               if($ipFlag == chr(1)) {
                 $ipSeek = fread($fd, 3);
                 if(strlen($ipSeek) < 3) {
                    fclose($fd);
                   return 'System Error';
                  }
                 $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
                  fseek($fd, $ipSeek);
                 $ipFlag = fread($fd, 1);
                }
               if($ipFlag == chr(2)) {
                 $AddrSeek = fread($fd, 3);
                 if(strlen($AddrSeek) < 3) {
                  fclose($fd);
                 return 'System Error';
                }
               $ipFlag = fread($fd, 1);
               if($ipFlag == chr(2)) {
                 $AddrSeek2 = fread($fd, 3);
                 if(strlen($AddrSeek2) < 3) {
                    fclose($fd);
                   return 'System Error';
                  }
                 $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
                  fseek($fd, $AddrSeek2);
                } else {
                  fseek($fd, -1, SEEK_CUR);
                }
               while(($char = fread($fd, 1)) != chr(0))
               $ipAddr2 .= $char;
               $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
                fseek($fd, $AddrSeek);
               while(($char = fread($fd, 1)) != chr(0))
               $ipAddr1 .= $char;
              } else {
                fseek($fd, -1, SEEK_CUR);
               while(($char = fread($fd, 1)) != chr(0))
               $ipAddr1 .= $char;
               $ipFlag = fread($fd, 1);
               if($ipFlag == chr(2)) {
                 $AddrSeek2 = fread($fd, 3);
                 if(strlen($AddrSeek2) < 3) {
                    fclose($fd);
                   return 'System Error';
                  }
                 $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
                  fseek($fd, $AddrSeek2);
                } else {
                  fseek($fd, -1, SEEK_CUR);
                }
               while(($char = fread($fd, 1)) != chr(0)){
                 $ipAddr2 .= $char;
                }
              }
              fclose($fd);
             if(preg_match('/http/i', $ipAddr2)) {
               $ipAddr2 = '';
              }
             $ipaddr = "$ipAddr1 $ipAddr2";
             $ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);
             $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
             $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
             if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
               $ipaddr = 'Unknown';
              }
             return $ipaddr;
            }
    
   

只要调用此方法,传入一个正确的IP地址,就能得到纯真IP数据库中相对应的地理位置了

例如:
convertip(202.96.209.5)  

     
返回的值为:上海市 电信
 
注:写有此方法的文件需和纯真数据库文件(QQWry.Dat)放在同一级目录,否则就需要修改$dat_path的内容。

准备工作:

建议本地IP地址数据库,请到http://www.cz88.net/这个网站下载一个纯真IP数据库,安装完成后,到安装目录里把QQWry.dat文件取出来,这个就是我们想要的IP数据库了,放到你想要目录下。

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100028052

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。