python3對接godaddy API,實(shí)現(xiàn)自動更改域名解析(DDNS)
python3對接godaddy API,實(shí)現(xiàn)自動更改域名解析(DDNS)
文章開始前,先解釋下如下問題:
①什么是域名解析?
域名解析一般是指通過一個(gè)域名指向IP地址(A解析),然后我們訪問這個(gè)域名就可以有直接訪問這個(gè)IP地址的效果,只需要記住域名即可,無需記住IP。
②什么是DDNS?
DDNS是動態(tài)域名解析,一個(gè)域名可以根據(jù)IP的變化,自動修正解析,無論設(shè)備的IP地址怎么變化,這個(gè)域名將一直指向?qū)?yīng)的設(shè)備。
③有什么用?
動態(tài)域名解析廣泛應(yīng)用于家庭網(wǎng)絡(luò),因?yàn)榧彝ゾW(wǎng)絡(luò)的IP地址是動態(tài)的,每次重啟貓,都會造成IP地址變化。如果想要通過外網(wǎng)穩(wěn)定訪問(不一定是web訪問)家里的設(shè)備,就需要使用動態(tài)域名解析,現(xiàn)在用的比較廣泛的是花生殼DDNS。
④為什么要用godaddy?
首先godaddy提供更改域名解析的API,其次godaddy是世界上最大的域名服務(wù)商,再次,國內(nèi)其他的運(yùn)營商都是不提供API。沒有API的情況下,就需要通過定時(shí)登錄獲取cookie,然后再模擬更改域名的網(wǎng)頁操作,post數(shù)據(jù)到服務(wù)器。
(因平臺原因本文中www即為xxx ,zzz即為zzz,cccc/ccccc即為cccc/ccccc)
?
前言
?使用python3監(jiān)控公網(wǎng)地址,然后上報(bào)給服務(wù)器,服務(wù)器再修改反代理/發(fā)郵件通知用戶。由于最近使用遠(yuǎn)程桌面比較多,每次遠(yuǎn)程前都要打開郵箱找最近的一次公網(wǎng)地址變更記錄。于是想如果可以實(shí)現(xiàn)動態(tài)域名解析呢?這樣申請一個(gè)域名,隨時(shí)都指向最新的IP地址
目前有的域名解析運(yùn)營商域名解析,每次post成功數(shù)據(jù),解析修改完了,賬號就被限制登錄了。因?yàn)檫@種post是完全模擬網(wǎng)頁操作,可能被檢測到了,然后就封號。?

?
可以直接更改一個(gè)域名的所有解析記錄。
操作步驟:?
一、gou買一個(gè)域名
如果你有域名了,那這一步操作可以忽略掉。
詳細(xì)步驟不說了,很簡單,注冊一個(gè)godaddy賬戶,然后搜索你想要的域名。遇到申請下來后點(diǎn)DNS,可以看到域名解析的記錄:

?
二、獲取API的key
key是用來認(rèn)證賬戶身份的,和瀏覽器的cookie一樣,不同的是cookie會過期,而key可以永久不過期。在一段請求中,只要在頭部包含這個(gè)key,就可以讓服務(wù)器認(rèn)定你的身份。
key申請:ccccc://developer.godaddy.com/keys? 登錄賬戶,點(diǎn)網(wǎng)頁右上角的“cereate new API key”,隨便命名,環(huán)境選擇?production:
?

它會給你一個(gè)公鑰key,和一個(gè)私鑰secret,復(fù)制下來保存好:
?

?
三、文檔中更改域名解析put的用法
地址:ccccc://developer.godaddy.com/doc/endpoint/domains#/v1/recordReplace
?

可以看到,需要提供的參數(shù)是domain,還有records。domain就是我們需要修改解析的域名,如本文domain就是xxserver.me。records就是put請求向?yàn)g覽器發(fā)送的參數(shù),里面有data、name、prot等參數(shù)。其中要用到的有以下幾個(gè)參數(shù):
data :解析記錄。如將www解析到3.3.3.3,那么data就是3.3.3.3
name :解析名。就是所說的域名前綴,如xxx.xxserver.me,name(解析名)就是www,如果為@則表示為空
ttl :域名解析生效時(shí)間。域名解析提交后,多久才能生效,當(dāng)然越短越好,最短600
type:解析類型。?一般用A解析,將一個(gè)域名指向一個(gè)IP地址。
records的數(shù)據(jù)以json形式傳遞。我們試一下填寫數(shù)據(jù),看官方為我們生成請求的格式:
?

