From b967ee411d1b969a17cfa0b5f9477efe2b555fc5 Mon Sep 17 00:00:00 2001 From: tsosunchia <59512455+tsosunchia@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:35:51 +0800 Subject: [PATCH] =?UTF-8?q?tracemap=E6=94=AF=E6=8C=81IP-API.COM=E5=81=9A?= =?UTF-8?q?=E4=B8=BAAPI,=E4=BF=AE=E6=AD=A3=E7=AC=AC=E4=B8=89=E6=96=B9API?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=9C=B0=E5=8C=BA=E6=98=BE=E7=A4=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/cmd.go | 3 ++- ipgeo/ipapicom.go | 25 +++++++++++++++++++++---- ipgeo/ipinfo.go | 21 ++++++++++++--------- util/util.go | 9 +++++++++ 4 files changed, 44 insertions(+), 14 deletions(-) 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 +}