让网维变得简单,快速,准确。拒绝浪费时间,解放出更多的时间陪陪家人。 注册 | 登陆

新建ROS的DNSPOD脚本更新项目(已发布)

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

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.由于目前V6并没有统一标准,环境不一定兼容,如发现异常可以与我联系排查。

 

ROS脚本
  1. ###程序执行完需要较长时间,请耐心等待,不要反复执行,建议放在PPP模板里ON-UP使用###  
  2. ###注意事项:子域名请尽量全部大于3位,如果子域名列表里同时存在1.x.com和11.x.com记录时会出现误判###  
  3. ###注意事项:使用V4V6同时更新的域名,顶级域名必须一致,否则会因为缓存域名ID导致后续更新失败###  
  4. ###定义必须变量#####  
  5. ###定义DNSPOD的TOKEN###  
  6. :global mytoken "xxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  
  7. ###定义自己的需更新域名(不需要更新V4或者V6,可以在对应域名位置留空)###  
  8. :global mydomains4 "xxx.mikrotik.app"  
  9. :global mydomains6 ""  
  10. ###定义自己的需更新的拨号接口###  
  11. :global myint "UNI"  
  12. ###以下内容无需修改###  
  13. ###预判断域名是否为双栈###  
  14. :global v4putex ""  
  15. :global v6putex ""  
  16. :if ($mydomains4 = $mydomains6do={:log error "检测到当前更新域名使用双栈。";:global v4putex "&offset=0&length=1";:global v6putex "&offset=1&length=1";}  
  17. :global domainid  
  18. :if ([:len $domainid] =0) do={:global cached 0;:log error "未获取到缓存的域名ID,执行域名ID获取步骤。";} else={:global cached 1;:log error "已获取到缓存的域名ID,跳过域名ID获取步骤。";}  
  19. :if ([:len $mydomains4] >0) do={  
  20. ###开始IPV4获取工作,可自行按需调整###  
  21. :global mydomain41 [:pick $mydomains4 ([:find $mydomains4 "."] +1) [:len $mydomains4]]  
  22. :global mydomain42 [:pick $mydomains4 0 [:find $mydomains4 "."]]  
  23. :global myipv4 [/ip address get [find interface=$myint] address]  
  24. :set myipv4 [:pick $myipv4 0 [:find $myipv4 "/"]]  
  25. ###开始DNSPOD处理IPV4工作,以下请勿修改###  
  26. :log error "DNSPOD脚本执行IPV4更新开始"  
  27. :global cached  
  28. :if ($cached !=1) do={
  29. :delay 2s
  30. :do [/tool fetch url="https://dnsapi.cn/Domain.List" http-data="login_token=$mytoken&format=json&keyword=$mydomain41"]  
  31. :delay 5s 
  32. :global dnspodf [/file get [find name="Domain.List"] contents]}  
  33. :if (([:len [:find $dnspodf "Action completed successful"]] >0) || ($cached != "")) do={  
  34. :if ($cached !=1) do={  
  35. :global mydomain41  
  36. :global dnspodf  
  37. :global fdend [:find $dnspodf $mydomain41]  
  38. :global fdinfo [:pick $dnspodf 0 $fdend]  
  39. :while ([:len [:find $fdinfo "{"]] > 0) do={  
  40. :global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}  
  41. :global fdinfo [:pick $fdinfo 5 [:len $fdinfo]]  
  42. :global fdinfo [:pick $fdinfo 0 [:find $fdinfo ","]]  
  43. :global domainid $fdinfo}  
  44. /file remove [find name="Domain.List"]  
  45. :global domainid  
  46. :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain42&$v4putex"]  
  47. :delay 5s  
  48. :global reprec [/file get [find name="Record.List"] contents]  
  49. :if ([:len [:find $reprec "No records"]] >0) do={  
  50. /file remove [find name="Record.List"]  
  51. :log error "DNSPOD因为没有对应子域名,尝试自己NEW一个。"  
  52. :global myipv4  
  53. :do [/tool fetch url="https://dnsapi.cn/Record.Create" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain42&value=$myipv4&record_type=A&record_line=%e9%bb%98%e8%ae%a4" keep-result=no]  
  54. :delay 5s  
  55. :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain42"]  
  56. :delay 5s  
  57. :global reprec [/file get [find name="Record.List"] contents]  
  58. }  
  59. :if ([:len [:find $reprec "Action completed successful"]] >0) do={  
  60. :global dnspodf [/file get [find name="Record.List"] contents]  
  61. :global fdend [:find $dnspodf ("\"".$mydomain42."\"")]  
  62. :global fdinfo [:pick $dnspodf 0 $fdend]  
  63. :while ([:len [:find $fdinfo "{"]] > 0) do={  
  64. :global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}  
  65. :global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]  
  66. :global fdinfo [:pick $fdinfo 0 [:find $fdinfo "\","]]  
  67. :global recordid $fdinfo  
  68. /file remove [find name="Record.List"]  
  69. :global myipv4  
  70. :if ([:len [:find $dnspodf $myipv4]] >0) do={  
  71. :log error ("DNSPOD放弃更新,IPV4没有变化。")  
  72. else={  
  73. :do [/tool fetch url="https://dnsapi.cn/Record.Modify" http-data="login_token=$mytoken&format=json&domain_id=$domainid&record_id=$recordid&sub_domain=$mydomain42&value=$myipv4&record_type=A&record_line=%e9%bb%98%e8%ae%a4"]  
  74. :delay 5s  
  75. :global reprec [/file get [find name="Record.Modify"] contents]  
  76. /file remove [find name="Record.Modify"]  
  77. :if ([:len [:find $reprec "Action completed successful"]] >0) do={  
  78. :log error ("DNSPOD更新IPV4成功。当前IPV4为:".myipv4)  
  79. else={  
  80. :log error "DNSPOD更新IPV4失败"  
  81. }}}} else={  
  82. :log error "DNSPOD更新IPV4失败,检查TOKEN,域名参数是否正确。"}  
  83. :log error "DNSPOD执行脚本IPV4更新完毕"}  
  84. :if ([:len $mydomains6] >0) do={  
  85. ###开始IPV6获取工作,可自行按需调整###  
  86. :global mydomain61 [:pick $mydomains6 ([:find $mydomains6 "."] +1) [:len $mydomains6]]  
  87. :global mydomain62 [:pick $mydomains6 0 [:find $mydomains6 "."]]  
  88. :global myipv6 [/ip address get [find interface=$myint] address]  
  89. :set myipv6 [:pick $myipv6 0 [:find $myipv6 "/"]]  
  90. ###有的朋友这里V6使用release会有问题,可更换为renew尝试,和运营商有关###  
  91. /ipv6 dhcp-client release [find interface=$myint]  
  92. :delay 3s  
  93. :global myipv6 [/ipv6 dhcp-client get [find interface=$myint status=bound] prefix]  
  94. :set myipv6 [:pick $myipv6 0 [:find $myipv6 "/"]]  
  95. ###开始DNSPOD处理IPV6工作,以下请勿修改###  
  96. :log error "DNSPOD脚本执行IPV6更新开始"  
  97. :global cached  
  98. :if ($cached !=1) do={  
  99. :do [/tool fetch url="https://dnsapi.cn/Domain.List" http-data="login_token=$mytoken&format=json&keyword=$mydomain61"]  
  100. :delay 5s  
  101. :global dnspodf [/file get [find name="Domain.List"] contents]}  
  102. :if (([:len [:find $dnspodf "Action completed successful"]] >0) || ($cached != "")) do={  
  103. :if ($cached !=1) do={  
  104. :global mydomain61  
  105. :global dnspodf  
  106. :global fdend [:find $dnspodf $mydomain61]  
  107. :global fdinfo [:pick $dnspodf 0 $fdend]  
  108. :while ([:len [:find $fdinfo "{"]] > 0) do={  
  109. :global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}  
  110. :global fdinfo [:pick $fdinfo 5 [:len $fdinfo]]  
  111. :global fdinfo [:pick $fdinfo 0 [:find $fdinfo ","]]  
  112. :global domainid $fdinfo}  
  113. /file remove [find name="Domain.List"]  
  114. :global domainid  
  115. :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain62&$v6putex"]  
  116. :delay 5s  
  117. :global reprec [/file get [find name="Record.List"] contents]  
  118. :if ([:len [:find $reprec "No records"]] >0) do={  
  119. /file remove [find name="Record.List"]  
  120. :log error "DNSPOD因为没有对应子域名,尝试自己NEW一个。"  
  121. :global myipv6  
  122. :do [/tool fetch url="https://dnsapi.cn/Record.Create" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain62&value=$myipv6&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4" keep-result=no]  
  123. :delay 5s  
  124. :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain_id=$domainid&sub_domain=$mydomain62"]  
  125. :delay 5s  
  126. :global reprec [/file get [find name="Record.List"] contents]}  
  127. :if ([:len [:find $reprec "Action completed successful"]] >0) do={  
  128. :global dnspodf [/file get [find name="Record.List"] contents]  
  129. :global fdend [:find $dnspodf ("\"".$mydomain62."\"")]  
  130. :global fdinfo [:pick $dnspodf 0 $fdend]  
  131. :while ([:len [:find $fdinfo "{"]] > 0) do={  
  132. :global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}  
  133. :global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]  
  134. :global fdinfo [:pick $fdinfo 0 [:find $fdinfo "\","]]  
  135. :global recordid $fdinfo  
  136. /file remove [find name="Record.List"]  
  137. :global myipv6  
  138. :if ([:len [:find $dnspodf $myipv6]] >0) do={  
  139. :log error ("DNSPOD放弃更新,IPV6没有变化。")  
  140. else={  
  141. :do [/tool fetch url="https://dnsapi.cn/Record.Modify" http-data="login_token=$mytoken&format=json&domain_id=$domainid&record_id=$recordid&sub_domain=$mydomain62&value=$myipv6&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4"]  
  142. :delay 5s  
  143. :global reprec [/file get [find name="Record.Modify"] contents]  
  144. /file remove [find name="Record.Modify"]  
  145. :if ([:len [:find $reprec "Action completed successful"]] >0) do={  
  146. :log error ("DNSPOD更新IPV6成功。当前IPV6为:".myipv6)  
  147. else={  
  148. :log error "DNSPOD更新IPV6失败"  
  149. }}}} else={  
  150. :log error "DNSPOD更新IPV6失败,检查TOKEN,域名参数是否正确。"}  
  151. :log error "DNSPOD执行脚本IPV6更新完毕"}  

 

附件: ros对接dnspod直通版v4.txt (7.75 K, 下载次数:85)

Tags: dns, 解析, ddns, ipv6, 动态

« 上一篇 | 下一篇 »

 

发表评论

评论内容 (必填):