JAVA根據IP地址獲取詳細的地域資訊(轉)

ysj5125094發表於2015-07-16

 

文章出自:http://hejianke83.blog.163.com/blog/static/60765162012101694919149/

非常感謝這位大哥,解決了我的問題。

 

        在系統中,網站的頭部一般都有顯示是哪個城市的,使用者進入到網站的首頁後,預設城市應該是使用者本地的城市資訊,例如:北京,網站就要根據你的IP地址的資訊,查詢資料,獲取北京部分的資料,呵呵,當然我可能描述的不是很清楚,但是可以理解成,通過IP地址定位地理資訊就行。很多人現在使用以QQ資料庫為基礎獲取地址資訊,但不完整、而且不規範。網際網路提供很多其他介面可以完成這項功能.

介面如下:

通過淘寶IP地址庫獲取IP位置

1. 請求介面(GET):http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]
2. 響應資訊:(json格式的)國家 、省(自治區或直轄市)、市(縣)、運營商
3. 返回資料格式:
{
    "code": 0,
    "data": {
        "ip": "210.75.225.254",
        "country": "中國",
        "area": "華北",
        "region": "北京市",
        "city": "北京市",
        "county": "",
        "isp": "電信",
        "country_id": "86",
        "area_id": "100000",
        "region_id": "110000",
        "city_id": "110000",
        "county_id": "-1",
        "isp_id": "100017"
    }
}
其中code的值的含義為,0:成功,1:失敗。
新浪的介面 :http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.192.3.42
返回值
var remote_ip_info = {
    "ret": 1,
    "start": "218.192.0.0",
    "end": "218.192.7.255",
    "country": "中國",
    "province": "廣東",
    "city": "廣州",
    "district": "",
    "isp": "教育網",
    "type": "學校",
    "desc": "廣州大學紡織服裝學院"
}
通過jqry 獲取相應的資料
$.getScript('資料介面',function(){
//新浪:remote_ip_info.country
})
根據騰訊IP分享計劃的地址獲取IP所在地

例項:

package com.gocheck.common.utils.ipmanager;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
/**
 *  根據IP地址獲取詳細的地域資訊
 *  @project:personGocheck
 *  @class:AddressUtils.java
 *  @author:heguanhua E-mail:37809893@qq.com
 *  @date:Nov 14, 2012 6:38:25 PM
 */
