DNSPod 提供了较简便的方式来更新自己账户下域名的 DNS,只需后台的 token,避免登录认证等麻烦。
使用现有的 go 语言库 github.com/nrdcg/dnspod-go
,这个库比较简单,功能够用
操作过程
这里的目的是当服务器 IP 发生改变时,自动更新对应域名的 DNS 设置。
- 获取个人域名列表及域名ID
- 获取指定域名的记录及记录ID
- 通过域名 ID 和 记录 ID 更新 DNS
首次运行要实行前两步,获取两个 ID 后可直接做第三步。
有个小坑是: 完整的 API Token 是由 ID,Token
组合而成,用英文逗号分隔
首先是监测服务器外网 IP 是否变化,有很多网站都可以,如 https://httpbin.org/ip ,也可以在自己的在线网站写一个页面获取客户端的 IP
当 IP 改变就更新了。。。
获取账户下的域名
1
2
3
4
5
6
7
8
9
10
11
12
params := dnspod.CommonParams{LoginToken: token, Format: "json"}
dnsClient := dnspod.NewClient(params)
domains, _, err := dnsClient.Domains.List()
for _, dm := range domains {
fmt.Printf("Domain: %s (id: %s)\n", dm.Name, dm.ID)
if dm.Name == domain {
getDomain, getDomainId = dm.Name, dm.ID.String()
break
}
}
获取指定域名的记录
1
2
3
4
5
6
7
8
9
10
11
12
13
records, _, err := dnsClient.Records.List(domainId, "")
if err != nil {
log.Println(err)
return
}
var getSubName, getSubNameId, oldValue string
for _, record := range records {
fmt.Printf("ID: %s, Name: %s, Type: %s, Value: %s \n", record.ID, record.Name, record.Type, record.Value)
if record.Name == subName {
getSubName, getSubNameId, oldValue = record.Name, record.ID, record.Value
break
}
}
添加或更新
1
2
3
4
5
6
7
record, _, err := dnsClient.Records.Create(dnObj.DomainId, dnspod.Record{
Name: subName,
Type: dnObj.Type,
TTL: "600", // seconds
Value: serviceIp,
Line: "默认",
})
1
2
3
4
5
6
7
8
_, _, err = dnsClient.Records.Update(dnObj.DomainId, dnObj.SubNameId, dnspod.Record{
ID: dnObj.SubNameId, // 可选
Name: dnObj.SubName,
Type: dnObj.Type,
TTL: "600", // seconds
Value: serviceIp,
Line: "默认",
})
参考
本文网址: https://golangnote.com/topic/302.html 转摘请注明来源