94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package ip2region
|
|
|
|
import (
|
|
"embed"
|
|
"strings"
|
|
"time"
|
|
|
|
"ems.agt/src/framework/logger"
|
|
)
|
|
|
|
// 网络地址(内网)
|
|
const LOCAT_HOST = "127.0.0.1"
|
|
|
|
// 全局查询对象
|
|
var searcher *Searcher
|
|
|
|
//go:embed ip2region.xdb
|
|
var ip2regionDB embed.FS
|
|
|
|
func init() {
|
|
// 从 dbPath 加载整个 xdb 到内存
|
|
buf, err := ip2regionDB.ReadFile("ip2region.xdb")
|
|
if err != nil {
|
|
logger.Fatalf("failed error load xdb from : %s\n", err)
|
|
return
|
|
}
|
|
|
|
// 用全局的 cBuff 创建完全基于内存的查询对象。
|
|
base, err := NewWithBuffer(buf)
|
|
if err != nil {
|
|
logger.Errorf("failed error create searcher with content: %s\n", err)
|
|
return
|
|
}
|
|
|
|
// 赋值到全局查询对象
|
|
searcher = base
|
|
}
|
|
|
|
// RegionSearchByIp 查询IP所在地
|
|
//
|
|
// 国家|区域|省份|城市|ISP
|
|
func RegionSearchByIp(ip string) (string, int, int64) {
|
|
ip = ClientIP(ip)
|
|
if ip == LOCAT_HOST {
|
|
// "0|0|0|内网IP|内网IP"
|
|
return "0|0|0|app.common.noIPregion|app.common.noIPregion", 0, 0
|
|
}
|
|
tStart := time.Now()
|
|
region, err := searcher.SearchByStr(ip)
|
|
if err != nil {
|
|
logger.Errorf("failed to SearchIP(%s): %s\n", ip, err)
|
|
return "0|0|0|0|0", 0, 0
|
|
}
|
|
return region, 0, time.Since(tStart).Milliseconds()
|
|
}
|
|
|
|
// RealAddressByIp 地址IP所在地
|
|
//
|
|
// 218.4.167.70 江苏省 苏州市
|
|
func RealAddressByIp(ip string) string {
|
|
ip = ClientIP(ip)
|
|
if ip == LOCAT_HOST {
|
|
return "app.common.noIPregion" // 内网IP
|
|
}
|
|
region, err := searcher.SearchByStr(ip)
|
|
if err != nil {
|
|
logger.Errorf("failed to SearchIP(%s): %s\n", ip, err)
|
|
return "app.common.unknown" // 未知
|
|
}
|
|
parts := strings.Split(region, "|")
|
|
province := parts[2]
|
|
city := parts[3]
|
|
if province == "0" && city != "0" {
|
|
if city == "内网IP" {
|
|
return "app.common.noIPregion" // 内网IP
|
|
}
|
|
return city
|
|
}
|
|
return province + " " + city
|
|
}
|
|
|
|
// ClientIP 处理客户端IP地址显示iPv4
|
|
//
|
|
// 转换 ip2region.ClientIP(c.ClientIP())
|
|
func ClientIP(ip string) string {
|
|
if strings.HasPrefix(ip, "::ffff:") {
|
|
ip = strings.Replace(ip, "::ffff:", "", 1)
|
|
}
|
|
if ip == LOCAT_HOST || ip == "::1" {
|
|
return LOCAT_HOST
|
|
}
|
|
return ip
|
|
}
|