阿里云动态域名解析(DDNS)API调用记录

动态域名解析的做用是动态更新域名对应的IP地址,由于分配的公网IP不是固定不变的,因此使用到了阿里云的动态域名解析。同理,因为IP地址的动态性,人为更新记录是不现实的,阿里云提供了API供用户动态更新域名解析记录。本次主要用于记录一下python的实现实例,实现方法有多种,在下抛砖引玉。进入正题。
python

思路:linux

一、获取本地外网地址json

二、获取域名解析记录中的RecordID以及IP地址bash

三、更新域名解析记录:若是不存在解析记录则进行新增,若是存在且解析记录中的IP与本地外网IP不一致则进行更新服务器

首先安装阿里云提供的python sdk包dom

pip3 install aliyun-python-sdk-core
pip3 install aliyun-python-sdk-alidns

实现代码以下:
ide

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。.net

相关文章
相关标签/搜索