想找个现成的阿里云DDNS自动更新Python程序,找了一圈竟然没有一个好用的。
大部分问题都是需要阿里云的Github代码,也就是所谓的 aliyunsdkalidns ,其实根本没必要。
有一个倒是可以直接用,但是代码写的太复杂,简单的功能非要搞好几个类,绕来绕去的。
还是自己动手丰衣足食了。
以下代码需安装 阿里云核心SDK 和 阿里云域名SDK,即:
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-domain
另外需要申请主用户的AccessKey,注意不能是子用户的。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import json
import requests
import re
# 初始化
client = AcsClient('<AccessKey>', '<AccessKeySrc>', 'cn-hangzhou')
request = CommonRequest()
request.set_domain('alidns.aliyuncs.com')
request.set_version('2015-01-09')
domain = "域名"
prefix = "前缀"
# 获取公网IP地址
html_text = requests.get("https://ip.cn/").text
ip_text = re.findall(r'(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])', html_text)
ip = ip_text[0]
print("公网IP地址:"+ ip)
print("域名:"+ prefix + "." + domain)
# 获取二级域名的RecordId
request.set_action_name('DescribeDomainRecords')
request.add_query_param('DomainName', domain)
response = client.do_action_with_exception(request)
jsonObj = json.loads(response.decode("UTF-8"))
records = jsonObj["DomainRecords"]["Record"]
record = None
for rec in records:
if rec["RR"] == prefix:
record = rec
break
if record == None:
print("未找到二级域名记录")
exit()
elif record['Value'] == ip:
print("现有IP记录已为最新")
exit()
# 更新IP记录
request.set_action_name('UpdateDomainRecord')
request.add_query_param('RecordId', record['RecordId'])
request.add_query_param('RR', prefix)
request.add_query_param('Type', 'A')
request.add_query_param('Value', ip)
response = client.do_action_with_exception(request)
print("DDNS更新完成\n")