main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. // 获取当前网络环境的公网IP
  19. func GetIP() string {
  20. resp, err := http.Get("http://ip.cip.cc")
  21. if err != nil {
  22. return ""
  23. }
  24. defer resp.Body.Close()
  25. body, err := ioutil.ReadAll(resp.Body)
  26. return string(body)
  27. }
  28. // unicode转中文
  29. func u2s(form string) string {
  30. str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(form)), `\\u`, `\u`, -1))
  31. if err != nil {
  32. return ""
  33. }
  34. return str
  35. }
  36. // 检测域名是否需要修改解析
  37. func checkDomain(secretId, secretKey, sDomain, sSubName string){
  38. url := sSubName +"." + sDomain
  39. oldips, err := net.LookupHost(url)
  40. if err != nil {
  41. log.Println(err.Error())
  42. }
  43. oldip := strings.ReplaceAll(oldips[0], "\n", "")
  44. curip := strings.ReplaceAll(GetIP(), "\n", "")
  45. if oldip == curip {
  46. log.Println("解析出来的IP本来就是当前公网IP:", url, curip)
  47. return
  48. }
  49. log.Println("开始检测 url:" + url + " ip:", GetIP(), " host:", oldip)
  50. cli := cns.New( secretId, secretKey)
  51. lists, err := cli.RecordList(sDomain)
  52. for _, rec := range lists {
  53. if rec.Name == sSubName && rec.Type == "A" { // 找到要修改的解析
  54. log.Println("record:", rec)
  55. if oldip != rec.Value || curip != oldip {
  56. rec.Value = curip
  57. err1 := cli.RecordModify(sDomain, rec)
  58. if err1 != nil {
  59. log.Println("RecordModify error:", err1.Error())
  60. }else{
  61. log.Println("RecordModify succeded:", url, rec.Value)
  62. }
  63. }
  64. }
  65. }
  66. }
  67. func main() {
  68. bytes, err := ioutil.ReadFile("./config.json")
  69. if err == nil {
  70. log.Println("读取json文件成功")
  71. configjson := map[string]string{}
  72. json.Unmarshal(bytes, &configjson)
  73. gSecretId = configjson["secretId"]
  74. gSecretKey = configjson["secretKey"]
  75. gDomain = configjson["domain"]
  76. gSubName = configjson["subname"]
  77. }
  78. log.Println("start:", gSecretId, gSecretKey, gDomain, gSubName)
  79. // 默认启动执行一次检测
  80. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  81. go func() {
  82. for {
  83. ticker := time.NewTicker(120 * time.Second)
  84. select {
  85. case <-ticker.C:
  86. log.Println("当前时间为:", time.Now())
  87. checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
  88. }
  89. }
  90. }()
  91. for {
  92. time.Sleep(time.Second * 1)
  93. }
  94. }