cloudflare/DNSPod DDNS 动态域名设置
所谓动态域名,就是当你的服务器 IP 地址发生变化的时候,自动地修改你在「域名解析服务商」那里的域名记录值
怎么操作?看官方文档
Use dynamic IP address
Update DNS Record
DNSPod用户API文档
cloudflare
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# created by hangj(hangj.cnblogs.com)
import http.client
import json
CF_Email="alice@example.com"
CF_Token="0932a09c9a9d"
CF_Zone_ID="a900b9a9d8a9"
CF_API_Key="cb7de90"
headers = {
'Content-Type': "application/json",
'X-Auth-Email': CF_Email,
'X-Auth-Key': CF_API_Key,
'Authorization': 'Bearer ' + CF_Token,
}
def dns_list():
conn = http.client.HTTPSConnection("api.cloudflare.com")
conn.request("GET", f"/client/v4/zones/{CF_Zone_ID}/dns_records", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
# identifier: record id
def dns_detail(identifier):
conn = http.client.HTTPSConnection("api.cloudflare.com")
conn.request("GET", f"/client/v4/zones/{CF_Zone_ID}/dns_records/{identifier}", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
# identifier: record id
def dns_update(identifier, name, IP):
conn = http.client.HTTPSConnection("api.cloudflare.com")
payload = {
"type": "A",
"name": name,
"content": IP,
"ttl": 120,
}
conn.request("PUT", f"/client/v4/zones/{CF_Zone_ID}/dns_records/{identifier}", json.dumps(payload), headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
# 如果 record 原来的 ttl 是 auto, 则此操作无法将 ttl 改成制定的值, 需要先用 dns_update 全量修改该 record
def dns_patch(identifier, IP):
conn = http.client.HTTPSConnection("api.cloudflare.com")
payload = {
"content": IP,
"ttl": 120,
}
conn.request("PATCH", f"/client/v4/zones/{CF_Zone_ID}/dns_records/{identifier}", json.dumps(payload), headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
def main():
# dns_list()
dns_update('09f0ea0', name="example.com", IP="113.90.37.101")
# dns_patch('09f0ea0', IP="113.90.37.101")
# dns_detail('09f0ea0')
if __name__ == '__main__':
main()
#
DNSPod
首先需要创建 Token
完整的 API Token 是由 ID,Token 组合而成的,用英文的逗号分割
用刚创建的 API Token 测试一下:
$curl -X POST https://dnsapi.cn/Info.Version -d 'login_token=LOGIN_TOKEN&format=json'
{"status":{"code":"1","message":"4.6","created_at":"2021-06-27 22:04:23"}}
code 返回 1 表示「操作成功」,下一步就可以修改记录了
修改 record 用两个 API 就够了:
记录列表 和 更新动态DNS记录
$curl -X POST https://dnsapi.cn/Record.List -d 'login_token=LOGIN_TOKEN&format=json&domain_id=12600793&sub_domain=www&record_type=A&offset=0&length=3'
$curl -X POST https://dnsapi.cn/Record.Ddns -d 'login_token=LOGIN_TOKEN&format=json&domain_id=2317346&record_id=16894439&record_line_id=10%3D0&sub_domain=www'
其中 domain_id=123456 可以换成 domain=yourdomain.com,sub_domain= 记得也修改成你自己的记录
从 Record.List 返回消息中,可以找到你所请求的子域名的 record_id,和该记录所指向的 IP 地址,如果该 IP 值跟你将要设置的 IP 相同,就不要再进行下一步了
如果1小时之内,提交了超过5次没有任何变动的记录修改请求,该记录会被系统锁定1小时,不允许再次修改。比如原记录值已经是 1.1.1.1,新的请求还要求修改为 1.1.1.1。
Record.Ddns value 改成新的 IP 地址,操作成功之后 TTL 会变成 10,此时才变成了真正的「动态域名」
写成 python 脚本:
.