main.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. for _, rec := range lists {
  54. if rec.Name == sSubName && rec.Type == "A" { // 找到要修改的解析
  55. log.Println("record:", rec)
  56. if oldip != rec.Value || curip != oldip {
  57. rec.Value = curip
  58. err1 := cli.RecordModify(sDomain, rec)
  59. if err1 != nil {
  60. log.Println("RecordModify error:", err1.Error())
  61. }else{
  62. log.Println("RecordModify succeded:", url, rec.Value)
  63. }
  64. }
  65. }
  66. }
  67. }
  68. func main() {
  69. bytes, err := ioutil.ReadFile("./config.json")
  70. if err == nil {
  71. log.Println("读取json文件成功")
  72. configjson := map[string]string{}
  73. json.Unmarshal(bytes, &configjson)
  74. gSecretId = configjson["secretId"]
  75. gSecretKey = configjson["secretKey"]
  76. gDomain = configjson["domain"]
  77. gSubName = configjson["subname"]
  78. gInterval, _ = strconv.Atoi(configjson["interval"])
  79. }
  80. log.Println("start:", gSecretId, gSecretKey, gDomain, gSubName, gInterval)
  81. // 默认启动执行一次检测
  82. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  83. go func() {
  84. for {
  85. ticker := time.NewTicker(time.Duration(gInterval) * time.Second)
  86. select {
  87. case <-ticker.C:
  88. log.Println("当前时间为:", time.Now())
  89. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  90. }
  91. }
  92. }()
  93. for {
  94. time.Sleep(time.Second * 1)
  95. }
  96. }