feat: geo ip.

This commit is contained in:
tx7do
2023-10-19 15:05:49 +08:00
parent 92be8b878a
commit 01bdf5cc06
21 changed files with 343 additions and 38 deletions

73
geoip/geolite/geolite.go Normal file
View File

@@ -0,0 +1,73 @@
package geolite
import (
"errors"
"net"
"github.com/go-kratos/kratos/v2/log"
"github.com/oschwald/geoip2-golang"
"github.com/tx7do/kratos-utils/geoip/geolite/assets"
)
type Result struct {
Country string // 国家
Province string // 省
City string // 城市
}
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 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
}