93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
package geo
|
|
|
|
import (
|
|
"net"
|
|
|
|
iplib "github.com/oschwald/geoip2-golang"
|
|
)
|
|
|
|
var db *iplib.Reader
|
|
|
|
func Init(file string) (err error) {
|
|
db, err = iplib.Open(file)
|
|
return
|
|
}
|
|
|
|
func Close() {
|
|
if db != nil {
|
|
db.Close()
|
|
}
|
|
}
|
|
|
|
func City(ip string) (*iplib.City, error) {
|
|
return db.City(net.ParseIP(ip))
|
|
}
|
|
|
|
func GetCity(ip string) (string, error) {
|
|
r, err := db.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return r.City.Names["en"], nil
|
|
}
|
|
|
|
func GetCountry(ip string) (string, error) {
|
|
r, err := db.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return r.Country.Names["en"], nil
|
|
}
|
|
|
|
func GetProvince(ip string) (string, error) {
|
|
defer func() { recover() }()
|
|
r, err := db.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return r.Subdivisions[0].Names["en"], nil
|
|
}
|
|
|
|
//同时获取国家,省份,简写, 城市名称
|
|
func GetLoc(ip string) (string, string, string, error) {
|
|
defer func() { recover() }()
|
|
r, err := db.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return "", "", "", err
|
|
}
|
|
|
|
return r.Country.IsoCode, r.Subdivisions[0].IsoCode, r.City.Names["en"], nil
|
|
}
|
|
|
|
// 获取 iso_code, name
|
|
func GetContinent(ip string) (string, string, error) {
|
|
defer func() { recover() }()
|
|
r, err := db.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
return r.Continent.Code, r.Continent.Names["en"], nil
|
|
}
|
|
|
|
// Return latitude and longitude
|
|
func GetCoordinate(ip string) (float64, float64, error) {
|
|
defer func() { recover() }()
|
|
r, err := db.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
|
|
return r.Location.Latitude, r.Location.Longitude, nil
|
|
}
|
|
|
|
func GetTimezone(ip string) (string, error) {
|
|
defer func() { recover() }()
|
|
r, err := db.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return r.Location.TimeZone, nil
|
|
}
|