Go言語 : IPアドレス から位置情報を取得してみる

この記事は約6分で読めます。

Go言語を用いて IPアドレス から、位置情報を取得してみます!

 

ConoHa とお名前.comでサブドメインを利用してページ公開する
ConoHaとお名前.comを用いてウェブアプリを公開します。その時に、サブドメインを使うことで、一つのサーバで複数のアプリを公開できます。その方法を今回解説していきます。

 

 

それでは、早速実践!!

Go言語でIPアドレスから位置情報を取得する

事前準備

GeoLite2 Free Downloadable Databases « MaxMind Developer Site

このサイトにて、

GeoLite2 CItyの「MaxMind DB binary,gzipped」をDownloadしておいてください!

IP

使うライブラリ

github.com/oschwald/geoip2-golang

ファイルディレクトリ

.
├── GeoLite2-City.mmdb
└── geoIP.go

先ほど、ダウンロードしたファイルを解凍し、中にある「GeoLite2-City.mmdb」をソースコードと同じディレクトリに配置してください。

 

コード

geoIP.go

package main

import (
	"fmt"
	"log"
	"net"
	"os"
	"path/filepath"

	"github.com/oschwald/geoip2-golang"
)

/*
example
	printRecord("173.255.226.98")
	printRecord("81.2.69.142")
	printRecord("35.184.160.12")
*/
func main() {
	printRecord(os.Args[1])
}

func printRecord(tgt string) {
	if tgt == "" {
		log.Fatalln("Error IP")
	}

	absPath, _ := filepath.Abs("GeoLite2-City.mmdb")
	db, err := geoip2.Open(absPath)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	ip := net.ParseIP(tgt)
	record, err := db.City(ip)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("[*] Target: %v Geo-located.\n", tgt)
	fmt.Printf("[+] %v, %v, %v\n", record.City.Names["ja"], record.Subdivisions[0].Names["ja"], record.Country.Names["ja"])
	fmt.Printf("[+] ISO country code: %v\n", record.Country.IsoCode)
	fmt.Printf("[+] Time zone: %v\n", record.Location.TimeZone)
	fmt.Printf("[+] Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
}

コード詳細

func main() { printRecord(os.Args[1]) }

mainでは、printRecord関数を呼び出しています。

引数には、os.Args[1]を入れています。

後に「go run geoIP.go <IPアドレス>」

とすると、この<IPアドレス>を取得します。

 

 

次に、printRecord関数をみていきます。

if tgt == "" {
		log.Fatalln("Error IP")
	}

	absPath, _ := filepath.Abs("GeoLite2-City.mmdb")
	db, err := geoip2.Open(absPath)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

まず、GeoLite2-City.mmdbをgithub.com/oschwald/geoip2-golangに読み込ませます。そして、データベースを構築します。

 

ip := net.ParseIP(tgt)
	record, err := db.City(ip)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("[*] Target: %v Geo-located.\n", tgt)
	fmt.Printf("[+] %v, %v, %v\n", record.City.Names["ja"], record.Subdivisions[0].Names["ja"], record.Country.Names["ja"])
	fmt.Printf("[+] ISO country code: %v\n", record.Country.IsoCode)
	fmt.Printf("[+] Time zone: %v\n", record.Location.TimeZone)
	fmt.Printf("[+] Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)

 

net.ParseIP()で、tgt(printRecord関数の引数)から、golangで使うnet.IP型に変換します。

次にそのIPアドレスを先ほど、生成したデータベースにIPアドレスを入れると、Cityの情報が出力されます。

この情報をPrintしています。

市や、緯度経度も出すことができます。

こんな感じのデータを取ることができます。

実行結果

$ go run geoIP.go 126.126.180.222
[*] Target: 126.126.180.222 Geo-located.
[+] 中央, 東京都, 日本
[+] ISO country code: JP
[+] Time zone: Asia/Tokyo
[+] Coordinates: 35.5778, 139.7168

 

こんな感じで、市内から、簡単に緯度経度まで取得できます!

 

まとめ

今回は、Go言語を使って、IPアドレスから位置を取得するコードを実装しました!

IPアドレスの知識もつくと思うので、ぜひ試してみてください!

それでは。

 

合わせて読みたい

[Brainfuck]難解言語?Go言語で独自言語を作ってみる

 

 

タイトルとURLをコピーしました