原文连接:http://xcoder.in/2014/09/20/lets-build-ourselves-ddns/javascript
一开始我在移动的宽带中。那个时候虽然还不是彻底的局域网,可是电信网络访问不了个人外网 IP。又由于我须要一个 DDNS 服务来维持个人 kacaka.ca(目前暂失效)。php
为了解决让电信网络也能访问个人 Web,因而我想到了免费 CDN 当中比较有名的 CloudFlare。并且它也有提供 API 让开发者本身开发经过他的服务解析域名的服务。html
再而后,去年的九月份,个人早期 Node.js 做品 dloucflare 发布了。因此就有了这个帖子。java
如今,我已经搬到电信了,而后旧版的貌似不能用了,由于 CloudFlare 貌似 API 都迁移到了 https
上面。而后我为了个人小伙伴们能访问我出租屋里的旧电脑,又重构了一遍这个项目。node
首先安装最新的 dlouc-flare
包:git
$ npm install dlouc-flare
而后去建立一个 DF 对象:github
var DloucFlare = require("dlouc-flare"); var df = DloucFlare.create("你的邮箱", "API KEY", "域名(不须要 www)");
CloudFlare 如何使用的话这里就很少作解释了,至于 API KEY 的话,能够在这里获取到。npm
而后调用 df.dynamicDomains
函数去把你这个域名下面的一些子域名加入你这个脚本的动态域名范畴当中:json
df.dynamicDomains([ "@", "www", "子域名3", "子域名4", ... ], 检测时间间隔);
其中
"@"
表明的是域名没有www
前缀的自己。检测时间间隔以毫秒为单位。api
事实上,你也能够自定义一个检测你当前主机的 IP 地址的函数(若是你不喜欢用包内的默认检测 IP 函数)。
只要你写一个函数:
function checkIp(callback) { // blahblah... callback(undefined, IP地址); }
而后覆盖掉默认的 IP 检测函数便可:
df.getIpFunction = checkIp;
最后保存退出并用 node
执行你的程序就行了,程序就会开始欢快地跑了。
其实要彻底本身写也是很简单的——无非就是调用一下 CloudFlare 的 API 而已。
咱们定位明确就是要作 DDNS,因此不必关系其它不少不相关的 API,只须要最基础的几个就够了。
全部 API 的基础 URI 都为:https://www.cloudflare.com/api_json.html。
根据 CloudFlare 文档所说,全部的提交都要黏上验证信息给 POST 过去。而验证的字段以下:
其操做名为 rec_load_all
,咱们不关心其它不重要的参数,只须要再传一个 z
字段表明其域名就行了,举个例子:
var self = this; var param = { a : "rec_load_all", tkn : this.apiKey, email : this.email, z : this.domain }; var url = "https://www.cloudflare.com/api_json.html"; spidex.post(url, function(html, status) { if(status !== 200) { return callback(new Error("Error status while fetching DNS records.")); } var json; try { json = JSON.parse(html); } catch(e) { return callback(new Error("Error while parsing DNS records: " + e.message)); } if(json.result === "error") { var msg = json.msg; if(undefined === msg) msg = "Unknown error."; return callback(new Error(msg)); } else if(json.result === "success") { var count = json.response.recs.count; var objects = json.response.recs.objs; for(var i = 0; i < count; i++) { self.records.push(new DNSRecordObject(self, objects[i])); } callback(undefined, self.records); } else { callback(new Error("Unknown error.")); } }, param, "utf8").on("error", callback);
上述代码就是把 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 中我是这么作的:
var param = { a : "rec_edit", tkn : this.dloucflare.apiKey, email : this.dloucflare.email, id : this.recordId(), z : this.domain, type : this.recordType(), name : this.name, content : ip, service_mode : this.object.service_mode, ttl : this.object.ttl }; var self = this; spidex.post(config.baseUrl, function(html, status, respHeader) { if(status !== 200) { return callback(new Error("Error status while editing " + self.name + ".")); } var json; try { json = JSON.parse(html); } catch(e) { return callback(new Error("Error whileparsing editing result: " + e.message)); } if(json.result === "success") { self.object.content = ip; return callback(); } else { var msg = json.msg || "Unknown error."; return callback(new Error(msg)); } }, param, "utf8").on("error", callback);
上面的代码就能将你某个域名(
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 的动态域名等等等等。
喵~ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