<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="新建ROS的DNSPOD脚本更新项目(2020/12/21更新)">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">熊茂祥</a><br />时间:2020-12-21 20:25<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">ROS</a><br />标签:<a href="index.php?action=tags&amp;item=dns&amp;hash=">dns</a>, <a href="index.php?action=tags&amp;item=%E8%A7%A3%E6%9E%90&amp;hash=">解析</a>, <a href="index.php?action=tags&amp;item=ddns&amp;hash=">ddns</a>, <a href="index.php?action=tags&amp;item=ipv6&amp;hash=">ipv6</a>, <a href="index.php?action=tags&amp;item=%E5%8A%A8%E6%80%81&amp;hash=">动态</a><br />附件:<a href="index.php?action=downfile&amp;id=540&amp;hash=">ros对接dnspod直通版v4.txt</a>, <a href="index.php?action=downfile&amp;id=541&amp;hash=">ros对接dnspod直通版v5.txt</a><br />内容:





 

本项目完全免费公开脚本源码。


 


ROS的DNSPOD脚本更新：

1.可直接对接DNSPOD官方服务器进行更新。(无需借助任何第三方服务器，再也不用担心安全问题了！)

2.一个脚本可以支持IPV4和IPV6的DDNS更新，填补ROS目前IPV6的DDNS解决方案的空白。

3.检测子域名不存在时自动创建

4.支持域名使用V4+V6双栈，2个IP共用一个域名

5.增加日志记录流程

6.增加域名ID缓存功能，减少API交互次数


 


使用条件：

1.将ROS系统版本升级到6.45.6或更高，安装并启用IPV6组件。

 2.没有IPV6的环境，无需填写V6的域名。（mydomains4代表V4的域名，mydomains6代表V6的域名。可以是同一个域名开启双栈。）

3.子域名请尽量全部大于3位，如果子域名列表里同时存在1.x.com和11.x.com记录时会出现误判

4.使用V4V6同时更新的域名，顶级域名必须一致，否则会因为缓存域名ID导致后续更新失败

5.不要多个拨号接口引用这同一个PPP模板

6.由于目前V6并没有统一标准，环境不一定兼容，如发现异常可以与我联系排查。



更新时间：2020/12/21

更新内容：取消使用Domain.List相关API。不再调用出现过故障的keyword函数。



 


 


