前言
該腳本的代碼大部分是參考自阿里云的官方幫助文檔。
1, 腳本語(yǔ)言使用的是python, 我個(gè)人只是了解python,沒(méi)有太深入的知識(shí)功底
2, 腳本代碼我會(huì)盡量詳細(xì)地添加注釋說(shuō)明,有問(wèn)題歡迎留言交流,但回復(fù)可能不會(huì)那么及時(shí)。
前置條件
1、域名是在阿里云購(gòu)買的 (我的域名本身就是阿里云買的,其他的域名我沒(méi)有測(cè)試過(guò))
2、地址必須是公網(wǎng)地址,不然加了解析也沒(méi)有用 (這個(gè)不用多加解釋了)
安裝阿里云SDK
需要安裝三個(gè)SDK庫(kù),一個(gè)是阿里云核心SDK庫(kù),一個(gè)是阿里云域名SDK庫(kù),一個(gè)是DNS庫(kù)
阿里云核心SDK庫(kù):pip install aliyun-python-sdk-core
阿里云域名SDK庫(kù):pip install aliyun-python-sdk-domain
阿里云DNSSDK庫(kù):pip install aliyun-python-sdk-alidns
說(shuō)明:
1, 目前官方文檔上說(shuō)的是需要安裝前兩個(gè)SDK庫(kù),但我實(shí)測(cè)確定還需要第三個(gè)庫(kù)!
2, 如果你使用的是ubuntu系統(tǒng),并且同時(shí)有python2/python3和pip2/pip3,安裝時(shí)前面的命令請(qǐng)寫(xiě)清楚版本,特別是pip。 我的系統(tǒng)pip默認(rèn)是2.x,使用pip install xxx 命令安裝的庫(kù)無(wú)效,使用 pip3 install xxx 才成功(如果知道如何隨意切換python和pip版本,請(qǐng)留言告知,感謝)。
腳本的具體功能
1, 獲取外網(wǎng)ip地址
2,獲取域名解析記錄
3,新增域名解析記錄
3,更新域名解析記錄
4,刪除域名解析記錄 (并不建議將該功能添加在實(shí)際腳本中)
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 # 加載內(nèi)置模塊 import json,urllib # AccessKey 和 Secret 建議使用 RAM 子賬戶的 KEY 和 SECRET 增加安全性 ID = 'xxxxxxx' SECRET = 'xxxxxx' # 地區(qū)節(jié)點(diǎn) 可選地區(qū)取決于你的阿里云帳號(hào)等級(jí),普通用戶只有四個(gè),分別是杭州、上海、深圳、河北,具體參考官網(wǎng)API regionId = 'cn-hangzhou' # 配置認(rèn)證信息 client = AcsClient(ID, SECRET, regionId) # 設(shè)置主域名 DomainName = 'example.com' # 子域名列表 列表參數(shù)可根據(jù)實(shí)際需求增加或減少值 SubDomainList = [ 'a' , 'b' , 'c' ] # 獲取外網(wǎng)IP 三個(gè)地址返回的ip地址格式各不相同,3322 的是最純凈的格式, 備選1為 json格式 備選2 為curl方式獲取 兩個(gè)備選地址都需要對(duì)獲取值作進(jìn)一步處理才能使用 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' ) # 設(shè)置要查詢的記錄類型為 A記錄 官網(wǎng)支持A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL隱性(顯性)轉(zhuǎn)發(fā) 如果有需要可將該值配置為參數(shù)傳入 request.set_Type( "A" ) # 指定查記的域名 格式為 'test.example.com' request.set_SubDomain(SubDomain) response = client.do_action_with_exception(request) response = str(response, encoding= 'utf-8' ) # 將獲取到的記錄轉(zhuǎn)換成json對(duì)象并返回 return json.loads(response) # 新增記錄 (默認(rèn)都設(shè)置為A記錄,通過(guò)配置set_Type可設(shè)置為其他記錄) def addDomainRecord(client,value,rr,domainname): request = AddDomainRecordRequest.AddDomainRecordRequest() request.set_accept_format( 'json' ) # request.set_Priority('1') # MX 記錄時(shí)的必選參數(shù) request.set_TTL( '600' ) # 可選值的范圍取決于你的阿里云賬戶等級(jí),免費(fèi)版為 600 - 86400 單位為秒 request.set_Value(value) # 新增的 ip 地址 request.set_Type( 'A' ) # 記錄類型 request.set_RR(rr) # 子域名名稱 request.set_DomainName(domainname) #主域名 # 獲取記錄信息,返回信息中包含 TotalCount 字段,表示獲取到的記錄條數(shù) 0 表示沒(méi)有記錄, 其他數(shù)字為多少表示有多少條相同記錄,正常有記錄的值應(yīng)該為1,如果值大于1則應(yīng)該檢查是不是重復(fù)添加了相同的記錄 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 ,該字段為記錄的唯一標(biāo)識(shí),可以在獲取方法的返回信息中得到該字段的值 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( '沒(méi)有相關(guān)的記錄信息,刪除失敗!' ) elif info[ "TotalCount" ] == 1: print( '準(zhǔn)備刪除記錄' ) request = DeleteDomainRecordRequest.DeleteDomainRecordRequest() request.set_accept_format( 'json' ) record_id = info[ "DomainRecords" ][ "Record" ][0][ "RecordId" ] request.set_RecordId(record_id) # 刪除記錄需要指定 record_id ,該字段為記錄的唯一標(biāo)識(shí),可以在獲取方法的返回信息中得到該字段的值 result = client.do_action_with_exception(request) print( '刪除成功,返回信息:' ) print(result) else : # 正常不應(yīng)該有多條相同的記錄,如果存在這種情況,應(yīng)該手動(dòng)去網(wǎng)站檢查核實(shí)是否有操作失誤 print( "存在多個(gè)相同子域名解析記錄值,請(qǐng)核查后再操作!" ) # 有記錄則更新,沒(méi)有記錄則新增 def setDomainRecord(client,value,rr,domainname): info = getDomainInfo(rr + '.' + domainname) if info[ 'TotalCount' ] == 0: print( '準(zhǔn)備添加新記錄' ) add_result = addDomainRecord(client,value,rr,domainname) print(add_result) elif info[ "TotalCount" ] == 1: print( '準(zhǔn)備更新已有記錄' ) 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相同,無(wú)法更新!" ) else : update_result = updateDomainRecord(client,value,rr,record_id) print( '更新成功,返回信息:' ) print(update_result) else : # 正常不應(yīng)該有多條相同的記錄,如果存在這種情況,應(yīng)該手動(dòng)去網(wǎng)站檢查核實(shí)是否有操作失誤 print( "存在多個(gè)相同子域名解析記錄值,請(qǐng)核查刪除后再操作!" ) IP = getIp() # 循環(huán)子域名列表進(jìn)行批量操作 for x in SubDomainList: setDomainRecord(client,IP,x,DomainName) # 刪除記錄測(cè)試 # delDomainRecord(client,'b.jsoner.com') # 新增或更新記錄測(cè)試 # setDomainRecord(client,'192.168.3.222','a',DomainName) # 獲取記錄測(cè)試 # print (getDomainInfo(DomainName, 'y')) # 批量獲取記錄測(cè)試 # for x in SubDomainList: # print (getDomainInfo(DomainName, x)) # 獲取外網(wǎng)ip地址測(cè)試 # print ('(' + getIp() + ')') |
可以將以上腳本保存為文件之后,通過(guò)定時(shí)任務(wù),來(lái)實(shí)現(xiàn)定期自動(dòng)更新ip地址,具體如何添加定時(shí)任務(wù),系統(tǒng)不同,可能方法也不盡相同,這里就不多說(shuō)明了。
說(shuō)明
1,建議不要將刪除記錄添加進(jìn)實(shí)際使用的腳本當(dāng)中。
2,相同記錄是同一個(gè)子域名的多條記錄,比如 test.example.com。
腳本并沒(méi)有驗(yàn)證記錄類型,所以同一子域名下的不同類型的記錄也會(huì)認(rèn)為是相同記錄,比如:
有兩條記錄分別是 test.examlpe.com 的 A 記錄 和 test.examlpe.com 的 AAAA 記錄,會(huì)被認(rèn)為是兩條相同的 test.example.com 記錄
可以通過(guò)判斷獲取記錄返回的 record_id 來(lái)實(shí)現(xiàn)精確匹配記錄,但我沒(méi)有這樣的需求,也就沒(méi)有花時(shí)間去寫(xiě)。
到此這篇關(guān)于如何通過(guò)阿里云實(shí)現(xiàn)動(dòng)態(tài)域名解析DDNS的方法的文章就介紹到這了,更多相關(guān)阿里云動(dòng)態(tài)域名解析DDNS內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/waylen/archive/2020/07/25/13375373.html