GeoIp2:通过Ip获取地理信息

准备

使用GeoIP2对ip地址进行分析需要准备如下
1.GeoIP2包
地址:https://github.com/oschwald/geoip2-golang
2.maxminddb包
地址:https://github.com/oschwald/maxminddb-golang
3.ip信息数据
地址:https://www.maxmind.com/en/accounts/258630/geoip/downloads
下载GeoLite2City信息就可以了
GeoIp2:通过Ip获取地理信息_第1张图片
上面三个如果下载不方便 已经上传到了网盘:
链接: https://pan.baidu.com/s/1TL_oXlpIKtpK-6rLcnFYEw 提取码: 5qbt

方法

Geoip2说明文档中就有使用说明 十分简单
相当于载入已下载的db信息 直接在db中查询

func Test_geoip2(t *testing.T) {
	//ip信息数据地址
	db, err := geoip2.Open("/home/alpha/golangcode/GeoLite2-City.mmdb")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	// If you are using strings that may be invalid, check that ip is not nil
	ip := net.ParseIP("81.2.69.142") 
	record, err := db.City(ip)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["en"])
	if len(record.Subdivisions) > 0 {
		fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["en"])
	}
	fmt.Printf("Country name: %v\n", record.Country.Names["en"])
	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)
}

输出
Portuguese (BR) city name: Stoke Newington
English subdivision name: England
Country name: United Kingdom
ISO country code: GB
Time zone: Europe/London
Coordinates: 51.5638, -0.0765
更改en为zh-CN可显示中文
使用国内ip
Portuguese (BR) city name: 杭州
English subdivision name: 浙江省
Country name: 中国
ISO country code: CN
Time zone: Asia/Shanghai
Coordinates: 30.294, 120.1619

City的结构如下

type City struct {
	City struct {
		GeoNameID uint              `maxminddb:"geoname_id"`
		Names     map[string]string `maxminddb:"names"`
	} `maxminddb:"city"`
	Continent struct {
		Code      string            `maxminddb:"code"`
		GeoNameID uint              `maxminddb:"geoname_id"`
		Names     map[string]string `maxminddb:"names"`
	} `maxminddb:"continent"`
	Country struct {
		GeoNameID         uint              `maxminddb:"geoname_id"`
		IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
		IsoCode           string            `maxminddb:"iso_code"`
		Names             map[string]string `maxminddb:"names"`
	} `maxminddb:"country"`
	Location struct {
		AccuracyRadius uint16  `maxminddb:"accuracy_radius"`
		Latitude       float64 `maxminddb:"latitude"`
		Longitude      float64 `maxminddb:"longitude"`
		MetroCode      uint    `maxminddb:"metro_code"`
		TimeZone       string  `maxminddb:"time_zone"`
	} `maxminddb:"location"`
	Postal struct {
		Code string `maxminddb:"code"`
	} `maxminddb:"postal"`
	RegisteredCountry struct {
		GeoNameID         uint              `maxminddb:"geoname_id"`
		IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
		IsoCode           string            `maxminddb:"iso_code"`
		Names             map[string]string `maxminddb:"names"`
	} `maxminddb:"registered_country"`
	RepresentedCountry struct {
		GeoNameID         uint              `maxminddb:"geoname_id"`
		IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
		IsoCode           string            `maxminddb:"iso_code"`
		Names             map[string]string `maxminddb:"names"`
		Type              string            `maxminddb:"type"`
	} `maxminddb:"represented_country"`
	Subdivisions []struct {
		GeoNameID uint              `maxminddb:"geoname_id"`
		IsoCode   string            `maxminddb:"iso_code"`
		Names     map[string]string `maxminddb:"names"`
	} `maxminddb:"subdivisions"`
	Traits struct {
		IsAnonymousProxy    bool `maxminddb:"is_anonymous_proxy"`
		IsSatelliteProvider bool `maxminddb:"is_satellite_provider"`
	} `maxminddb:"traits"`
}

你可能感兴趣的:(golang)