package main import ( "encoding/json" "flag" "github.com/athurg/go-qcloud-cns-sdk" "io/ioutil" "log" "net" "net/http" "strconv" "strings" "time" ) var gSecretId = *flag.String("secretId", "111123123", "腾讯云秘钥id") var gSecretKey = *flag.String("secretKey", "222222", "腾讯云秘钥key") var gDomain = *flag.String("domain", "dszgame.cn", "域名") var gSubName = *flag.String("subname", "home", "二级域名") var gInterval = 120 // 间隔时间 // 获取当前网络环境的公网IP func GetIP() string { resp, err := http.Get("http://ip.cip.cc") if err != nil { return "" } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) return string(body) } // unicode转中文 func u2s(form string) string { str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(form)), `\\u`, `\u`, -1)) if err != nil { return "" } return str } // 检测域名是否需要修改解析 func checkDomain(secretId, secretKey, sDomain, sSubName string){ url := sSubName +"." + sDomain oldips, err := net.LookupHost(url) if err != nil { log.Println(err.Error()) } oldip := strings.ReplaceAll(oldips[0], "\n", "") curip := strings.ReplaceAll(GetIP(), "\n", "") if oldip == curip { log.Println("解析出来的IP本来就是当前公网IP:", url, curip) return } log.Println("开始检测 url:" + url + " ip:", GetIP(), " host:", oldip) cli := cns.New( secretId, secretKey) lists, err := cli.RecordList(sDomain) for _, rec := range lists { if rec.Name == sSubName && rec.Type == "A" { // 找到要修改的解析 log.Println("record:", rec) if oldip != rec.Value || curip != oldip { rec.Value = curip err1 := cli.RecordModify(sDomain, rec) if err1 != nil { log.Println("RecordModify error:", err1.Error()) }else{ log.Println("RecordModify succeded:", url, rec.Value) } } } } } func main() { bytes, err := ioutil.ReadFile("./config.json") if err == nil { log.Println("读取json文件成功") configjson := map[string]string{} json.Unmarshal(bytes, &configjson) gSecretId = configjson["secretId"] gSecretKey = configjson["secretKey"] gDomain = configjson["domain"] gSubName = configjson["subname"] gInterval, _ = strconv.Atoi(configjson["interval"]) } log.Println("start:", gSecretId, gSecretKey, gDomain, gSubName, gInterval) // 默认启动执行一次检测 checkDomain(gSecretId, gSecretKey, gDomain, gSubName) go func() { for { ticker := time.NewTicker(time.Duration(gInterval) * time.Second) select { case <-ticker.C: log.Println("当前时间为:", time.Now()) checkDomain(gSecretId, gSecretKey, gDomain, gSubName) } } }() for { time.Sleep(time.Second * 1) } }