獲得ip地理資訊的幾種方法【最全】
第一種是利用純真ip資料庫,這個可以在網上找到很多,缺點是更新有點慢。
第二種是利用入口網站的介面
目前已知的有騰訊、新浪、網易、搜狐和Google提供IP地址查詢API,但是找得到的只有騰訊、新浪和網易的,Google的貌似要用Google Maps所以沒有研究。看了下國內的幾個騰訊提供的是JavaScript的,網易提供的是XML,而新浪的有多種格式可以用,注意非XML的資料來源都是GBK格式的,不管是JavaScript呼叫還是PHP呼叫都要轉換一下編碼,不然得到的是亂碼。而更需要注意的是,如果一次性查詢多個IP,使用入口網站的API來查詢會非常緩慢,我大概寫了個for迴圈試了下,不管是用PHP解析XML還是file_get_contents()函式獲取內容,查詢10次以上會變得非常緩慢,甚至可能超時。
騰訊的IP地址API介面地址:http://fw.qq.com/ipaddress,返回的是資料格式為:var IPData = new Array(“123.124.2.85″,””,”北京市”,””);,一個JavaScript的物件,目前還不知道如何輸入IP查詢。
新浪的IP地址查詢介面:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
新浪多地域測試方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=123.124.2.85
網易有道的IP地址查詢介面:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=123.124.2.85
使用JS程式碼進行調取騰訊的api介面:
檢視原始碼列印幫
<script language=”javascript” type=”text/javascript” src=”http://fw.qq.com/ipaddress”></script>
<script>document.write(“你的IP是:”+IPData[0]+”,來自:”+IPData[2]);</script>
//騰訊API的PHP呼叫方法
function getIpPlace(){
$ip=file_get_contents(“http://fw.qq.com/ipaddress”);
$ip=str_replace(`”`,` `,$ip);
$ip2=explode(“(“,$ip);
$a=substr($ip2[1],0,-2);
$b=explode(“,”,$a);
return $b;
}
$ip=getIpPlace();
print_r($ip);
//呼叫查詢介面需要抓取網頁,有三種方法,第一種是curl,第二種是
//file_get_contents,第三種fopen->fread->fclose,推薦第二種方法
/*
*根據騰訊IP分享計劃的地址獲取IP所在地,比較精確
*/
function getIPLoc($queryIP){
$url = `http://ip.qq.com/cgi-bin/searchip?searchip1=`.$queryIP;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_ENCODING ,`gb2312`);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 獲取資料返回
$result = curl_exec($ch);
$result = mb_convert_encoding($result, “utf-8”, “gb2312”); // 編碼轉換,否則亂碼
curl_close($ch);
preg_match(“@<span>(.*)</span></p>@iU”,$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
//根據騰訊介面查詢ip地址,使用file_get_contents抓去網頁
function getIPLoc($queryIP){
$url = `http://ip.qq.com/cgi-bin/searchip?searchip1=`.$queryIP;
$result = file_get_contents($url);
$result = mb_convert_encoding($result, “utf-8”, “gb2312”); // 編碼轉換,否則亂碼
preg_match(“@<span>(.*)</span></p>@iU”,$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
//根據騰訊介面查詢ip地址,使用fopen->fread->fclose抓去網頁
function getIPLoc($queryIP){
$url = `http://ip.qq.com/cgi-bin/searchip?searchip1=`.$queryIP;
$handle = fopen (“$url”, “rb”);
$result = “”;
do {
$data = fread($handle, 1024);
if (strlen($data) == 0) {
break;
}
$result .= $data;
} while(true);
$result = mb_convert_encoding($result, “utf-8”, “gb2312”); // 編碼轉換,否則亂碼
preg_match(“@<span>(.*)</span></p>@iU”,$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
/********注:
1.使用file_get_contents和fopen必須空間開啟allow_url_fopen。方法:編輯php.ini,設定allow_url_fopen = On,allow_url_fopen關閉時fopen和file_get_contents都不能開啟遠端檔案。
2.使用curl必須空間開啟curl。方法:windows下修改php.ini,將extension=php_curl.dll前面的分號去掉,而 且需要拷貝ssleay32.dll和libeay32.dll到C:WINDOWSsystem32下;Linux下要安裝curl擴充套件*****/
//新浪查詢ip介面 第五個第六個是地理資訊
function getiploc($IP_ip){
$IP_str = @file_get_contents(`http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=`.$IP_ip);
if(!empty($IP_str)){
$IP_tmp = explode(” “, $IP_str);
$IP_city = iconv(“GBK”, “UTF-8”, $IP_tmp[5]);
return $IP_city;
}
//有道API的PHP呼叫方法
$url = “http:www.youdao.com/smartresult-xml/search.s?type=ip&q=”.$ip;
$doc = new DOMDocument();
$doc->load($url);
$smartresult = $doc->getElementsByTagName(“product”);
foreach($smartresult as $product)
{
$locations = $product->getElementsByTagName(“location”);
$location = $locations->item(0)->nodeValue;
}
if($location != “”)
{
echo $i.”.”.$ip;
echo ” 來自”.$location.”的網友”;
}
else
{
echo $i.”.”.$ip;
echo ” 來自火星的網友”;
}
public function sinaIPApi($ip){
$str = file_get_contents(“http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=”.$ip);
$str = iconv(“gbk”, “utf-8//IGNORE”, $str);
preg_match_all(“/[x{4e00}-x{9fa5}]+/u”,$str,$get);
$add = implode(“,$get[0]);
return $add;
}
//$get是一個非常棒的二維陣列
其中有道和新浪的是我自己寫的,新浪API也可以像騰訊API那樣用file_get_contents()函式獲取完地址後使用一連串的字串函式處理,我寫的函式使用正規表示式從新浪的返回結果中提供包含中文的字串,並且分段存入一個二維陣列,這個可能只是針對新浪的API有用並且存在bug。舉個例子查詢學校分配給我的IP地址後var_dump()一下函式裡面的$get變數得到以下結果: array(1) { [0]=> array(6) { [0]=> string(6) “中國” [1]=> string(6) “北京”
[2]=> string(6) “北京” [3]=> string(9) “教育網” [4]=> string(6) “學校” [5]=> string(18) “中國地質大學” } },而函式輸出的結果則是“中國北京北京教育網學校中國地質大學”,希望我的思路和方法能對別人有用。
最後再次提醒,如果是WordPress請使用第一種方法,否則使用API同時查詢所有留言者的真實地址會讓PHP超時的,希望各路大牛有更好的方法,至於限制顯示和顯示方式等神馬的都是WordPress應用問題,同時對於Java和C#來說思路也是一樣的,這些後續的問題等我考完試再細說。
相關文章
- 關於java獲取本地ip的幾種方法Java
- qt獲得本地IP的方法QT
- Python獲取IP地址對應的地理位置資訊!Python
- Android ViewTreeObserver使用總結及獲得View高度的幾種方法AndroidViewServer
- Java/JSP獲得客戶端網路卡MAC地址的三種方法解析(附:獲得真實IP)JavaJS客戶端Mac
- 獲得同級iframe頁面的指定ID元素的幾種實現方法
- Java中使用Optional檢測並獲得非空值的幾種方法Java
- Android 獲得View寬高的幾種方式AndroidView
- mysql儲存地理資訊的方法MySql
- 史上最全的iOS各種裝置資訊獲取總結iOS
- 分享幾種清理“其他儲存”並在Mac上獲得更多可用空間的方法Mac
- 獲得客戶端ip的方法,排除代理伺服器客戶端伺服器
- java獲取當前路徑的幾種方法Java
- 獲取爬蟲動態IP的三種方法爬蟲
- 【LanceZhang】ASP.NET獲取IP的6種方法ASP.NET
- Java獲取堆疊資訊的3種方法Java
- [Oracle] 統計listener.log中IP的幾種方法Oracle
- android獲取控制元件的幾種方法Android控制元件
- Oracle 獲取執行計劃的幾種方法Oracle
- VB6 獲取CPUID的幾種方法UI
- 如何獲取外網IP和IP的資訊
- java 獲得系統資訊Java
- Linux禁止某個IP地址訪問的幾種方法Linux
- [Linux] RHEL7.0 配置網路IP的幾種方法Linux
- html5獲取地理位置資訊APIHTMLAPI
- springmvc請求引數獲取的幾種方法SpringMVC
- C#中獲取當前路徑的幾種方法C#
- 三種地理參考資訊模型:WMS,WFS,WCS模型
- 使用代理IP輕鬆獲得韓國IP地址
- 一個好用的免費IP離線地理資訊資料庫資料庫
- reactnative獲取裝置真實ip地址和ip對映的地理位置React
- js根據ip地址獲取城市地理位置JS
- Centos7系統拒絕國外IP海外IP訪問的幾種方法CentOS
- 深入分析幾種PHP獲取客戶端IP的情況轉PHP客戶端
- js獲取地理位置資訊簡單介紹JS
- VC中文FAQ寶庫之7:獲得各種目錄資訊(轉)
- 華納雲分享隱藏伺服器真實IP的幾種方法伺服器
- Qt下如何獲得本地網路卡IPQT