nezha/cmd/agent/monitor/myip.go
2021-03-22 21:41:31 +08:00

61 lines
1.1 KiB
Go

package monitor
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
type geoIP struct {
CountryCode string `json:"country_code,omitempty"`
IP string `json:"ip,omitempty"`
}
var ipv4Servers = []string{
"https://api-ipv4.ip.sb/geoip",
"https://ip4.seeip.org/geoip",
}
var ipv6Servers = []string{
"https://ip6.seeip.org/geoip",
"https://api-ipv6.ip.sb/geoip",
}
var cachedIP, cachedCountry string
func UpdateIP() {
for {
ipv4 := fetchGeoIP(ipv4Servers)
ipv6 := fetchGeoIP(ipv6Servers)
cachedIP = fmt.Sprintf("ip(v4:%s,v6:%s)", ipv4.IP, ipv6.IP)
if ipv4.CountryCode != "" {
cachedCountry = ipv4.CountryCode
} else if ipv6.CountryCode != "" {
cachedCountry = ipv6.CountryCode
}
time.Sleep(time.Minute * 10)
}
}
func fetchGeoIP(servers []string) geoIP {
var ip geoIP
for i := 0; i < len(servers); i++ {
resp, err := http.Get(servers[i])
if err == nil {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
continue
}
resp.Body.Close()
err = json.Unmarshal(body, &ip)
if err != nil {
continue
}
return ip
}
}
return ip
}