- Published on
C# - GeoIP Search IP Location
有一個需求是要分析來源 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 的角度來說的話,已經算很不錯了。如果有比較高的需求的話,可以考慮是否使用付費的版本,或者是其它相關的付費服務
