package monitor import ( "encoding/json" "environmentCaptureAgent/pkg/utils" "fmt" "io" "net" "net/http" "strings" "time" ) type geoIP struct { CountryCode string `json:"country_code,omitempty"` IP string `json:"ip,omitempty"` Query string `json:"query,omitempty"` } var ( geoIPApiList = []string{ "https://ip.seeip.org/geoip", "https://ipapi.co/json", "https://freegeoip.app/json/", "http://ip-api.com/json/", "https://extreme-ip-lookup.com/json/", } cachedIP, cachedCountry string httpClientV4 = utils.NewSingleStackHTTPClient(time.Second*20, time.Second*5, time.Second*10, false) httpClientV6 = utils.NewSingleStackHTTPClient(time.Second*20, time.Second*5, time.Second*10, true) ) func UpdateIP() { var count = 0 for { ipv4 := fetchGeoIP(geoIPApiList, false) ipv6 := fetchGeoIP(geoIPApiList, true) if ipv4.IP == "" && ipv6.IP == "" { time.Sleep(time.Second) continue } if ipv4.IP == "" || ipv6.IP == "" { cachedIP = fmt.Sprintf("%s%s", ipv4.IP, ipv6.IP) } else { cachedIP = fmt.Sprintf("%s/%s", ipv4.IP, ipv6.IP) } if ipv4.CountryCode != "" { cachedCountry = ipv4.CountryCode } else if ipv6.CountryCode != "" { cachedCountry = ipv6.CountryCode } if len(cachedIP) > 0 || len(cachedCountry) > 0 { break } count += 1 if count > 3 { break } time.Sleep(time.Second * 30) } } func fetchGeoIP(servers []string, isV6 bool) geoIP { var ip geoIP var resp *http.Response var err error for i := 0; i < len(servers); i++ { if isV6 { resp, err = httpClientV6.Get(servers[i]) } else { resp, err = httpClientV4.Get(servers[i]) } if err == nil { body, err := io.ReadAll(resp.Body) if err != nil { continue } _ = resp.Body.Close() err = json.Unmarshal(body, &ip) if err != nil { continue } if ip.IP == "" && ip.Query != "" { ip.IP = ip.Query } // 没取到 v6 IP if isV6 && !strings.Contains(ip.IP, ":") { continue } // 没取到 v4 IP if !isV6 && !strings.Contains(ip.IP, ".") { continue } return ip } } return ip } func GetLocalIp() string { ipAddr := make([]string, 0) addrs, err := net.InterfaceAddrs() if err != nil { fmt.Println(err) return "" } for _, address := range addrs { // 检查ip地址判断是否回环地址 if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { if ipNet.IP.To4() != nil { ipAddr = append(ipAddr, ipNet.IP.String()) } } } return strings.Join(ipAddr, ";") }