main.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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("获取IP错误,终止检测:", err.Error())
  43. return
  44. }
  45. oldip := strings.ReplaceAll(oldips[0], "\n", "")
  46. curip := strings.ReplaceAll(GetIP(), "\n", "")
  47. if oldip == curip {
  48. log.Println("解析出来的IP本来就是当前公网IP:", url, curip)
  49. return
  50. }
  51. log.Println("开始检测 url:" + url + " ip:", GetIP(), " host:", oldip)
  52. cli := cns.New( secretId, secretKey)
  53. lists, err := cli.RecordList(sDomain)
  54. if err != nil {
  55. log.Println("接口错误:", err.Error())
  56. return
  57. }
  58. for _, rec := range lists {
  59. if rec.Name == sSubName && rec.Type == "A" { // 找到要修改的解析
  60. log.Println("record:", rec)
  61. if oldip != rec.Value || curip != oldip {
  62. rec.Value = curip
  63. err1 := cli.RecordModify(sDomain, rec)
  64. if err1 != nil {
  65. log.Println("RecordModify error:", err1.Error())
  66. }else{
  67. log.Println("RecordModify succeded:", url, rec.Value)
  68. }
  69. }
  70. }
  71. }
  72. }
  73. func main() {
  74. bytes, err := ioutil.ReadFile("./config.json")
  75. if err == nil {
  76. log.Println("读取json文件成功")
  77. configjson := map[string]string{}
  78. json.Unmarshal(bytes, &configjson)
  79. gSecretId = configjson["secretId"]
  80. gSecretKey = configjson["secretKey"]
  81. gDomain = configjson["domain"]
  82. gSubName = configjson["subname"]
  83. gInterval, _ = strconv.Atoi(configjson["interval"])
  84. }
  85. log.Println("start:", gSecretId, gSecretKey, gDomain, gSubName, gInterval)
  86. // 默认启动执行一次检测
  87. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  88. go func() {
  89. for {
  90. ticker := time.NewTicker(time.Duration(gInterval) * time.Second)
  91. select {
  92. case <-ticker.C:
  93. log.Println("当前时间为:", time.Now())
  94. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  95. }
  96. }
  97. }()
  98. for {
  99. time.Sleep(time.Second * 1)
  100. }
  101. }