public class AddressUtils {  
 /**
  * 
  * @param content
  *            請求的引數 格式為:name=xxx&pwd=xxx
  * @param encoding
  *            伺服器端請求編碼。如GBK,UTF-8等
  * @return
  * @throws UnsupportedEncodingException
  */
 public String getAddresses(String content, String encodingString)
   throws UnsupportedEncodingException {
  // 這裡呼叫pconline的介面
  String urlStr = "http://ip.taobao.com/service/getIpInfo.php";
  // 從http://whois.pconline.com.cn取得IP所在的省市區資訊
  String returnStr = this.getResult(urlStr, content, encodingString);
  if (returnStr != null) {
   // 處理返回的省市區資訊
   System.out.println(returnStr);
   String[] temp = returnStr.split(",");
   if(temp.length<3){
    return "0";//無效IP,區域網測試
   }
   String region = (temp[5].split(":"))[1].replaceAll("\"", "");
   region = decodeUnicode(region);// 省份
   /**
    * String country = ""; String area = ""; String region = ""; String
    * city = ""; String county = ""; String isp = ""; for(int i=0;i<temp.length;i++){
    * switch(i){ case 1:country =
    * (temp[i].split(":"))[2].replaceAll("\"", ""); country =
    * decodeUnicode(country);//國家 break; case 3:area =
    * (temp[i].split(":"))[1].replaceAll("\"", ""); area =
    * decodeUnicode(area);//地區 break; case 5:region =
    * (temp[i].split(":"))[1].replaceAll("\"", ""); region =
    * decodeUnicode(region);//省份 break; case 7:city =
    * (temp[i].split(":"))[1].replaceAll("\"", ""); city =
    * decodeUnicode(city);//市區 break; case 9:county =
    * (temp[i].split(":"))[1].replaceAll("\"", ""); county =
    * decodeUnicode(county);//地區 break; case 11:isp =
    * (temp[i].split(":"))[1].replaceAll("\"", ""); isp =
    * decodeUnicode(isp);//ISP公司 break; } }
    */
   // System.out.println(country+"="+area+"="+region+"="+city+"="+county+"="+isp);
   return region;
  }
  return null;
 }
 /**
  * @param urlStr
  *            請求的地址
  * @param content
  *            請求的引數 格式為:name=xxx&pwd=xxx
  * @param encoding
  *            伺服器端請求編碼。如GBK,UTF-8等
  * @return
  */
 private String getResult(String urlStr, String content, String encoding) {
  URL url = null;
  HttpURLConnection connection = null;
  try {
   url = new URL(urlStr);
   connection = (HttpURLConnection) url.openConnection();// 新建連線例項
   connection.setConnectTimeout(2000);// 設定連線超時時間,單位毫秒
   connection.setReadTimeout(2000);// 設定讀取資料超時時間,單位毫秒
   connection.setDoOutput(true);// 是否開啟輸出流 true|false
   connection.setDoInput(true);// 是否開啟輸入流true|false
   connection.setRequestMethod("POST");// 提交方法POST|GET
   connection.setUseCaches(false);// 是否快取true|false
   connection.connect();// 開啟連線埠
   DataOutputStream out = new DataOutputStream(connection
     .getOutputStream());// 開啟輸出流往對端伺服器寫資料
   out.writeBytes(content);// 寫資料,也就是提交你的表單 name=xxx&pwd=xxx
   out.flush();// 重新整理
   out.close();// 關閉輸出流
   BufferedReader reader = new BufferedReader(new InputStreamReader(
     connection.getInputStream(), encoding));// 往對端寫完資料對端伺服器返回資料
   // ,以BufferedReader流來讀取
   StringBuffer buffer = new StringBuffer();
   String line = "";
   while ((line = reader.readLine()) != null) {
    buffer.append(line);
   }
   reader.close();
   return buffer.toString();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (connection != null) {
    connection.disconnect();// 關閉連線
   }
  }
  return null;
 }
 /**
  * unicode 轉換成 中文
  * 
  * @author fanhui 2007-3-15
  * @param theString
  * @return
  */
 public static String decodeUnicode(String theString) {
  char aChar;
  int len = theString.length();
  StringBuffer outBuffer = new StringBuffer(len);
  for (int x = 0; x < len;) {
   aChar = theString.charAt(x++);
   if (aChar == '\\') {
    aChar = theString.charAt(x++);
    if (aChar == 'u') {
     int value = 0;
     for (int i = 0; i < 4; i++) {
      aChar = theString.charAt(x++);
      switch (aChar) {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
       value = (value << 4) + aChar - '0';
       break;
      case 'a':
      case 'b':
      case 'c':
      case 'd':
      case 'e':
      case 'f':
       value = (value << 4) + 10 + aChar - 'a';
       break;
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case 'E':
      case 'F':
       value = (value << 4) + 10 + aChar - 'A';
       break;
      default:
       throw new IllegalArgumentException(
         "Malformed      encoding.");
      }
     }
     outBuffer.append((char) value);
    } else {
     if (aChar == 't') {
      aChar = '\t';
     } else if (aChar == 'r') {
      aChar = '\r';
     } else if (aChar == 'n') {
      aChar = '\n';
     } else if (aChar == 'f') {
      aChar = '\f';
     }
     outBuffer.append(aChar);
    }
   } else {
    outBuffer.append(aChar);
   }
  }
  return outBuffer.toString();
 }
 // 測試
 public static void main(String[] args) {
  AddressUtils addressUtils = new AddressUtils();
  // 測試ip 219.136.134.157 中國=華南=廣東省=廣州市=越秀區=電信
  String ip = "122.49.20.247";
  String address = "";
  try {
   address = addressUtils.getAddresses("ip="+ip, "utf-8");
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println(address);
  // 輸出結果為:廣東省,廣州市,越秀區
 }
} 

 

 

 

 

 

 

 

 

 

 

相關文章