RouterOS原生脚本实现DNSPOD的DDNS动态解析

我前面有文章《RouterOS利用DNSPOD的API接口实现DDNS动态解析》写过通过PHP服务器更新DNSPOD解析的域名IP,但是更多的是带来安全问题,所有这次写了一个RouterOS(以下简称ROS)的原生脚本来实现域名的动态解析。


脚本说明:

1. 不存在的记录,不会自动添加,需要手动在DNSPOD添加记录,线路为默认,不支持单记录多线路解析。

2. 只支持IPv4,不支持IPv6

3. 脚本中需要自己修改的信息

pppoe,拨号连接的名称,如pppoe-out1

token,dnspod的token。id和token之间用半角逗号连接(英文状态下的逗号)

domain,域名

subdomain,主机记录


版本更新:

1.0 beta  by 2019/11/13

1. 测试版本,有任何问题请留言。

2. 为什么不加自动了添加域名之类的,因为一次添加永久有效,所以脚本中不添加自动了。节省ROS性能(我懒)


脚本代码:

#PPPoE
:local pppoe "ADSL-PPPoE"

#DNSPOD token
:local token "xxxxx,xxxxxxxxxxxxxxxxxxx"

#域名
:local domain "myxzy.com"

#域名主机名
:local subdomain "www"

#以下不是专业人士请不要修改
#domain
:local dname ($subdomain.".".$domain)

#获取pppoe拨号ip
:local ipaddr [/ip address get [/ip address find interface=$pppoe] address]
:set ipaddr [:pick $ipaddr 0 ([len $ipaddr] -3)]

#获取域名列表
:local record [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$token&format=json&domain=$domain&sub_domain=$subdomain&record_type=A" as-value output=user]

#获取id和ip
:set record ($record->"data")
:set record [:pick $record [:find $record "\"records\":"] [:len $record]]
:local recordid [:pick $record ([:find $record "\"id\":\""]+6) [:find $record "\",\"ttl"]]
:local recordip [:pick $record ([:find $record "\"value\":\""]+9) [:find $record "\",\"en"]]

#更新ip地址
:if ($recordip!=$ipaddr) do={
/tool fetch url="https://dnsapi.cn/Record.Ddns" http-data="login_token=$token&format=json&domain=$domain&sub_domain=$subdomain&record_id=$recordid&record_line_id=0&value=$ipaddr"
:log info ("[".$dname."] ip update")
} else={
:log info ("[".$dname."] ip not update")
}
  • 下载列表

目前有 5 条评论

avatar

游客3027407672  2019-11-24 20:48 2楼

谢谢大神,问题解决了,不过代码还有待改进,期待大神代码开源,进一步学习谢谢! 回复
avatar

星之宇  2019-11-24 20:48

@游客3027407672:这个已经开源啊,你可以看到github的连接。 回复
avatar

游客3027407672  2019-11-24 20:51

@星之宇:哦,已经开源了啊,好的,马上去看下,看到大神之前的ros脚本后我找到了我脚本里面的错误。 回复
avatar

游客3027407672  2019-11-24 20:17 1楼

大神您好,根据你的ros脚本思路,我自己补上了php的代码,不过中间遇到个问题,想跟您请教下。
更新ip部分:通过http-data把参数传到服务器后,服务器接收到http-data的参数,您是用什么方法接收的呢?我尝试用$_GET变量来接收,发现该变量只支持网页传输变量,形如http://xxxxx.xxxxx.xxx/xxxx.php?value=192.168.1.1的url在网页中运行是可以实现更新ip,可是在php命令行或者ros脚本中传完参数后,返回要么是参数无效,要么是格式不对。特此请教大神望答复,谢谢。 回复
avatar

星之宇  2019-11-24 20:18

@游客3027407672:http://www.myxzy.com/dnspod-api-php.html我有接口和代码,你自己去看。 回复
昵称
邮箱
主页
提交
订阅