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

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

    
  1. function convertip($ip) {
  2. $ip1num = 0;
  3. $ip2num = 0;
  4. $ipAddr1 ="";
  5. $ipAddr2 ="";
  6. $dat_path = './QQWry.Dat';
  7. if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
  8. return 'IP Address Error';
  9. }
  10. if(!$fd = @fopen($dat_path, 'rb')){
  11. return 'IP date file not exists or access denied';
  12. }
  13. $ip = explode('.', $ip);
  14. $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
  15. $DataBegin = fread($fd, 4);
  16. $DataEnd = fread($fd, 4);
  17. $ipbegin = implode('', unpack('L', $DataBegin));
  18. if($ipbegin < 0) $ipbegin += pow(2, 32);
  19. $ipend = implode('', unpack('L', $DataEnd));
  20. if($ipend < 0) $ipend += pow(2, 32);
  21. $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
  22. $BeginNum = 0;
  23. $EndNum = $ipAllNum;
  24. while($ip1num>$ipNum || $ip2num<$ipNum) {
  25. $Middle= intval(($EndNum + $BeginNum) / 2);
  26. fseek($fd, $ipbegin + 7 * $Middle);
  27. $ipData1 = fread($fd, 4);
  28. if(strlen($ipData1) < 4) {
  29. fclose($fd);
  30. return 'System Error';
  31. }
  32. $ip1num = implode('', unpack('L', $ipData1));
  33. if($ip1num < 0) $ip1num += pow(2, 32);
  34. if($ip1num > $ipNum) {
  35. $EndNum = $Middle;
  36. continue;
  37. }
  38. $DataSeek = fread($fd, 3);
  39. if(strlen($DataSeek) < 3) {
  40. fclose($fd);
  41. return 'System Error';
  42. }
  43. $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
  44. fseek($fd, $DataSeek);
  45. $ipData2 = fread($fd, 4);
  46. if(strlen($ipData2) < 4) {
  47. fclose($fd);
  48. return 'System Error';
  49. }
  50. $ip2num = implode('', unpack('L', $ipData2));
  51. if($ip2num < 0) $ip2num += pow(2, 32);
  52. if($ip2num < $ipNum) {
  53. if($Middle == $BeginNum) {
  54. fclose($fd);
  55. return 'Unknown';
  56. }
  57. $BeginNum = $Middle;
  58. }
  59. }
  60. $ipFlag = fread($fd, 1);
  61. if($ipFlag == chr(1)) {
  62. $ipSeek = fread($fd, 3);
  63. if(strlen($ipSeek) < 3) {
  64. fclose($fd);
  65. return 'System Error';
  66. }
  67. $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
  68. fseek($fd, $ipSeek);
  69. $ipFlag = fread($fd, 1);
  70. }
  71. if($ipFlag == chr(2)) {
  72. $AddrSeek = fread($fd, 3);
  73. if(strlen($AddrSeek) < 3) {
  74. fclose($fd);
  75. return 'System Error';
  76. }
  77. $ipFlag = fread($fd, 1);
  78. if($ipFlag == chr(2)) {
  79. $AddrSeek2 = fread($fd, 3);
  80. if(strlen($AddrSeek2) < 3) {
  81. fclose($fd);
  82. return 'System Error';
  83. }
  84. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  85. fseek($fd, $AddrSeek2);
  86. } else {
  87. fseek($fd, -1, SEEK_CUR);
  88. }
  89. while(($char = fread($fd, 1)) != chr(0))
  90. $ipAddr2 .= $char;
  91. $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
  92. fseek($fd, $AddrSeek);
  93. while(($char = fread($fd, 1)) != chr(0))
  94. $ipAddr1 .= $char;
  95. } else {
  96. fseek($fd, -1, SEEK_CUR);
  97. while(($char = fread($fd, 1)) != chr(0))
  98. $ipAddr1 .= $char;
  99. $ipFlag = fread($fd, 1);
  100. if($ipFlag == chr(2)) {
  101. $AddrSeek2 = fread($fd, 3);
  102. if(strlen($AddrSeek2) < 3) {
  103. fclose($fd);
  104. return 'System Error';
  105. }
  106. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  107. fseek($fd, $AddrSeek2);
  108. } else {
  109. fseek($fd, -1, SEEK_CUR);
  110. }
  111. while(($char = fread($fd, 1)) != chr(0)){
  112. $ipAddr2 .= $char;
  113. }
  114. }
  115. fclose($fd);
  116. if(preg_match('/http/i', $ipAddr2)) {
  117. $ipAddr2 = '';
  118. }
  119. $ipaddr = "$ipAddr1 $ipAddr2";
  120. $ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);
  121. $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
  122. $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
  123. if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
  124. $ipaddr = 'Unknown';
  125. }
  126. return $ipaddr;
  127. }

 

只要调用此方法,传入一个正确的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

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

全部回复

上滑加载中

设置昵称

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

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

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