前言
該腳本的代碼大部分是參考自阿里云的官方幫助文檔。
1, 腳本語言使用的是python, 我個人只是了解python,沒有太深入的知識功底
2, 腳本代碼我會盡量詳細地添加注釋說明,有問題歡迎留言交流,但回復可能不會那么及時。
前置條件
1、域名是在阿里云購買的 (我的域名本身就是阿里云買的,其他的域名我沒有測試過)
2、地址必須是公網地址,不然加了解析也沒有用 (這個不用多加解釋了)
安裝阿里云SDK
需要安裝三個SDK庫,一個是阿里云核心SDK庫,一個是阿里云域名SDK庫,一個是DNS庫
阿里云核心SDK庫:pip install aliyun-python-sdk-core
阿里云域名SDK庫:pip install aliyun-python-sdk-domain
阿里云DNSSDK庫:pip install aliyun-python-sdk-alidns
說明:
1, 目前官方文檔上說的是需要安裝前兩個SDK庫,但我實測確定還需要第三個庫!
2, 如果你使用的是ubuntu系統,并且同時有python2/python3和pip2/pip3,安裝時前面的命令請寫清楚版本,特別是pip。 我的系統pip默認是2.x,使用pip install xxx 命令安裝的庫無效,使用 pip3 install xxx 才成功(如果知道如何隨意切換python和pip版本,請留言告知,感謝)。
腳本的具體功能
1, 獲取外網ip地址
2,獲取域名解析記錄
3,新增域名解析記錄
3,更新域名解析記錄
4,刪除域名解析記錄 (并不建議將該功能添加在實際腳本中)
5,批量操作,如果記錄不存在則添加記錄,存在則更新記錄
腳本代碼
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
#!/usr/bin/env python #coding=utf-8 # 加載核心SDK from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException # 加載獲取 、 新增、 更新、 刪除接口 from aliyunsdkalidns.request.v20150109 import DescribeSubDomainRecordsRequest, AddDomainRecordRequest, UpdateDomainRecordRequest, DeleteDomainRecordRequest # 加載內置模塊 import json,urllib # AccessKey 和 Secret 建議使用 RAM 子賬戶的 KEY 和 SECRET 增加安全性 ID = 'xxxxxxx' SECRET = 'xxxxxx' # 地區節點 可選地區取決于你的阿里云帳號等級,普通用戶只有四個,分別是杭州、上海、深圳、河北,具體參考官網API regionId = 'cn-hangzhou' # 配置認證信息 client = AcsClient(ID, SECRET, regionId) # 設置主域名 DomainName = 'example.com' # 子域名列表 列表參數可根據實際需求增加或減少值 SubDomainList = [ 'a' , 'b' , 'c' ] # 獲取外網IP 三個地址返回的ip地址格式各不相同,3322 的是最純凈的格式, 備選1為 json格式 備選2 為curl方式獲取 兩個備選地址都需要對獲取值作進一步處理才能使用 def getIp(): # 備選地址: 1, http://pv.sohu.com/cityjson?ie=utf-8 2,curl -L tool.lu/ip html = response. read () ip = str(html, encoding= 'utf-8' ).replace( "\n" , "" ) return ip # 查詢記錄 def getDomainInfo(SubDomain): request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest() request.set_accept_format( 'json' ) # 設置要查詢的記錄類型為 A記錄 官網支持A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL隱性(顯性)轉發 如果有需要可將該值配置為參數傳入 request.set_Type( "A" ) # 指定查記的域名 格式為 'test.example.com' request.set_SubDomain(SubDomain) response = client.do_action_with_exception(request) response = str(response, encoding= 'utf-8' ) # 將獲取到的記錄轉換成json對象并返回 return json.loads(response) # 新增記錄 (默認都設置為A記錄,通過配置set_Type可設置為其他記錄) def addDomainRecord(client,value,rr,domainname): request = AddDomainRecordRequest.AddDomainRecordRequest() request.set_accept_format( 'json' ) # request.set_Priority('1') # MX 記錄時的必選參數 request.set_TTL( '600' ) # 可選值的范圍取決于你的阿里云賬戶等級,免費版為 600 - 86400 單位為秒 request.set_Value(value) # 新增的 ip 地址 request.set_Type( 'A' ) # 記錄類型 request.set_RR(rr) # 子域名名稱 request.set_DomainName(domainname) #主域名 # 獲取記錄信息,返回信息中包含 TotalCount 字段,表示獲取到的記錄條數 0 表示沒有記錄, 其他數字為多少表示有多少條相同記錄,正常有記錄的值應該為1,如果值大于1則應該檢查是不是重復添加了相同的記錄 response = client.do_action_with_exception(request) response = str(response, encoding= 'utf-8' ) relsult = json.loads(response) return relsult # 更新記錄 def updateDomainRecord(client,value,rr,record_id): request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() request.set_accept_format( 'json' ) # request.set_Priority('1') request.set_TTL( '600' ) request.set_Value(value) # 新的ip地址 request.set_Type( 'A' ) request.set_RR(rr) request.set_RecordId(record_id) # 更新記錄需要指定 record_id ,該字段為記錄的唯一標識,可以在獲取方法的返回信息中得到該字段的值 response = client.do_action_with_exception(request) response = str(response, encoding= 'utf-8' ) return response # 刪除記錄 def delDomainRecord(client,subdomain): info = getDomainInfo(subdomain) if info[ 'TotalCount' ] == 0: print( '沒有相關的記錄信息,刪除失?。?#39; ) elif info[ "TotalCount" ] == 1: print( '準備刪除記錄' ) request = DeleteDomainRecordRequest.DeleteDomainRecordRequest() request.set_accept_format( 'json' ) record_id = info[ "DomainRecords" ][ "Record" ][0][ "RecordId" ] request.set_RecordId(record_id) # 刪除記錄需要指定 record_id ,該字段為記錄的唯一標識,可以在獲取方法的返回信息中得到該字段的值 result = client.do_action_with_exception(request) print( '刪除成功,返回信息:' ) print(result) else : # 正常不應該有多條相同的記錄,如果存在這種情況,應該手動去網站檢查核實是否有操作失誤 print( "存在多個相同子域名解析記錄值,請核查后再操作!" ) # 有記錄則更新,沒有記錄則新增 def setDomainRecord(client,value,rr,domainname): info = getDomainInfo(rr + '.' + domainname) if info[ 'TotalCount' ] == 0: print( '準備添加新記錄' ) add_result = addDomainRecord(client,value,rr,domainname) print(add_result) elif info[ "TotalCount" ] == 1: print( '準備更新已有記錄' ) record_id = info[ "DomainRecords" ][ "Record" ][0][ "RecordId" ] cur_ip = getIp() old_ip = info[ "DomainRecords" ][ "Record" ][0][ "Value" ] if cur_ip == old_ip: print ( "新ip與原ip相同,無法更新!" ) else : update_result = updateDomainRecord(client,value,rr,record_id) print( '更新成功,返回信息:' ) print(update_result) else : # 正常不應該有多條相同的記錄,如果存在這種情況,應該手動去網站檢查核實是否有操作失誤 print( "存在多個相同子域名解析記錄值,請核查刪除后再操作!" ) IP = getIp() # 循環子域名列表進行批量操作 for x in SubDomainList: setDomainRecord(client,IP,x,DomainName) # 刪除記錄測試 # delDomainRecord(client,'b.jsoner.com') # 新增或更新記錄測試 # setDomainRecord(client,'192.168.3.222','a',DomainName) # 獲取記錄測試 # print (getDomainInfo(DomainName, 'y')) # 批量獲取記錄測試 # for x in SubDomainList: # print (getDomainInfo(DomainName, x)) # 獲取外網ip地址測試 # print ('(' + getIp() + ')') |
可以將以上腳本保存為文件之后,通過定時任務,來實現定期自動更新ip地址,具體如何添加定時任務,系統不同,可能方法也不盡相同,這里就不多說明了。
說明
1,建議不要將刪除記錄添加進實際使用的腳本當中。
2,相同記錄是同一個子域名的多條記錄,比如 test.example.com。
腳本并沒有驗證記錄類型,所以同一子域名下的不同類型的記錄也會認為是相同記錄,比如:
有兩條記錄分別是 test.examlpe.com 的 A 記錄 和 test.examlpe.com 的 AAAA 記錄,會被認為是兩條相同的 test.example.com 記錄
可以通過判斷獲取記錄返回的 record_id 來實現精確匹配記錄,但我沒有這樣的需求,也就沒有花時間去寫。
到此這篇關于如何通過阿里云實現動態域名解析DDNS的方法的文章就介紹到這了,更多相關阿里云動態域名解析DDNS內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/waylen/archive/2020/07/25/13375373.html