openplanning

Lấy thông tin địa lý dựa trên địa chỉ IP sử dụng GeoIP2 Java API

  1. GeoIP2 là gì?
  2. Download GeoIP2
  3. Download GeoLite2
  4. Tạo nhanh 1 Project làm việc với GeoIP2
  5. Ví dụ với GeoIP2
  6. Ví dụ với GeoIP2 Web Service

1. GeoIP2 là gì?

GeoIP2 là một thư viện mã nguồn mở Java. Nó cung cấp miễn phí GeoLite2 một cơ sở dữ liệu định vị ứng với các địa chỉ IP, và các API làm việc với cơ sở dữ liệu này và API để làm việc với dịch vụ web (Web service) cung cấp dữ liệu định vị.

GeoLite2 là một cơ sở dữ liệu định vị miễn phí, dữ liệu của nó được cập nhập thường xuyên vào ngày thứ 3 (Tuesday) đầu tiên hàng tháng.

GeoIP2 hỗ trợ cho nhiều ngôn ngữ lập trình khác nhau như: C#, C, Java, Perl, PHP, Python,...

Bạn có 2 cách để làm việc với GeoIP2 API:
  • Download GeoLite2 có các dữ liệu định vị và sử dụng nó như một cơ sở dữ liệu địa phương. GeoIP2 API sẽ lấy thông tin địa lý theo địa chỉ IP dựa trên nguồn dữ liệu này.
  • Sử dụng GeoIP2 API kết nối tới dịch vụ web cung cấp thông thông tin vị trí thông qua địa chỉ IP, cách này bạn cần có một License_Key (Bạn phải mua).

2. Download GeoIP2

Nếu bạn sử dụng Maven:
<!-- http://mvnrepository.com/artifact/com.maxmind.geoip2/geoip2 -->

<dependency>
    <groupId>com.maxmind.geoip2</groupId>
    <artifactId>geoip2</artifactId>
    <version>2.15.0</version>
</dependency>
Hoặc download thư viện này.

3. Download GeoLite2

Để download cơ sở dữ liệu GeoLite2 bạn cần phải đăng ký một tài khoản, việc này hoàn toàn miễn phí.
Sau đó đăng nhập với tài khoản của bạn:
Kết quả download được:
Giải nén 2 file:

4. Tạo nhanh 1 Project làm việc với GeoIP2

Tạo mới một Maven Project.
  • File/New/Other...
Nhập vào:
  • Group Id: org.o7planning
  • Artifact Id: geoip2tutorial
  • Package: org.o7planning.geoip2tutorial
Khai báo maven:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
          http://maven.apache.org/xsd/maven-4.0.0.xsd">
          
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.o7planning</groupId>
  <artifactId>geoip2tutorial</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>geoip2tutorial</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <!-- http://mvnrepository.com/artifact/com.maxmind.geoip2/geoip2 -->
    <dependency>
        <groupId>com.maxmind.geoip2</groupId>
        <artifactId>geoip2</artifactId>
        <version>2.15.0</version>
    </dependency>


  </dependencies>

</project>

5. Ví dụ với GeoIP2

Bạn đã download cơ sở dữ liệu GeoLite2 và đặt nó ở một thư mục địa phương. Ví dụ này sử dụng GeoIP2 Java API lấy ra thông tin địa lý ứng với một địa chỉ IP cụ thể.
MyConstants.java
package org.o7planning.geoip2tutorial;

public class MyConstants {

   // Country Data.
   public static final String DATABASE_COUNTRY_PATH = "F:/GeoLite2/GeoLite2-Country.mmdb";
  
   // City Data.
   public static final String DATABASE_CITY_PATH = "F:/GeoLite2/GeoLite2-City.mmdb";
  
  
  
   public static final int MY_USER_ID = 42;
  
   public static final String MY_LICENSE_KEY = "license_key";
  
}
HelloGeoIP2.java
package org.o7planning.geoip2tutorial;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;

