python实现阿里云ddns

家宽用NAT打洞建了个游戏服务器,由于家宽不是静态v4地址,所以需要折腾一下ddns

前往https://ram.console.aliyun.com/users 创建一个用户,权限只需要AliyunDNSFullAccess

创建后保存好access_key_idaccess_key_secret

安装SDK包

1
pip install alibabacloud_alidns20150109

以下为ddns代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import json,ipaddress
from alibabacloud_alidns20150109.client import Client as Alidns20150109Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_alidns20150109 import models as alidns_20150109_models
from alibabacloud_tea_util.client import Client as UtilClient

def update_ip(record:str, domain:str, domain_rr:str, access_key_id:str, access_key_secret:str, record_type:str = "A", endpoint:str="alidns.cn-hangzhou.aliyuncs.com"):
try:
if record_type == "A":
addr = ipaddress.IPv4Address(record)
elif record_type == "AAAA":
addr = ipaddress.IPv6Address(record)
else:
return(1, "不支持的记录类型")

if not addr.is_global:
return(2, "仅可设置公网单播地址")
except ipaddress.AddressValueError:
return(3, "非合法IP")

client = Alidns20150109Client(open_api_models.Config(
access_key_id=access_key_id,
access_key_secret=access_key_secret,
endpoint=endpoint
))

resp = client.describe_domain_records(alidns_20150109_models.DescribeDomainRecordsRequest(domain_name = domain,rrkey_word=domain_rr))
resp = json.loads(UtilClient.to_jsonstring(resp))['body']['DomainRecords']['Record'][0]
client.update_domain_record(alidns_20150109_models.UpdateDomainRecordRequest(rr = domain_rr,type = record_type, record_id = resp['RecordId'], value=record))

return(0, f"更新完成,更新前记录:{resp['RR']}.{resp['DomainName']} -> {resp['Value']}")

#用法示例
error, message = update_ip("0.0.0.0", "crackme.net", "mc", "你的access_key_id", "你的access_key_secret")
print(message)

将以上代码整合进natter中(Main loop上方),就能实现IP更换时自动设置DNS


python实现阿里云ddns
https://crackme.net/articles/aliddns/
作者
Brassinolide
发布于
2024年12月28日
许可协议