Files
go-utils/geoip/geolite/geolite.go
2023-10-19 15:27:32 +08:00

70 lines
1.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package geolite
import (
"errors"
"net"
"github.com/go-kratos/kratos/v2/log"
"github.com/oschwald/geoip2-golang"
"github.com/tx7do/kratos-utils/geoip"
"github.com/tx7do/kratos-utils/geoip/geolite/assets"
)
const defaultOutputLanguage = "zh-CN"
// Client 地理位置解析结构体
type Client struct {
db *geoip2.Reader
outputLanguage string
}
// NewClient .
func NewClient() (*Client, error) {
db, err := geoip2.FromBytes(assets.GeoLite2CityData)
if err != nil {
return nil, err
}
return &Client{db: db, outputLanguage: defaultOutputLanguage}, nil
}
// Close 关闭客户端
func (g *Client) Close() error {
if g.db == nil {
return nil
}
return g.db.Close()
}
// SetLanguage 设置输出的语言默认为zh-CN
func (g *Client) SetLanguage(code string) {
g.outputLanguage = code
}
// query 查询城市级别数据
func (g *Client) query(rawIP string) (city *geoip2.City, err error) {
ip := net.ParseIP(rawIP)
if ip == nil {
return nil, errors.New("invalid ip")
}
return g.db.City(ip)
}
// Query 通过IP获取地区
func (g *Client) Query(rawIP string) (ret geoip.Result, err error) {
record, err := g.query(rawIP)
if err != nil {
log.Fatal(err)
return ret, err
}
ret.Country = record.Country.Names[g.outputLanguage]
if len(record.Subdivisions) > 0 {
ret.Province = record.Subdivisions[0].Names[g.outputLanguage]
}
ret.City = record.City.Names[g.outputLanguage]
return
}