main.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package main
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "github.com/athurg/go-qcloud-cns-sdk"
  6. "io/ioutil"
  7. "log"
  8. "net"
  9. "net/http"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. var gSecretId = *flag.String("secretId", "111123123", "腾讯云秘钥id")
  15. var gSecretKey = *flag.String("secretKey", "222222", "腾讯云秘钥key")
  16. var gDomain = *flag.String("domain", "dszgame.cn", "域名")
  17. var gSubName = *flag.String("subname", "home", "二级域名")
  18. var gInterval = 120 // 间隔时间
  19. // 获取当前网络环境的公网IP
  20. func GetIP() string {
  21. resp, err := http.Get("http://ip.cip.cc")
  22. if err != nil {
  23. return ""
  24. }
  25. defer resp.Body.Close()
  26. body, err := ioutil.ReadAll(resp.Body)
  27. return string(body)
  28. }
  29. // unicode转中文
  30. func u2s(form string) string {
  31. str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(form)), `\\u`, `\u`, -1))
  32. if err != nil {
  33. return ""
  34. }
  35. return str
  36. }
  37. // 检测域名是否需要修改解析
  38. func checkDomain(secretId, secretKey, sDomain, sSubName string){
  39. url := sSubName +"." + sDomain
  40. oldips, err := net.LookupHost(url)
  41. if err != nil {
  42. log.Println(err.Error())
  43. }
  44. oldip := strings.ReplaceAll(oldips[0], "\n", "")
  45. curip := strings.ReplaceAll(GetIP(), "\n", "")
  46. if oldip == curip {
  47. log.Println("解析出来的IP本来就是当前公网IP:", url, curip)
  48. return
  49. }
  50. log.Println("开始检测 url:" + url + " ip:", GetIP(), " host:", oldip)
  51. cli := cns.New( secretId, secretKey)
  52. lists, err := cli.RecordList(sDomain)
  53. if err != nil {
  54. log.Println("接口错误:", err.Error())
  55. return
  56. }
  57. for _, rec := range lists {
  58. if rec.Name == sSubName && rec.Type == "A" { // 找到要修改的解析
  59. log.Println("record:", rec)
  60. if oldip != rec.Value || curip != oldip {
  61. rec.Value = curip
  62. err1 := cli.RecordModify(sDomain, rec)
  63. if err1 != nil {
  64. log.Println("RecordModify error:", err1.Error())
  65. }else{
  66. log.Println("RecordModify succeded:", url, rec.Value)
  67. }
  68. }
  69. }
  70. }
  71. }
  72. func main() {
  73. bytes, err := ioutil.ReadFile("./config.json")
  74. if err == nil {
  75. log.Println("读取json文件成功")
  76. configjson := map[string]string{}
  77. json.Unmarshal(bytes, &configjson)
  78. gSecretId = configjson["secretId"]
  79. gSecretKey = configjson["secretKey"]
  80. gDomain = configjson["domain"]
  81. gSubName = configjson["subname"]
  82. gInterval, _ = strconv.Atoi(configjson["interval"])
  83. }
  84. log.Println("start:", gSecretId, gSecretKey, gDomain, gSubName, gInterval)
  85. // 默认启动执行一次检测
  86. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  87. go func() {
  88. for {
  89. ticker := time.NewTicker(time.Duration(gInterval) * time.Second)
  90. select {
  91. case <-ticker.C:
  92. log.Println("当前时间为:", time.Now())
  93. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  94. }
  95. }
  96. }()
  97. for {
  98. time.Sleep(time.Second * 1)
  99. }
  100. }