阿里云动态域名解析(DDNS)API调用记录
2021-02-23 17:20
204 查看
动态域名解析的作用是动态更新域名对应的IP地址,因为分配的公网IP不是固定不变的,所以使用到了阿里云的动态域名解析。同理,由于IP地址的动态性,人为更新记录是不现实的,阿里云提供了API供用户动态更新域名解析记录。本次主要用于记录一下python的实现实例,实现方法有多种,在下抛砖引玉。进入正题。
思路:
1、获取本地外网地址
2、获取域名解析记录中的RecordID以及IP地址
3、更新域名解析记录:如果不存在解析记录则进行新增,如果存在且解析记录中的IP与本地外网IP不一致则进行更新
首先安装阿里云提供的python sdk包
pip3 install aliyun-python-sdk-core pip3 install aliyun-python-sdk-alidns
实现代码如下:
from aliyunsdkcore.client import AcsClient import requests import json from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest from aliyunsdkalidns.request.v20150109 import AddDomainRecordRequest from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest AccessKey_ID = "LTAI4GEQMxxxxxxxx" # 需要根据实际填写 AccessKey_Secret = "HmHElvWx2kzR6rxxxxxxxxxxx" # 需要根据实际填写 Regions = "cn-hangzhou" #获取本地公网ip地址 def get_internet_ip(): with requests.get("http://ip.3322.net") as response: ip = response.text return ip #子域名解析记录查询 def get_recordid(client): request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName('csgefei.top') response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') result = json.loads(response) print(result) record_id = result["DomainRecords"]["Record"][0]["RecordId"] return record_id #获取解析记录中当前ip地址 def get_recordip(client): request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName('azgefei.top') response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') result = json.loads(response) record_ip = result["DomainRecords"]["Record"][0]["Value"] return record_ip #新增解析记录 def add_record(client,priority,ttl,record_type,value,rr,domainname): request = AddDomainRecordRequest() request.set_accept_format('json') request.set_Priority(priority) request.set_TTL(ttl) request.set_Value(value) request.set_Type(record_type) request.set_RR(rr) request.set_DomainName(domainname) response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') relsult = json.loads(response) return relsult # 更新域名解析记录 def update_record(client, priority, ttl, record_type, value, rr, record_id): request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() request.set_accept_format('json') request.set_Priority(priority) request.set_TTL(ttl) request.set_Value(value) request.set_Type(record_type) request.set_RR(rr) request.set_RecordId(record_id) response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') return response if __name__ == '__main__': client = AcsClient(AccessKey_ID, AccessKey_Secret,Regions) record_id = get_recordid(client) local_ip = get_internet_ip().strip() ddns_ip = get_recordip(client).strip() if record_id != "": if local_ip == ddns_ip: #判断本地IP与域名解析记录IP是否一致 print("解析地址未发生变化") else: print("解析地址已经改变") update_record(client,"5","600","A",local_ip,"@",record_id) #地址变化则更新解析记录 else: print("主机解析记录不存在,将添加记录") add_record(client,"5","600","A",local_ip,"@","azgefei.top") #解析记录不存在则新增解析记录
将脚本放到linux服务器中(执行chmod +x update_ddns.py增加执行权限),并加入定时任务每分钟执行一次:在linux服务器中运行 crontab -e 写入如下内容保存并退出
#定时更新云解析记录 * * * * * python3 /home/NodeServer/AutoDevopsScript/update_ddns.py
至此,工作基本完成了,代码尚有优化余地,本文不作讨论,仅供大家参考之用。
顺带一提,访问API时,账户需要授权,否则会报400。
相关文章推荐
- Python平台下调用阿里云API参数实现DDNS功能
- 调用阿里云api获取解析记录列表
- 【终极版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】...
- 阿里云api调用做简单的cmdb
- Python 调用阿里云 API 收集 ECS 数据
- 调用阿里云短信API发送短信通知
- Python调用aliyun API设置阿里云负载均衡虚拟服务器组权重
- Hadoop学习记录(3)|HDFS API 操作|RPC调用
- 调用阿里云API 的demo示例(java/python)
- 阿里云短信服务API服务调用SendSMSUtil
- 阿里云天气api调用方法。
- 调用阿里云api获取阿里云数据同步服务(DTS)并且作图发送邮件的整个流程
- 基于阿里云 DNS API 实现的 DDNS 工具
- 如何使用阿里云云解析API实现动态域名解析,搭建私有服务器
- 直接调用阿里云视频点播API实现视频播放
- python3.6 通过调用 阿里云 API (非SDK方式) 16ca 查询 可用区 例子
- 十八、阿里云api调用
- 【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】
- 阿里云CDN API调用
- 【阿里云API】 阿里云API调用的若干说明