go更新腾讯云DNSPod的解析记录

纯粹练手用的,大家轻喷

  1. 获取SecretId,SecretKey
    打开腾讯云,登录之后打开 https://console.cloud.tencent.com/cam/capi,然后 新建密钥记录生成的 SecretId,SecretKey
    go更新腾讯云DNSPod的解析记录
  2. 获取RecordId
    然后打开 https://console.cloud.tencent.com/api/explorer?Product=dnspod&Version=2021-03-23&Action=DescribeRecordList&SignVersion=点击 在线调试,然后将自己的域名输入到 Domain下面的框里,点击 发送请求,此时会让 扫码登录,微信扫码登录即可,登录之后在 响应结果框里会出现自己的 RecordId,记录一下自己需要修改的RecordId
    go更新腾讯云DNSPod的解析记录
  3. 添加一个dnspodRecord.go文件
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "regexp"
    "strconv"
    "strings"
    "time"

    "github.com/robfig/cron"
    "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
    "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
    "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
    dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
)
//全局IP,本次获取与上次作比较,相同IP不需要更新
var currentIp = ""

func main() {
    c := cron.New()
    spec := "*/30 * * * * ?" //可自行更改,默认是30秒执行一次
    c.AddFunc(spec, func() {
        fmt.Printf("start:%v \n", time.Now())
        modifyRecordAfterGetIp()
        fmt.Printf("shop:%v \n", time.Now())
    })
    c.Start()

    select {}
}
//循环获取公网IP,对比变化,变化后同步
func modifyRecordAfterGetIp() {
    fmt.Printf("currentIp: %s \n", currentIp)
    //获取记录
    records := [][]string{}
    row1 := []string{"yourhost.cn", "A", "yourRecordId", "默认", "", "*"}
    row2 := []string{"yourhost.cn", "A", "yourRecordId", "默认", "", "@"}
    row3 := []string{"yourhost.cn", "A", "yourRecordId", "默认", "", "www"}
    records = append(records, row1)
    records = append(records, row2)
    records = append(records, row3)

    //获取Ip的网址
    sliceIp := []string{"myip.ipip.net/s", "api.ip.sb/ip", "ident.me", "ip.3322.net", "ip.cip.cc", "api.ipify.org"}
    // 迭代每一个元素,获取Ip并判断Ip是否符合,再调用修改腾讯云记录
    for index, value := range sliceIp {
        fmt.Printf("---- 开始请求IP %s ----\n", value)
        result := string(getIp("http://" + value))
        isIpv4 := matchIpv4(result)
        fmt.Printf("Index: %d Value: %s result:%s matchIpv4:%t \n", index, value, result, isIpv4)
        if isIpv4 {
            if currentIp != result {
                fmt.Printf("---- 结束请求IP ----\n \n")
                currentIp = result
                var i int
                for i = 0; i < 3; i++ {
                    intNum, _ := strconv.Atoi(records[i][2])
                    modifyDynamicDNS(records[i][0], records[i][1], uint64(intNum), records[i][3], currentIp, records[i][5])
                }
                fmt.Printf("currentIp: %s \n", currentIp)
            }
            fmt.Printf("Ip&#x672A;&#x53D1;&#x751F;&#x53D8;&#x5316; \n")
            break
        }
    }
    fmt.Printf("---- &#x7ED3;&#x675F; ---- \n")
    fmt.Printf("currentIp: %s \n", currentIp)
}

//&#x8C03;&#x7528;&#x817E;&#x8BAF;&#x4E91;api&#x4FEE;&#x6539;&#x8BB0;&#x5F55;
func modifyDynamicDNS(domain string, recordType string, recordId uint64, recordLine string, ip string, subDomain string) {
    credential := common.NewCredential(
        "yourSecretId",
        "yourSecretKey",
    )
    cpf := profile.NewClientProfile()
    cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com"
    client, _ := dnspod.NewClient(credential, "", cpf)

    request := dnspod.NewModifyRecordBatchRequest()

    request.RecordIdList = make([]*uint64, 1)

    fmt.Printf("&#x5F00;&#x59CB;&#x66F4;&#x65B0;&#x8BB0;&#x5F55;:%d  \n", recordId)

    request.RecordIdList[0] = &recordId

    request.Change = new(string)
    request.ChangeTo = new(string)

    *request.Change = "value"
    *request.ChangeTo = strings.Replace(ip, "\n", "", -1)

    fmt.Printf("requestJson&#xFF1A;%s  \n", request.ToJsonString())
    response, err := client.ModifyRecordBatch(request)
    if _, ok := err.(*errors.TencentCloudSDKError); ok {
        fmt.Printf("error&#xFF1A;An API error has returned: %s \n", err)
        return
    }
    if err != nil {
        panic(err)
    }
    fmt.Printf("response&#xFF1A;%s \n", response.ToJsonString())
    fmt.Printf("&#x7ED3;&#x675F;&#x66F4;&#x65B0;&#x8BB0;&#x5F55;:%d  \n \n", recordId)

}

//&#x83B7;&#x53D6;&#x516C;&#x7F51;IP
func getIp(url string) string {
    client := http.Client{
        Timeout: 2 * time.Second,
    }
    resp, err := client.Get(url)
    if err != nil {
        fmt.Printf(" err:%s \n", err)
        return "error"
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    result := string(body)
    fmt.Printf("body:%s", string(body))
    fmt.Printf("StatusCode:%d \n", resp.StatusCode)
    if resp.StatusCode == 200 {
        fmt.Printf("ok" + " \n")
    }
    return result
}

//&#x5339;&#x914D;&#x662F;&#x5426;&#x662F;Ipv4
func matchIpv4(ip string) bool {
    matched, err := regexp.MatchString("((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}", ip)
    if err != nil {
        fmt.Println("ip&#x5339;&#x914D;&#x51FA;&#x73B0;&#x9519;&#x8BEF;")
        return false
    }
    if matched { // &#x5339;&#x914D;&#x4E0A;&#x4E86;
        if len(ip) < 16 {
            return true
        }
    }
    return false
}
  1. get缺少的go环境,进入dnspodRecord.go所在文件夹的命令框,完全执行后将会新增同名mod、sum文件
  2. 使用腾讯云镜像加速下载:
    1. Linux 或 MacOS:
      export GOPROXY=https://mirrors.tencent.com/go/
    2. Windows:
      set GOPROXY=https://mirrors.tencent.com/go/
  3. go mod初始化,将会生成一个同名mod文件
    go mod init dnspodRecord
  4. 拉取公共基础包
    go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common
  5. 拉取dnspod包
    go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod
  6. 本地电脑不可能只执行一次,拉取cron包
    go get github.com/robfig/cron
  7. 运行测试,将会30秒执行一次,将自己的IP地址同步到dnspod的记录解析中
    go run dnspodRecord.go
    go更新腾讯云DNSPod的解析记录

Original: https://www.cnblogs.com/spatxos/p/15614159.html
Author: spatxos
Title: go更新腾讯云DNSPod的解析记录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516512/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球