ホームページ  >  記事  >  バックエンド開発  >  php IP Get City API (Innocent IP データベース)

php IP Get City API (Innocent IP データベース)

WBOY
WBOYオリジナル
2016-07-25 08:55:581773ブラウズ
  1. /**
  2. * IP アドレスに基づいて都市名を取得する Innocence IP データベース
  3. * 編集: bbs.it-home.org
  4. */
  5. function Convertip($ip) {
  6. //IP データ ファイル パス
  7. $dat_path = 'QQWry.Dat';
  8. //IP アドレスを確認する
  9. if(!filter_var($ip, FILTER_VALIDATE_IP)) {
  10. return 'IP アドレス エラー';
  11. }
  12. //IP データ ファイルを開く
  13. if(!$fd = @fopen($dat_path, 'rb')){
  14. return 'IP 日付ファイルが存在しないか、アクセスが拒否されました';
  15. }
  16. //操作用の IP を分解し、整数を取得します
  17. $ipNum = ip2long($ip);
  18. //データの開始位置と終了位置を取得しますIP データインデックス
  19. $DataBegin = fread($fd, 4);
  20. $DataEnd = fread($fd, 4);
  21. $ipbegin = implode('', unpack('L', $DataBegin));
  22. if( $ipbegin < 0) $ipbegin += pow(2, 32);
  23. $ipend = implode('', unpack('L', $DataEnd));
  24. if($ipend <0) $ipend += pow(2, 32); $ipAllNum = ($ipend - $ipbegin) / 7 + 1; $BeginNum = $ipAllNum; // インデックス レコードから一致する IP レコードを検索します。 ($ip1num>$ ipNum || $ip2num<$ipNum) {
  25. $Middle= intval(($EndNum + $BeginNum) / 2);
  26. //ポインタをインデックス位置にオフセットし、4バイトを読み取ります
  27. fseek( $fd, $ ipbegin + 7 * $Middle);
  28. $ipData1 = fread($fd, 4);
  29. if(strlen($ipData1) < 4) {
  30. fclose($fd);
  31. return 'システム エラー' ;
  32. }
  33. //抽出したデータを長整数に変換し、データが負の場合は2の32乗を加算します
  34. $ip1num = implode('', unpack('L', $ipData1));
  35. if($ip1num < 0 ) $ip1num += pow(2, 32); //抽出された長整数が IP アドレスより大きい場合、次のサイクルの終了位置を変更します if($ip1num > $ipNum ) {
  36. $EndNum = $Middle;
  37. continue;
  38. }
  39. //前のインデックスを取得した後、次のインデックスを取得します
  40. $DataSeek = fread($fd, 3);
  41. if(strlen($DataSeek) fclose($fd);
  42. return 'システム エラー';
  43. }
  44. $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
  45. fseek($fd, $ DataSeek);
  46. $ipData2 = fread( $fd, 4);
  47. if(strlen($ipData2) fclose($fd);
  48. return 'システム エラー';
  49. }
  50. $ip2num = implode( '', unpack('L', $ipData2));
  51. if($ip2num < 0) $ip2num += pow(2, 32);
  52. //不明なプロンプトが見つかりません
  53. if($ip2num < $ ipNum) {
  54. if($Middle = = $BeginNum) {
  55. fclose($fd);
  56. return 'Unknown';
  57. }
  58. $BeginNum = $Middle;
  59. }
  60. }
  61. //次のコードはわかりにくいです理解できません、興味があります。読むのが遅いです
  62. $ipFlag = fread($fd, 1);
  63. if($ipFlag == chr(1)) {
  64. $ipSeek = fread($fd, 3);
  65. if(strlen($ipSeek) < 3 ) {
  66. fclose($fd);
  67. return 'システム エラー';
  68. }
  69. $ipSeek = implode('', unpack('L', $ipSeek. chr(0)));
  70. fseek($fd, $ ipSeek);
  71. $ipFlag = fread($fd, 1);
  72. }
  73. if($ipFlag == chr(2)) {
  74. $AddrSeek = fread ($fd, 3);
  75. if(strlen($AddrSeek ) < 3) {
  76. fclose($fd);
  77. return 'システム エラー';
  78. }
  79. $ipFlag = fread($fd, 1);
  80. if ($ipFlag == chr(2)) {
  81. $AddrSeek2 = fread($fd, 3);
  82. if(strlen($AddrSeek2) < 3) {
  83. fclose($fd);
  84. return 'システム エラー';
  85. }
  86. $AddrSeek2 = implode('', unpack(' L', $AddrSeek2.chr(0)));
  87. fseek($fd, $AddrSeek2);
  88. } else {
  89. fseek($fd, -1, SEEK_CUR);
  90. }
  91. while(($char = fread ($fd, 1)) != chr(0))
  92. $ipAddr2 .= $char;
  93. $AddrSeek = implode('', unpack('L ', $AddrSeek.chr(0)));
  94. fseek ($fd, $AddrSeek);
  95. while(($char = fread($fd, 1)) != chr(0))
  96. $ipAddr1 .= $char;
  97. } else {
  98. fseek($fd, - 1, SEEK_CUR);
  99. while(($char = fread($fd, 1)) != chr(0))
  100. $ipAddr1 .= $char;
  101. $ipFlag = fread($fd, 1);
  102. if ($ipFlag == chr(2)) {
  103. $AddrSeek2 = fread($fd, 3);
  104. if(strlen($AddrSeek2) < 3) {
  105. fclose($fd);
  106. return 'システム エラー';
  107. }
  108. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  109. fseek($fd, $AddrSeek2) ;
  110. } else {
  111. fseek($fd, -1, SEEK_CUR);
  112. }
  113. while(($char = fread($fd, 1)) != chr(0)){
  114. $ipAddr2 .= $char;
  115. }
  116. }
  117. fclose($fd);
  118. //最後に相対的な代替操作を行った後に結果を返します
  119. if(preg_match('/http/i', $ipAddr2)) {
  120. $ipAddr2 = '';
  121. }
  122. $ipaddr = "$ipAddr1 $ipAddr2";
  123. $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
  124. $ipaddr = preg_replace('/^s*/is', '', $ipaddr) ;
  125. $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
  126. if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
  127. $ ipaddr = '不明';
  128. }
  129. return $ipaddr;
  130. }
  131. header("Content-type: text/html; charset=utf-8");
  132. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  133. if (isset($_GET['q'])){
  134. $ip = $_GET['q'];
  135. if(filter_var("http://".$ip,FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED)){
  136. $ip = gethostbyname($ip);
  137. }
  138. }
  139. echo "$ip,".mb_convert_encoding(convertip($ip),"utf-8","gb2312");
  140. ?>
复制發


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。