通过go操作dns
之前我的域名是在百度云上注册的 服务器又在腾讯云上 导致我每做一个项目,要部署的时候,都得跑到百度云上加一条域名解析记录 感觉很麻烦 最近在研究https的时候,发现是可以通过开放接口操作dn
通过go操作dns
发布时间:2025-12-14 (2025-12-14)

之前我的域名是在百度云上注册的

服务器又在腾讯云上

导致我每做一个项目,要部署的时候,都得跑到百度云上加一条域名解析记录

感觉很麻烦

最近在研究https的时候,发现是可以通过开放接口操作dns

直接使用代码添加或删除解析记录

本文档以百度云为例,其他云平台操作方式类似

  1. 先找到安全认证,创建Access Key,把 Secret Key记录好

百度云 dns api

使用百度云通过的sdk操作dns

package main

import (
  "fmt"
  "github.com/baidubce/bce-sdk-go/services/dns"
  "os"
)

var AccessKeyID = ""
var AccessKeySecret = ""

const Endpoint = "dns.baidubce.com"
const Domain = "fengfengzhidao.com"

var ldClient *dns.Client

func init() {
  if AccessKeyID == "" {
    AccessKeyID, _ = os.LookupEnv("AccessKeyID")
  }

  if AccessKeySecret == "" {
    AccessKeySecret, _ = os.LookupEnv("AccessKeySecret")
  }

  _ldClient, err := dns.NewClient(AccessKeyID, AccessKeySecret, Endpoint)
  if err != nil {
    panic(fmt.Sprintf("初始化客户端失败: %v\n", err))
    return
  }
  ldClient = _ldClient
}

func getRecordList() {
  res, err := ldClient.ListRecord(Domain, &dns.ListRecordRequest{
    //Rr:      "www",
    //MaxKeys: 10,
  })
  if err != nil {
    fmt.Printf("查询记录失败: %v %T\n", err, err)
    return
  }
  fmt.Printf("查询成功,总记录数: %d\n", len(res.Records))
  for _, record := range res.Records {
    fmt.Printf("记录ID %s: 类型=%s, 主机记录=%s, 记录值=%s\n",
      record.Id, record.Type, record.Rr, record.Value)
  }
}

func addRecord() {
  err := ldClient.CreateRecord(Domain, &dns.CreateRecordRequest{
    Rr:    "yy",      // 主机记录
    Type:  "A",       // 类型
    Value: "1.1.1.1", // 记录值
  }, "")
  if err != nil {
    fmt.Println("创建记录失败", err)
    return
  }
  fmt.Println("添加记录成功")
}

func main() {
  getRecordList()
}

腾讯云 dns api

百度云大家用的应该比较少,写了一个腾讯云的例子

package main

import (
  "encoding/json"
  "fmt"
  "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
  "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
  dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
  "os"
)

var SecretId = ""
var SecretKey = ""
var Domain = "domain.com"
var cl *dnspod.Client

func init() {
  if SecretId == "" {
    SecretId, _ = os.LookupEnv("SecretId")
  }

  if SecretKey == "" {
    SecretKey, _ = os.LookupEnv("SecretKey")
  }

  credential := common.NewCredential(SecretId, SecretKey)
  cpf := profile.NewClientProfile()
  _cl, err := dnspod.NewClient(credential, "", cpf)
  if err != nil {
    panic(fmt.Sprintf("初始化dns客户端错误 %s", err))
  }
  cl = _cl
}

func getRecordList() {
  res, err := cl.DescribeRecordList(&dnspod.DescribeRecordListRequest{
    Domain: &Domain,
  })
  if err != nil {
    fmt.Println(err)
    return
  }
  for i, item := range res.Response.RecordList {
    byteData, _ := json.Marshal(item)
    fmt.Println(i, string(byteData))
  }
}

func addRecord() {
  var recordType = "A"
  var value = "2.2.2.2"
  var subDomain = "x"
  var recordLine = "默认"

  res1, err := cl.CreateRecord(&dnspod.CreateRecordRequest{
    Domain:     &Domain,
    RecordType: &recordType,
    Value:      &value,
    SubDomain:  &subDomain,
    RecordLine: &recordLine,
  })
  fmt.Println(res1, err)
}

func main() {
  getRecordList()
}

版本

module test_project

go 1.24.0

require (
  github.com/baidubce/bce-sdk-go v0.9.254 // indirect
  github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 // indirect
  github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.8 // indirect
)