阿里雲動態域名解析(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

相關文章
相關標籤/搜索