go更新騰訊雲DNSPod的解析記錄


純粹練手用的,大家輕噴

  1. 獲取SecretId,SecretKey
    打開騰訊雲,登錄之后打開https://console.cloud.tencent.com/cam/capi,然后新建密鑰記錄生成的SecretId,SecretKey
  2. 獲取RecordId
    然后打開https://console.cloud.tencent.com/api/explorer?Product=dnspod&Version=2021-03-23&Action=DescribeRecordList&SignVersion=點擊在線調試,然后將自己的域名輸入到Domain下面的框里,點擊發送請求,此時會讓掃碼登錄,微信掃碼登錄即可,登錄之后在響應結果框里會出現自己的RecordId,記錄一下自己需要修改的RecordId
  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未發生變化 \n")
			break
		}
	}
	fmt.Printf("---- 結束 ---- \n")
	fmt.Printf("currentIp: %s \n", currentIp)
}

//調用騰訊雲api修改記錄
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("開始更新記錄:%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:%s  \n", request.ToJsonString())
	response, err := client.ModifyRecordBatch(request)
	if _, ok := err.(*errors.TencentCloudSDKError); ok {
		fmt.Printf("error:An API error has returned: %s \n", err)
		return
	}
	if err != nil {
		panic(err)
	}
	fmt.Printf("response:%s \n", response.ToJsonString())
	fmt.Printf("結束更新記錄:%d  \n \n", recordId)

}

//獲取公網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
}

//匹配是否是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匹配出現錯誤")
		return false
	}
	if matched { // 匹配上了
		if len(ip) < 16 {
			return true
		}
	}
	return false
}
  1. get缺少的go環境,進入dnspodRecord.go所在文件夾的命令框,完全執行后將會新增同名mod、sum文件
    1. 使用騰訊雲鏡像加速下載:
      1. Linux 或 MacOS:
        export GOPROXY=https://mirrors.tencent.com/go/
      2. Windows:
        set GOPROXY=https://mirrors.tencent.com/go/
    2. go mod初始化,將會生成一個同名mod文件
      go mod init dnspodRecord
    3. 拉取公共基礎包
      go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common
    4. 拉取dnspod包
      go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod
    5. 本地電腦不可能只執行一次,拉取cron包
      go get github.com/robfig/cron
  2. 運行測試,將會30秒執行一次,將自己的IP地址同步到dnspod的記錄解析中
    go run dnspodRecord.go


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM