一開始我在移動的寬帶中。那個時候雖然還不是完全的局域網,但是電信網絡訪問不了我的外網 IP。又因爲我需要一個 DDNS 服務來維持我的 kacaka.ca(目前暫失效)。
爲了解決讓電信網絡也能訪問我的 Web,於是我想到了免費 CDN 當中比較有名的 CloudFlare。而且它也有提供 API 讓開發者自己開發通過他的服務解析域名的服務。
再然後,去年的九月份,我的早期 Node.js 作品 dloucflare 發佈了。所以就有了這個帖子。
現在,我已經搬到電信了,然後舊版的貌似不能用了,因爲 CloudFlare 貌似 API 都遷移到了 https
上面。然後我爲了我的小夥伴們能訪問我出租屋裏的舊電腦,又重構了一遍這個項目。
首先安裝最新的 dlouc-flare
包:
1 | $ npm install dlouc-flare |
然後去創建一個 DF 對象:
1 | var DloucFlare = require("dlouc-flare"); |
CloudFlare 如何使用的話這裏就不多做解釋了,至於 API KEY 的話,可以在這裏獲取到。
然後調用 df.dynamicDomains
函數去把你這個域名下面的一些子域名加入你這個腳本的動態域名範疇當中:
1 | df.dynamicDomains([ "@", "www", "子域名3", "子域名4", ... ], 檢測時間間隔); |
其中
"@"
代表的是域名沒有www
前綴的本身。檢測時間間隔以毫秒爲單位。
事實上,你也可以自定義一個檢測你當前主機的 IP 地址的函數(如果你不喜歡用包內的默認檢測 IP 函數)。
只要你寫一個函數:
1 | function checkIp(callback) { |
然後覆蓋掉默認的 IP 檢測函數即可:
1 | df.getIpFunction = checkIp; |
最後保存退出並用 node
執行你的程序就好了,程序就會開始歡快地跑了。
其實要完全自己寫也是很簡單的——無非就是調用一下 CloudFlare 的 API 而已。
我們定位明確就是要做 DDNS,所以沒必要關係其它很多不相關的 API,只需要最基礎的幾個就夠了。
所有 API 的基礎 URI 都爲:https://www.cloudflare.com/api_json.html。
根據 CloudFlare 文檔所說,所有的提交都要黏上驗證信息給 POST 過去。而驗證的字段如下:
其操作名爲 rec_load_all
,我們不關心其它不重要的參數,只需要再傳一個 z
字段代表其域名就好了,舉個例子:
1 | var self = this; |
上述代碼就是把 param
數據給 POST 到 API 的 RESTful 裏面去。然後根據返回值進行解析。
關於
DNSRecordObject
的代碼可以自行翻閱這裏。以及 spidex 的文檔在這裏。
其操作名爲 rec_edit
,如文檔所說,除了固有的幾個參數之外,我們還需要有如下參數:
z:
域名。id:
域名記錄編號,從 rec_load_all
中獲取。type:
記錄類型。如 A
/ CNAME
等等。name:
子域名名,如果無前綴子域名則與域名相同。content:
值。如果我們只是做動態域名的話,這裏的值就是 IP。service_mode:
服務類型,填原值即可。ttl
: TTL,填原值即可。上面參數的解說只是對於我們要做 DDNS 腳本而言的解釋。
所以說在 dnsrecordobject.js 中我是這麼做的:
1 | var param = { |
上面的代碼就能將你某個域名(
this.domain
)下的子域名this.name
的 IP 給修改成ip
了。
這種 API 網上就多了去了。
舉個簡單的例子,我的 dlouc-flare
的獲取 IP 的 API 就是從
來的。
請求上面的地址之後,輸出的內容(注意有換行符)就是你當前機子所在的網絡的公網 IP 了。
類似的 API 還有很多:
有了上面的仨 API,一切都好說了,流程很簡單:
CloudFlare
解析的域名下的子域名。有了上面的幾個步驟,加上之前我們講的幾個 API,大家就能輕鬆加愉快地完成自己的 DDNS 腳本了。
當然,如果自己懶的話也可以用本文一開始的方法,使用 dlouc-flare
這個包,通過簡單的編碼就能實現自己的 DDNS 動態域名腳本了。
這裏的定時器時間自己按需而定,就我自己而言,我是給設置了
1000 * 60
毫秒的間隔。
最早與動態域名結緣的時候是初中的時候,大概七八年前了吧,那個時候花生殼什麼的,但是最終用的是 3322.org
。
其實基本的動態域名的原理很簡單,無非就是本地開一個腳本,不停去探測本機 IP,一旦有變化就去解析服務器修改。
本人在這裏拋磚引玉。如果哪裏有別的解析商的 API,大家自己也可以舉一反三,寫什麼 DNSPod 的動態域名,寫什麼 jiasule 的動態域名等等等等。
喵~ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