C# - GeoIP Search IP Location

Posted on 2015-09-29

有一個需求是要分析來源 IP 的位置 (就是要知道 User 的 Location),所以就用 Search Geo IP 相關的服務

一般來說不外乎有呼叫次數的限制 (例如:GoogleMap),超過就要付費。另外一種是用 DB 的方式來查詢,不過大多需要付費 (其實很合理啊 !!)

不過如果只是需要測試或是公司不一定願意買單的話,一般開發人員都會想要找到是否有 FREE 的服務或者是 OpenSouce 的

剛好找到一家公司 MaxMind,它本身有付費的服務 (有分 API 和離線查詢的 DB),不過,佛心的是它有 Free 的 Geo Databases 可以下載 (在這裡這個版本稱為 Lite),雖然準確度沒有付費版本來的高,不過我覺得一般使用上就很夠用了,可以參考相關網頁說明 GeoLite2 Free Downloadable Databases

注意事項:因為它是 CC 授權,所以要使用產品的時候記得加註說明

This product includes GeoLite2 data created by MaxMind, available from http://www.maxmind.com.

下面就來說明一下怎麼使用

1、下載 Geo DB

下載頁面會有 binary 和 CSV 的檔案,為了方便使用,我們這裡只下載 GeoLite2 City binary,下載後為 .gz 的壓縮檔,使用 7zip 解壓縮就可以得到 GeoLite2-City.mmdb 檔案

2、使用 Console Project 來測試

把前面下載的檔案 (GeoLite2-City.mmdb) 放在 Console Project 裡面

這裡要注意,需要修改這個檔案的輸出,這樣子程式在執行的時候才會抓到這個檔案。

GeoLite2-City.mmdb 檔案上面按 F4 ,然後在屬性視窗裡面,把它俢改為 Copy always (如果是中文版的話,請自行對照修改)

3、安裝 NuGet 套件

GeoIP2 Downloadable Databases 頁面裡面有一個 MaxMind APIs 的區塊,裡面有 NuGet 的連結

我們可以使用 Install-Package MaxMind.GeoIP2 來安裝相關的 Package

4、使用 API

GitHub Pages 裡面有寫到,雖然這個 API 是 for 正試版,不過 Lite 版也可以用使用

在同一個頁面裡面有一個 Database Usage 的區塊,可以直接拿裡面 City Database 的範例程式碼來修改使用

下面為修改後的測試程式

static void Main(string[] args)  
{
    var path = Directory.GetCurrentDirectory();
    path = path + @"\db\GeoLite2-City.mmdb";

    using (var reader = new DatabaseReader(path))
    {
        var city = reader.City("24.24.24.24");

        Console.WriteLine("Country.IsoCode .. " + city.Country.IsoCode);
        Console.WriteLine("Country.Name .. " + city.Country.Name);
        Console.WriteLine("---");
        Console.WriteLine("City.Name .. " + city.City.Name);
        Console.WriteLine("Postal.Code .. " + city.Postal.Code);
        Console.WriteLine("---");
        Console.WriteLine("Location.Latitude .. " + city.Location.Latitude); 
        Console.WriteLine("Location.Longitude .. " + city.Location.Longitude); 

        Console.ReadLine();
    }
}    
  • 在這裡我們使用 24.24.24.24 這個 IP 來測試
  • DatabaseReader 裡面傳入的就是我們加入 Lite DB 的路徑

比對產出結果

下圖是程式執行後的結果

在這裡我們使用幾個線上的服務來比對

可以看到不同服務間還是有誤差的,建議可以多試幾個不同的 IP 或是比對不同的服務試試看

我覺得以 FREE 的角度來說的話,已經算很不錯了。如果有比較高的需求的話,可以考慮是否使用付費的版本,或者是其它相關的付費服務