import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.exception.GeoIp2Exception;
import com.maxmind.geoip2.model.CityResponse;
import com.maxmind.geoip2.record.City;
import com.maxmind.geoip2.record.Country;
import com.maxmind.geoip2.record.Location;
import com.maxmind.geoip2.record.Postal;
import com.maxmind.geoip2.record.Subdivision;

public class HelloGeoIP2 {

    public static void main(String[] args) throws IOException, GeoIp2Exception {
        
    
        // Một đối tượng File trỏ tới GeoLite2 Database của bạn.
        File dbFile = new File(MyConstants.DATABASE_CITY_PATH);
        
        // Tạo ra một đối tượng đọc Database.
        // nó có thể tái sử dụng trong các lần tra cứu.
        DatabaseReader reader = new DatabaseReader.Builder(dbFile).build();

  
        // Một địa chỉ IP
        InetAddress ipAddress = InetAddress.getByName("128.101.101.101");
        
  
        // Thông tin định vị thành phố ứng với địa chỉ IP.
        CityResponse response = reader.city(ipAddress);

  
        // Thông tin quốc gia
        Country country = response.getCountry();
        System.out.println("Country IsoCode: "+ country.getIsoCode()); // 'US'
        System.out.println("Country Name: "+ country.getName()); // 'United States'
        System.out.println(country.getNames().get("zh-CN")); // '美国'

        Subdivision subdivision = response.getMostSpecificSubdivision();
        System.out.println("Subdivision Name: " +subdivision.getName()); // 'Minnesota'
        System.out.println("Subdivision IsoCode: "+subdivision.getIsoCode()); // 'MN'
  
        // Thông tin Thành phố
        City city = response.getCity();
        System.out.println("City Name: "+ city.getName()); // 'Minneapolis'

        // Thông tin bưu chính (Postal).
        Postal postal = response.getPostal();
        System.out.println(postal.getCode()); // '55455'

        // Vị trí địa lý.        
        Location location = response.getLocation();      
  
        // Vĩ độ
        System.out.println("Latitude: "+ location.getLatitude()); // 44.9733      
  
        // Kinh độ
        System.out.println("Longitude: "+ location.getLongitude()); // -93.2323

    }

}
Chạy ví dụ:

6. Ví dụ với GeoIP2 Web Service

Thay vì kết nối vào một cơ sở dữ liệu địa phương để lấy ra thông tin địa lý ứng với địa chỉ IP, bạn có thể sử dụng một dịch vụ web (Web service) cung cấp dữ liệu này. Bạn cần phải mua một LICENSE_KEY. Ví dụ dưới đây hướng dẫn bạn lấy được thông tin địa lý ứng với địa chỉ IP thông qua web service.
HelloGeoIP2Service.java
package org.o7planning.geoip2tutorial;

import java.io.IOException;
import java.net.InetAddress;

import com.maxmind.geoip2.WebServiceClient;
import com.maxmind.geoip2.exception.GeoIp2Exception;
import com.maxmind.geoip2.model.CountryResponse;
import com.maxmind.geoip2.record.Country;

public class HelloGeoIP2Service {

  

   public static void main(String[] args) throws IOException, GeoIp2Exception {

       WebServiceClient.Builder builder
             = new WebServiceClient.Builder(MyConstants.MY_USER_ID, MyConstants.MY_LICENSE_KEY);

       WebServiceClient client = builder.build();

       // Địa chỉ IP.
       InetAddress ipAddress = InetAddress.getByName("128.101.101.101");


       // Tra cứu thông tin.
       CountryResponse response = client.country(ipAddress);

       // Thông tin về quốc gia.
       Country country = response.getCountry();
       System.out.println("Country Iso Code: "+ country.getIsoCode()); // 'US'
       System.out.println("Country Name: "+ country.getName()); // 'United States'
       System.out.println(country.getNames().get("zh-CN")); // '美国'
   }
  
}