程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> php IP獲取城市API代碼

php IP獲取城市API代碼

編輯:PHP基礎知識
 

使用PHP,根據訪客的IP地址獲取城市位置。方法有很多中,目前最簡單的是通過騰訊的API接口:http://fw.qq.com/ipaddress ;可以獲得形如 var IPData = new Array(“ip地址”,””,”所在省”,”所在市”);的數據,從而可以通過javascript在客戶端調用,應用於各種場合。不過這個API只能支持javascript,例如網上的什麼通過PHP的方法從騰訊API獲取城市的做法,經本人驗證,是無效的,原因很簡單,騰訊的API不支持代理訪問。

求人不如求己,我自己做了個IP獲取城市API數據接口。代碼同樣是使用PHP來實現,透過純真IP數據庫的支持,可以精確地定位城市位置。支持多種查詢方式形如:本機IP、自定義IP、自定義域名三種方式。

 

http://domain/ip 直接查詢本機IP所在城市位置

http://domain/ip/?q=xxx.xxx.xxx.xxx 獲取自定義IP的城市位置

http://domain/ip/?q=baidu.com 獲取域名所在的城市位置

代碼公布如下

<?php
function convertip($ip) {
//IP數據文件路徑
$dat_path = 'QQWry.Dat';

//檢查IP地址
if(!filter_var($ip, FILTER_VALIDATE_IP)) {
return 'IP Address Error';
}
//打開IP數據文件
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP date file not exists or access denied';
}

//分解IP進行運算,得出整形數
$ipNum = ip2long($ip);

//獲取IP數據索引開始和結束位置
$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; //使用二分查找法從索引記錄中搜索匹配的IP記錄 while($ip1num>$ipNum || $ip2num<$ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);

//偏移指針到索引位置讀取4個字節
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return 'System Error';
}
//提取出來的數據轉換成長整形,如果數據是負數則加上2的32次冪
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32); //提取的長整型數大於我們IP地址則修改結束位置進行下一次循環 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;
}
header("Content-type: text/html; charset=utf-8");
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
if(isset($_GET['q'])){
$ip = $_GET['q'];
if(filter_var("http://".$ip,FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED)){
$ip = gethostbyname($ip);
}
}
echo "$ip,".mb_convert_encoding(convertip($ip),"utf-8","gb2312");

?>

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved