diff --git a/cmd/cmd.go b/cmd/cmd.go index 521eb55..68b2e86 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -306,7 +306,8 @@ func Excute() { fmt.Println(err) return } - if !*disableMaptrace && (strings.ToUpper(*dataOrigin) == "LEOMOEAPI" || strings.ToUpper(*dataOrigin) == "IPINFO") { + if !*disableMaptrace && + (util.StringInSlice(strings.ToUpper(*dataOrigin), []string{"LEOMOEAPI", "IPINFO", "IPINFO", "IP-API.COM", "IPAPI.COM"})) { url, err := tracemap.GetMapUrl(string(r)) if err != nil { log.Fatalln(err) diff --git a/ipgeo/ipapicom.go b/ipgeo/ipapicom.go index 131e9bf..2285fed 100644 --- a/ipgeo/ipapicom.go +++ b/ipgeo/ipapicom.go @@ -2,17 +2,19 @@ package ipgeo import ( "errors" + "github.com/xgadget-lab/nexttrace/util" "io" "log" "net/http" "regexp" + "strconv" "time" "github.com/tidwall/gjson" ) func IPApiCom(ip string, timeout time.Duration, _ string, _ bool) (*IPGeoData, error) { - url := "http://ip-api.com/json/" + ip + "?fields=status,message,country,regionName,city,isp,as" + url := "http://ip-api.com/json/" + ip + "?fields=status,message,country,regionName,city,isp,district,as,lat,lon" client := &http.Client{ // 2 秒超时 Timeout: timeout, @@ -32,12 +34,27 @@ func IPApiCom(ip string, timeout time.Duration, _ string, _ bool) (*IPGeoData, e } re := regexp.MustCompile("[0-9]+") + var country = res.Get("country").String() + var prov = res.Get("region").String() + var city = res.Get("city").String() + var district = res.Get("district").String() + if util.StringInSlice(country, []string{"Hong Kong", "Taiwan", "Macao"}) { + district = prov + " " + city + " " + district + city = country + prov = "" + country = "China" + } + lat, _ := strconv.ParseFloat(res.Get("lat").String(), 32) + lng, _ := strconv.ParseFloat(res.Get("lon").String(), 32) return &IPGeoData{ Asnumber: re.FindString(res.Get("as").String()), - Country: res.Get("country").String(), - City: res.Get("city").String(), - Prov: res.Get("regionName").String(), + Country: country, + City: city, + Prov: prov, + District: district, Owner: res.Get("isp").String(), + Lat: lat, + Lng: lng, }, nil } diff --git a/ipgeo/ipinfo.go b/ipgeo/ipinfo.go index d7db09b..954a78b 100644 --- a/ipgeo/ipinfo.go +++ b/ipgeo/ipinfo.go @@ -1,6 +1,7 @@ package ipgeo import ( + "github.com/xgadget-lab/nexttrace/util" "io" "net/http" "strconv" @@ -11,7 +12,7 @@ import ( ) func IPInfo(ip string, timeout time.Duration, _ string, _ bool) (*IPGeoData, error) { - url := "https://ipinfo.io/" + ip + "?token=" + token.ipinfo + url := "http://ipinfo.io/" + ip + "?token=" + token.ipinfo client := &http.Client{ // 2 秒超时 Timeout: timeout, @@ -29,11 +30,6 @@ func IPInfo(ip string, timeout time.Duration, _ string, _ bool) (*IPGeoData, err res := gjson.ParseBytes(body) - var country string - country = res.Get("country").String() - if res.Get("country").String() == "HK" || res.Get("country").String() == "TW" { - country = "CN" - } // ISO-3166 转换 var countryMap = map[string]string{ "AF": "Afghanistan", @@ -286,13 +282,19 @@ func IPInfo(ip string, timeout time.Duration, _ string, _ bool) (*IPGeoData, err "ZM": "Zambia", "ZW": "Zimbabwe", } - country = countryMap[country] - + var country = res.Get("country").String() var prov = res.Get("region").String() var city = res.Get("city").String() + var district = "" + if util.StringInSlice(country, []string{"TW", "MO", "HK"}) { + district = prov + " " + city + city = countryMap[country] + prov = "" + country = "CN" + } + country = countryMap[country] var anycast = false - //"anycast": true, if res.Get("anycast").String() == "true" { country = "ANYCAST" prov = "ANYCAST" @@ -329,6 +331,7 @@ func IPInfo(ip string, timeout time.Duration, _ string, _ bool) (*IPGeoData, err Country: country, City: city, Prov: prov, + District: district, Owner: owner, Lat: lat, Lng: lng, diff --git a/util/util.go b/util/util.go index 4f176b8..f61a2fb 100644 --- a/util/util.go +++ b/util/util.go @@ -210,3 +210,12 @@ func GetPowProvider() string { } return "" } + +func StringInSlice(val string, list []string) bool { + for _, v := range list { + if v == val { + return true + } + } + return false +}