生成格式:
?

這是一個(gè)linux的curl格式,我們需要把它轉(zhuǎn)成python3格式。從官方生成的請求格式中可以看到,請求類型為put,-H后面為headers(請求頭),包含accept、content-type、authorization。其中accept是請求返回接收的數(shù)據(jù)格式,content-type是發(fā)送的數(shù)據(jù)格式,authorization是用戶認(rèn)證(API秘鑰),格式為:sso-key 你的key:你的secret,請求:ccccc://api.godaddy.com/v1/domains/xxserver.me/records?(正式環(huán)境去掉ote)
?
四、使用python3實(shí)現(xiàn)
這里我們實(shí)際操作一下,通過API,將xxserver.me這個(gè)域名(沒有前綴,解析名為@)直接定向到IP地址:5.5.5.5。詳細(xì)解釋已經(jīng)注釋在代碼里了
#導(dǎo)入需要的模塊import?urllib.requestimport?json
?
這里做個(gè)示范,讀取用戶輸入
?
ip_addr?=?input(str('輸入IP地址:'))
?
定義請求地址
?
api_url?=?'ccccc://api.godaddy.com/v1/domains/xxserver.me/records';
?
直接做一個(gè)函數(shù),傳入API地址和更改的IP
?
def?update_NS(api_url,ip_addr):
????#定義http請求頭
????head?=?{}
????#定義服務(wù)器返回json數(shù)據(jù)給我們
????head['Accept']?=?'application/json'
????#定義我們發(fā)送的數(shù)據(jù)為json
????head['Content-Type']?=?'application/json'
????#定義身份認(rèn)證信息
????head['Authorization']?=?'sso-key?xxxxxxxxx你的key?xxxxxxxxx:xxxxxxxxxx你的secret?xxxxxxxxxx'
?
????#定義解析記錄
????records_a?=?{
????"data"?:?ip_addr,
????"name"?:?"@",
????"ttl"?:?600,
????"type"?:?'A',
????}
????#下面這兩個(gè)必須包含,不可更改
????records_NS01?=?{
????"data"?:?"ns07.domaincontrol.com",
????"name"?:?"@",
????"ttl"?:?3600,
????"type"?:?"NS",
????}
?
????records_NS02?=?{
????"data"?:?"ns08.domaincontrol.com",
????"name"?:?"@",
????"ttl"?:?3600,
????"type"?:?"NS",
????}
????#定義需要發(fā)送給服務(wù)器的數(shù)據(jù)為put_data這個(gè)列表,包含上面的解析記錄
????put_data?=?[records_a,records_NS01,records_NS02]
?
????#錯(cuò)誤處理
????try:
????????#定義請求,包含請求地址,請求頭,請求方式,并把put_data從json轉(zhuǎn)換為字符串格式,再轉(zhuǎn)換成bytes
????????req?=?urllib.request.Request(api_url,headers?=?head,data?=?json.dumps(put_data).encode(),method?=?"PUT")
????????rsp?=?urllib.request.urlopen(req)
????????#根據(jù)官方文檔我們只需要知道服務(wù)器返回碼即可,200為成功,這里獲取服務(wù)器的返回碼
????????code?=?rsp.getcode()
????????#判斷是否成功
????????if?code?==?200:
????????????print('成功更改域名解析:'+ip_addr)
????????else:
????????????print('更改失敗!')
????#原諒我偷懶。官方有400/401/422等錯(cuò)誤,這里統(tǒng)一處理了
????except:
????????print('錯(cuò)誤!')
?
執(zhí)行一下函數(shù),并傳入請求地址和我們輸入的IP
?
update_NS(api_url,ip_addr)
執(zhí)行一下看看效果:


文中的監(jiān)測公網(wǎng)地址,實(shí)現(xiàn)自動更改解析記錄。以后就不要翻郵箱找IP啦。
?