PHP代码


    ###程序执行完需要较长时间，请耐心等待，不要反复执行，建议放在PPP模板里ON-UP使用###  

    ###注意事项：子域名请尽量全部大于3位，如果子域名列表里同时存在1.x.com和11.x.com记录时会出现误判###  

    ###注意事项：使用V4V6同时更新的域名，顶级域名必须一致，否则会因为缓存域名ID导致后续更新失败###  

    ###定义必须变量#####  

    ###定义DNSPOD的TOKEN###  

    :local mytoken &quot;xxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;  

    ###定义自己的需更新域名(不需要更新的IP类型留空即可)###  

    :global mydomains4 &quot;abc4.123.com&quot;  

    :global mydomains6 &quot;abc6.123.com&quot;  

    ###定义自己的需更新的拨号接口###  

    :global myint &quot;pppoe-out1&quot;  

    ###以下内容无需修改###  

    ###预判断域名是否为双栈###  

    :global v4putex &quot;&quot;  

    :global v6putex &quot;&quot;  

    :if ($mydomains4 = $mydomains6) do={:log error &quot;检测到当前更新域名使用双栈。&quot;;:global v4putex &quot;&amp;offset=0&amp;length=1&quot;;:global v6putex &quot;&amp;offset=1&amp;length=1&quot;;}  

    :if ([:len $mydomains4] &gt;0) do={  

    ###开始IPV4获取工作，可自行按需调整###  

    :global mydomain41 [:pick $mydomains4 ([:find $mydomains4 &quot;.&quot;] +1) [:len $mydomains4]]  

    :global mydomain42 [:pick $mydomains4 0 [:find $mydomains4 &quot;.&quot;]]  

    :global myipv4 [/ip address get [find interface=$myint] address]  

    :set myipv4 [:pick $myipv4 0 [:find $myipv4 &quot;/&quot;]]  

    ###开始DNSPOD处理IPV4工作，以下请勿修改###  

    :log error &quot;DNSPOD脚本执行IPV4更新开始&quot;  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.List&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain41&amp;sub_domain=$mydomain42&amp;$v4putex&quot;]  

    :delay 5s  

    :global reprec [/file get [find name=&quot;Record.List&quot;] contents]  

    :if ([:len [:find $reprec &quot;u7a7a&quot;]] &gt;0) do={  

    /file remove [find name=&quot;Record.List&quot;]  

    :log error &quot;DNSPOD因为没有对应子域名，尝试自己NEW一个。&quot;  

    :global myipv4  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.Create&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain41&amp;sub_domain=$mydomain42&amp;value=$myipv4&amp;record_type=A&amp;record_line=%e9%bb%98%e8%ae%a4&quot; keep-result=no]  

    :delay 5s  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.List&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain41&amp;sub_domain=$mydomain42&quot;]  

    :delay 5s  

    :global reprec [/file get [find name=&quot;Record.List&quot;] contents]  

    }  

    :if ([:len [:find $reprec &quot;u6210&quot;]] &gt;0) do={  

    :global dnspodf [/file get [find name=&quot;Record.List&quot;] contents]  

    :global fdend [:find $dnspodf (&quot;\&quot;&quot;.$mydomain42.&quot;\&quot;&quot;)]  

    :global fdinfo [:pick $dnspodf 0 $fdend]  

    :while ([:len [:find $fdinfo &quot;{&quot;]] &gt; 0) do={  

    :global fdinfo [:pick $fdinfo ([:find $fdinfo &quot;{&quot;] +1) [:len $fdinfo]]}  

    :global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]  

    :global fdinfo [:pick $fdinfo 0 [:find $fdinfo &quot;\&quot;,&quot;]]  

    :global recordid $fdinfo  

    /file remove [find name=&quot;Record.List&quot;]  

    :global myipv4  

    :if ([:len [:find $dnspodf $myipv4]] &gt;0) do={  

    :log error (&quot;DNSPOD放弃更新，IPV4没有变化。&quot;)  

    } else={  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.Modify&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain41&amp;record_id=$recordid&amp;sub_domain=$mydomain42&amp;value=$myipv4&amp;record_type=A&amp;record_line=%e9%bb%98%e8%ae%a4&quot;]  

    :delay 5s  

    :global reprec [/file get [find name=&quot;Record.Modify&quot;] contents]  

    /file remove [find name=&quot;Record.Modify&quot;]  

    :if ([:len [:find $reprec &quot;u6210&quot;]] &gt;0) do={  

    :log error (&quot;DNSPOD更新IPV4成功。当前IPV4为:&quot;.myipv4)  

    } else={  

    :log error &quot;DNSPOD更新IPV4失败&quot;  

    }}}  

    :log error &quot;DNSPOD执行脚本IPV4更新完毕&quot;}  

    :if ([:len $mydomains6] &gt;0) do={  

    ###开始IPV6获取工作，可自行按需调整###  

    :global mydomain61 [:pick $mydomains6 ([:find $mydomains6 &quot;.&quot;] +1) [:len $mydomains6]]  

    :global mydomain62 [:pick $mydomains6 0 [:find $mydomains6 &quot;.&quot;]]  

    :global myipv6 [/ip address get [find interface=$myint] address]  

    :set myipv6 [:pick $myipv6 0 [:find $myipv6 &quot;/&quot;]]  

    ###有的朋友这里V6使用release会有问题，可更换为renew尝试，和运营商有关###  

    /ipv6 dhcp-client release [find interface=$myint]  

    :delay 3s  

    :global myipv6 [/ipv6 dhcp-client get [find interface=$myint status=bound] prefix]  

    :set myipv6 [:pick $myipv6 0 [:find $myipv6 &quot;/&quot;]]  

    ###开始DNSPOD处理IPV6工作，以下请勿修改###  

    :log error &quot;DNSPOD脚本执行IPV6更新开始&quot;  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.List&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain61&amp;sub_domain=$mydomain62&amp;$v6putex&quot;]  

    :delay 5s  

    :global reprec [/file get [find name=&quot;Record.List&quot;] contents]  

    :if ([:len [:find $reprec &quot;u7a7a&quot;]] &gt;0) do={  

    /file remove [find name=&quot;Record.List&quot;]  

    :log error &quot;DNSPOD因为没有对应子域名，尝试自己NEW一个。&quot;  

    :global myipv6  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.Create&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain61&amp;sub_domain=$mydomain62&amp;value=$myipv6&amp;record_type=AAAA&amp;record_line=%e9%bb%98%e8%ae%a4&quot; keep-result=no]  

    :delay 5s  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.List&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain61&amp;sub_domain=$mydomain62&quot;]  

    :delay 5s  

    :global reprec [/file get [find name=&quot;Record.List&quot;] contents]}  

    :if ([:len [:find $reprec &quot;u6210&quot;]] &gt;0) do={  

    :global dnspodf [/file get [find name=&quot;Record.List&quot;] contents]  

    :global fdend [:find $dnspodf (&quot;\&quot;&quot;.$mydomain62.&quot;\&quot;&quot;)]  

    :global fdinfo [:pick $dnspodf 0 $fdend]  

    :while ([:len [:find $fdinfo &quot;{&quot;]] &gt; 0) do={  

    :global fdinfo [:pick $fdinfo ([:find $fdinfo &quot;{&quot;] +1) [:len $fdinfo]]}  

    :global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]  

    :global fdinfo [:pick $fdinfo 0 [:find $fdinfo &quot;\&quot;,&quot;]]  

    :global recordid $fdinfo  

    /file remove [find name=&quot;Record.List&quot;]  

    :global myipv6  

    :if ([:len [:find $dnspodf $myipv6]] &gt;0) do={  

    :log error (&quot;DNSPOD放弃更新，IPV6没有变化。&quot;)  

    } else={  

    :do [/tool fetch url=&quot;https://dnsapi.cn/Record.Modify&quot; http-data=&quot;login_token=$mytoken&amp;format=json&amp;domain=$mydomain61&amp;record_id=$recordid&amp;sub_domain=$mydomain62&amp;value=$myipv6&amp;record_type=AAAA&amp;record_line=%e9%bb%98%e8%ae%a4&quot;]  

    :delay 5s  

    :global reprec [/file get [find name=&quot;Record.Modify&quot;] contents]  

    /file remove [find name=&quot;Record.Modify&quot;]  

    :if ([:len [:find $reprec &quot;u6210&quot;]] &gt;0) do={  

    :log error (&quot;DNSPOD更新IPV6成功。当前IPV6为:&quot;.myipv6)  

    } else={  

    :log error &quot;DNSPOD更新IPV6失败&quot;  

    }}}  

    :log error &quot;DNSPOD执行脚本IPV6更新完毕&quot;}    





 
</p><p>
<a href="index.php?action=comments&amp;articleid=235&amp;hash=">查看评论</a><br />
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
