php IP取得城市API(純真IP資料庫)

WBOY
發布: 2016-07-25 08:55:58
原創
1772 人瀏覽過
  1. /**
  2. * 依IP位址取得城市名稱 純真IP資料庫
  3. * edit: 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 Address Error';
  11. }
  12. return 'IP Address Error';
  13. }
  14. }
  15. //開啟IP資料檔
  16. if(!$fd = @fopen($dat_path, 'rb')){
  17. return 'IP date file not exists or access denied';
  18. }
  19. //分解IP進行運算,得出整形數
  20. $ipNum = ip2long($ip);
  21. //取得IP資料索引開始與結束位置
  22. $DataBegin = fread($fd, 4);
  23. $DataEnd = fread($fd, 4);
  24. $ipbegin = implode('', unpack('L', $DataBegin));
  25. if($ ipbegin $ipend = implode('', unpack('L', $DataEnd));
  26. if($ipend $ipNum || $ip2num $Middle= intval(($EndNum + $BeginNum) / 2);
  27. //偏移指標到索引位置讀取4個位元組
  28. fseek($fd, $ipbegin + 7 * $Middle);
  29. $ipData1 = fread($fd, 4);
  30. if(strlen($ipData1) fclose($fd);
  31. return 'System Error';
  32. }
  33. //提取出來的資料轉換成長整形,如果資料是負數則加上2的32次方
  34. $ ip1num = implode('', unpack('L', $ipData1));
  35. if($ip1num $ipNum) {
  36. $EndNum = $Middle;
  37. continue;
  38. }
  39. //取完上一個索引後取下一個索引
  40. $DataSeek = fread($fd, 3);
  41. if(strlen($DataSeek) fclose($fd);
  42. return 'System Error';
  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 'System Error';
  49. }
  50. $ip2num = implode ('', unpack('L', $ipData2));
  51. if($ip2num
  52. //找不到提示未知
  53. if($ip2num if($Middle == $BeginNum) {
  54. fclose($fd);
  55. return 'Unknown';
  56. }
  57. $BeginNum = $Middle;
  58. }
  59. }
  60. //下面的程式碼讀暈了,沒讀明白,有興趣的慢慢讀
  61. $ipFlag = fread($fd, 1);
  62. if($ipFlag == chr(1)) {
  63. $ipSeek = fread($fd, 3);
  64. if(strlen($ipSeek) fclose($fd );
  65. return 'System Error';
  66. }
  67. $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
  68. fseek($fd, $ipSeek.chr(0)));
  69. fseek($fd, $ipSeek);
  70. $ipFlag = fread($fd, 1);
  71. }
  72. if($ipFlag == chr(2)) {
  73. $AddrSeek = fread($fd , 3);
  74. if(strlen($AddrSeek) 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) fclose($fd);
  81. return 'System Error';
  82. }
  83. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0))); fseek ($fd, $AddrSeek2);
  84. } else {
  85. fseek($fd, -1, SEEK_CUR);
  86. }
  87. while(($char = fread($fd, 1 )) != chr(0))
  88. $ipAddr2 .= $char;
  89. $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
  90. fseek($fd, $AddrSeek);
  91. while(($char = fread($fd, 1)) != chr(0))
  92. $ipAddr1 .= $char;
  93. } else {
  94. fseek($fd, -1, SEEK_CUR);
  95. while(($char = fread($fd, 1)) != chr(0))
  96. $ipAddr1 .= $ char;
  97. $ipFlag = fread($fd, 1);
  98. if($ipFlag == chr(2)) {
  99. $AddrSeek2 = fread($fd, 3);
  100. if(strlen($AddrSeek2) fclose($fd);
  101. return 'System Error';
  102. }
  103. $AddrSeek2 = implode('', unpack('L' , $AddrSeek2.chr(0)));
  104. fseek($fd, $AddrSeek2);
  105. } else {
  106. fseek($fd, -1, SEEK_CUR);
  107. }
  108. } } } } } } } } } } while(($char = fread($fd, 1)) != chr(0)){ $ipAddr2 .= $char; } }
  109. fclose($fd);
  110. //最後做對應的替換操作後回傳結果
  111. if(preg_match('/http/i', $ipAddr2)) {
  112. $ipAddr2 = '';
  113. }
  114. $ipaddr = "$ipAddr1 $ipAddr2";
  115. $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
  116. $ipaddrdr = preg_replace('/^s*/is', '', $ipaddr);
  117. $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
  118. if(preg_match( '/http/i', $ipaddr) || $ipaddr == '') {
  119. $ipaddr = '未知';
  120. }
  121. return $ipaddr;
  122. }
  123. header("內容類型:text/html; charset=utf-8");
  124. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  125. if(isset($_GET['q'])) {
  126. $ip = $_GET['q'];
  127. if(filter_var("http://".$ip,FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED)){
  128. $ip = gethostbyname($ip); 🎜> }
  129. }
  130. echo "$ip,".mb_convert_encoding(convertip($ip),"utf-8","gb2312");
  131. ?>
複製程式碼


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!