Hướng dẫn dùng geolite2-country.mmdb trong PHP

  1. Xin chào tất cả anh em!
    Vẫn là lời chúc sức khỏe và thành công trong cuộc sống đến anh em nhé.

    Hôm trước mình xem topic này http://cafemmo.club/threads/hoi-cach-nhan-biet-region-user.2274/#post-25261, có bạn @VanLong hỏi về : Hỏi cách nhận biết Region user.

    Mình xin được phép chia sẻ và hướng dẫn như sau:

    Maxmind cung cấp sẵn cho chúng ta thư viện để xác định quốc gia và thành phố.
    Bạn có thể xem tại đây:
    https://github.com/maxmind : có đầy đủ cho các ngôn ngữ mà bạn thích dùng.

    Hướng dẫn dùng geolite2-country.mmdb trong PHP

    Mình thì dùng PHP, và xin trình bày chi tiết như sau:

    1. Tải thư viện của nó về:
    github. com/maxmind/GeoIP2-php

    Hướng dẫn dùng geolite2-country.mmdb trong PHP

    Để tiện cho anh em, mình Composer về sẵn cho anh em download luôn.
    drive. google. com/open?id=180ysHkYHQvm__3d0dXSEBcpGwJt5R-yW

    Anh em download về và giải nén ra sẽ có thư mục vendor.

    2. Tải databases của nó về đã nhé:

    dev. maxmind .com/geoip/geoip2/geolite2/
    Anh em tải cái link mình bôi chuột đen đó. Và giải nén ra.

    Hướng dẫn dùng geolite2-country.mmdb trong PHP

    File sau khi tải về sẽ tên là GeoLite2-City_20190820.tar.gz (chú ý là mình tải về ngày hôm nay 27/08/2019).
    Nhưng data là ngày 2019-08-20 : đó là vì maxmind cập nhật mỗi tuần 1 lần. Nếu bạn cần data mới nhất thì hãy download hàng tuần nhé. (mình thì vài tháng mới cập nhật databases vì bận, và không cần phải chính xác 100%)
    Anh em giải nén ra nhé, chú ý cái quan trọng nhất là file GeoLite2-City.mmdb

    3. Test thử xem nào( bạn có thể chạy trên localhost, hoặc VPS)

    Chú ý phần chạy trên localhost thì với ip cần xác định là 127.0.0.1, hoặc ::1 thì sẽ báo lỗi nhé.


    Private address rangen sẽ không cho kết quả được.

    City Example

    require_once 'vendor/autoload.php';
    use GeoIp2\Database\Reader;
    // This creates the Reader object, which should be reused across
    // lookups.
    $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-City.mmdb');
    // Replace "city" with the appropriate method for your database, e.g.,
    // "country".
    $record = $reader->city('128.101.101.101');
    print($record->country->isoCode . "\n"); // 'US'
    print($record->country->name . "\n"); // 'United States'
    print($record->country->names['zh-CN'] . "\n"); // '美国'
    print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
    print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
    print($record->city->name . "\n"); // 'Minneapolis'
    print($record->postal->code . "\n"); // '55455'
    print($record->location->latitude . "\n"); // 44.9733
    print($record->location->longitude . "\n"); // -93.2323
    ?>
    Chú ý:
    vendor là thư mục bạn tải từ drive. google. com/open?id=180ysHkYHQvm__3d0dXSEBcpGwJt5R-yW

    /usr/local/share/GeoIP/GeoIP2-City.mmdb : là đường đẫn file databases anh em tải về từ geolite. maxmind. com/download/geoip/database/GeoLite2-City.tar.gz
    Chú ý đường dẫn nhé.

    Nhận xét:

    databases là miễn phí, và theo thông tin từ maxmind. com thì nó chỉ chuẩn xác khoảng 95%, bạn muốn chính xác 100% thì hãy mua nó nhé .

    Mình thì không cần chính xác tuyệt đối, 95% là quá tốt với mình rồi.

    Rất mong anh em góp ý và thảo luận. Cảm ơn anh em đã đọc và theo dõi

    P/s: Có thể nhiều anh em thắc mắc, nếu user dùng proxy hoăc cái gì đó để ẩn IP gốc thì làm thế nào. Phương án là chặn proxy thôi. Tuy nhiên việc chặn proxy thì không thể miễn phí, và phải mua. Và tỉ lệ chặn proxy cũng không thể chính xác tuyệt đối 100%. Phương án chặn proxy sẽ không bàn tại đây. Anh em yêu cầu sẽ có topic riêng về việc xác định và chặn proxy.

    More Threads in same category

    Last edited: Aug 27, 2019

  2. Db của geoip thì quá chuẩn rồi.

Hướng dẫn dùng geolite2-country.mmdb trong PHP

  • Forums

    Forums

  • Members

    Members

  • Menu

Hướng dẫn dùng geolite2-country.mmdb trong PHP
Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người.
Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.

Hướng dẫn dùng geolite2-country.mmdb trong PHP
Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới.
Hướng dẫn dùng geolite2-country.mmdb trong PHP
Facebook

Hướng dẫn dùng geolite2-country.mmdb trong PHP

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:

  1. 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.
  2. 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

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Nếu bạn sử dụng Maven:





    com.maxmind.geoip2
    geoip2
    2.15.0

Hoặc download thư viện này.

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Hướng dẫn dùng geolite2-country.mmdb trong PHP

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í.

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Sau đó đăng nhập với tài khoản của bạn:

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Kết quả download được:

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Giải nén 2 file:

Hướng dẫn dùng geolite2-country.mmdb trong PHP

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

Tạo mới một Maven Project.

  • File/New/Other...

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Nhập vào:

  • Group Id: org.o7planning
  • Artifact Id: geoip2tutorial
  • Package: org.o7planning.geoip2tutorial

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Hướng dẫn dùng geolite2-country.mmdb trong PHP

Khai báo maven:

pom.xml



          
  4.0.0

  org.o7planning
  geoip2tutorial
  0.0.1-SNAPSHOT
  jar

  geoip2tutorial
  http://maven.apache.org

  
    UTF-8
  

  


    
      junit
      junit
      3.8.1
      test
    
    
    
    
        com.maxmind.geoip2
        geoip2
        2.15.0
    


  


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ể.

Hướng dẫn dùng geolite2-country.mmdb trong PHP

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ụ:

Hướng dẫn dùng geolite2-country.mmdb trong PHP

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")); // '美国'
   }
  
}