找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 2577|回复: 12

[Router OS] 求ros cloudflare ddns ipv4脚本(搞定)

[复制链接]
发表于 2023-10-29 16:17 | 显示全部楼层 |阅读模式
本帖最后由 enshanhe 于 2023-11-1 10:12 编辑

各位大佬好。
求ros cloudflare ddns ipv4脚本
之前一直用ros脚本解析ddns到cloudflare,两年了从未出现问题。而且解析还挺快的,但从前天开始出现解析失败,脚本是在按时运行,但cf上ip不更新了。各位遇到同样问题吗?我在网上找了几个最近的脚本试用,都不更新ip,把我整懵圈了,是我的问题还是cf有什么变化?我的ros版本是7.11.2。先谢了


换以下脚本可以更新了:

==================================================================================================================
:local apiKey "apikeyapikeyapikeyapikeyapikeyapikeyapikeyapikey"
:local cfUser "youremail@address"
:local zoneID "zoneIdzoneIdzoneIdzoneIdzoneIdzoneId"
:local recordID "recordIDrecordIDrecordIDrecordIDrecordID"
:local domainName "example.com"

# Do not edit below

:local currentIP ([/tool fetch url="https://ifconfig.me/ip" mode=https output=user as-value]->"data")
:local cloudflareDNSIP [:resolve $domainName server=1.1.1.1];

:if ($currentIP != $cloudflareDNSIP) do={
  # If the IP has changed, update the Cloudflare record
  :log info ("Updating Cloudflare record. Old IP: " . $cloudflareDNSIP . " New IP: " . $currentIP);

  :local httpHeaders ("X-Auth-Email: " . $cfUser . "\r\nX-Auth-Key: " . $apiKey . "\r\nContent-Type: application/json")
  :local payload ("{\"type\":\"A\",\"name\":\"" . $domainName . "\",\"content\":\"" . $currentIP . "\",\"ttl\":120,\"proxied\":false}")

  /tool fetch mode=https url="https://api.cloudflare.com/client/v4/zones/$zoneID/dns_records/$recordID" http-method=put http-header=$httpHeaders http-data=$payload;
}

===================================================================================================================


更新是否成功请见ros log记录。供大家参考。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
发表于 2023-10-29 18:35 | 显示全部楼层
买个域名一年几块那种,做dnspod,v4 v6都可以解析

点评

dnspod V4 V6麻烦给下脚本,谢谢。  详情 回复 发表于 2024-7-20 20:48
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-10-29 20:07 | 显示全部楼层
把原来的脚本调试一下,改一改应该可以
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-10-30 08:51 | 显示全部楼层
把你现在用的贴出来

点评

脚本1: :local dateTime ([ / system clock get date ] . " " . [ / system clock get time ]); :local cfzoneid "19kujsmkuauaj97733nn3m" :local cfdnsrecordid "66168amjspeoe8mjjjmmmff9406b896f410a" :local  详情 回复 发表于 2023-10-30 11:44
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-30 11:44 | 显示全部楼层
mantouboji 发表于 2023-10-30 08:51
把你现在用的贴出来

脚本1:
:local dateTime ([ / system clock get date ] . " " . [ / system clock get time ]);

:local cfzoneid "19kujsmkuauaj97733nn3m"
:local cfdnsrecordid "66168amjspeoe8mjjjmmmff9406b896f410a"
:local cftoken "5188jjjhyyinwjamskeuennkia983"
:local cfemail "xxxx@vip.163.com"
:local cfdnshost "xxxx.xxxxx.top"

:local publicinterface "pppoe-out1"
:local ipddns [:resolve $cfdnshost server=1.1.1.1]
:local ipfresh [ /ip address get [/ip address find interface=$publicinterface ] address ]
:set ipfresh [:pick $ipfresh 0 [:find $ipfresh "/" -1]]

:local cfurl "https://api.cloudflare.com/client/v4/zones/$cfzoneid/dns_records/$cfdnsrecordid"
:local cfDataDNS "{\"type\":\"A\",\"name\":\"$cfdnshost\",\"content\":\"$ipfresh\",\"ttl\":60,\"proxied\":false,\"comment\":\"last update: $dateTime\"}"
:local cfHeader "X-Auth-Email: $cfemail,Authorization: $cftoken,Content-Type: application/json"

:if ($ipddns != $ipfresh) do={
   /tool fetch url=$cfurl http-data=$cfDataDNS http-header-field=$cfHeader http-method=put keep-result=no mode=http
}
=============================================================
脚本2
################# CloudFlare 变量 #################
# 是否开启debug调试模式
:local CFDebug "false"
# 是否开启CFcloud功能
:local CFcloud "false"

# 修改为有公网IP的接口名称
:global WANInterface "pppoe-out1"

# 修改为你要ddns的域名,若是二级域名,这里填写完整的二级域名
:local CFdomain "xxxx.xxxxx.top"

# CloudFlare 全局密钥token或者有权限操作解析域名的token
:local CFtkn "5188jjjhyyinwjamskeuennkia983"

# 域名zoneId
:local CFzoneid "19kujsmkuauaj97733nn3m"
# 要ddns的域名记录id"66168amjspeoe8mjjjmmmff9406b896f410a"
:local CFid "66168amjspeoe8mjjjmmmff9406b896f410a"

# 记录类型 一般无需修改
:local CFrecordType ""
:set CFrecordType "A"

# 记录ttl值,一般无需修改
:local CFrecordTTL ""
:set CFrecordTTL "120"

#########################################################################
########################  下面的内容请勿修改 ############################
#########################################################################

:log info "开始更新解析记录 $CFDomain ..."

################# 内部变量 variables #################
:local previousIP ""
:global WANip ""

################# 构建 CF API Url (v4) #################
:local CFurl "https://api.cloudflare.com/client/v4/zones/"
:set CFurl ($CFurl . "$CFzoneid/dns_records/$CFid");

################# 获取或设置以前的ip变量 #################
:if ($CFcloud = "true") do={
    :set WANip [/ip cloud get public-address]
};

:if ($CFcloud = "false") do={
    :local currentIP [/ip address get [/ip address find interface=$WANInterface ] address];
    :set WANip [:pick $currentIP 0 [:find $currentIP "/"]];
};

:if ([/file find name=ddns.tmp.txt] = "") do={
    :log error "没有找到记录前一个公网IP地址的文件, 自动创建..."
    :set previousIP $WANip;
    :execute script=":put $WANip" file="ddns.tmp";
    :log info ("CF: 开始更新解析记录, 设置 $CFDomain = $WANip")
    /tool fetch http-method=put mode=https output=none url="$CFurl" http-header-field="Authorization:Bearer $CFtkn,content-type:application/json" http-data="{\"type\":\"$CFrecordType\",\"name\":\"$CFdomain\",\"ttl\"CFrecordTTL,\"content\":\"$WANip\"}"
    :error message="没有找到前一个公网IP地址的文件."
} else={
    :if ( [/file get [/file find name=ddns.tmp.txt] size] > 0 ) do={
    :global content [/file get [/file find name="ddns.tmp.txt"] contents] ;
    :global contentLen [ :len $content ] ;  
    :global lineEnd 0;
    :global line "";
    :global lastEnd 0;   
            :set lineEnd [:find $content "\n" $lastEnd ] ;
            :set line [:pick $content $lastEnd $lineEnd] ;
            :set lastEnd ( $lineEnd + 1 ) ;   
            :if ( [:pick $line 0 1] != "#" ) do={   
                #:local previousIP [:pick $line 0 $lineEnd ]
                :set previousIP [:pick $line 0 $lineEnd ];
                :set previousIP [:pick $previousIP 0 [:find $previousIP "\r"]];
            }
    }
}

######## 将调试信息写入日志 #################
:if ($CFDebug = "true") do={
:log info ("CF: 域名 = $CFdomain")
:log info ("CF: 前一个解析IP地址 = $previousIP")
:log info ("CF: 当前IP地址 = $currentIP")
:log info ("CF: 公网IP = $WANip")
:log info ("CF: 请求CFurl = $CFurl&content=$WANip")
:log info ("CF: 执行命令 = \"/tool fetch http-method=put mode=https url=\"$CFurl\" http-header-field="Authorization:Bearer $CFtkn,content-type:application/json" output=none http-data=\"{\"type\":\"$CFrecordType\",\"name\":\"$CFdomain\",\"ttl\"CFrecordTTL,\"content\":\"$WANip\"}\"")
};
  
######## 比较并更新记录 #####
:if ($previousIP != $WANip) do={
:log info ("CF: 开始更新解析记录, 设置 $CFDomain = $WANip")
/tool fetch http-method=put mode=https url="$CFurl" http-header-field="Authorization:Bearer $CFtkn,content-type:application/json" output=none http-data="{\"type\":\"$CFrecordType\",\"name\":\"$CFdomain\",\"ttl\"CFrecordTTL,\"content\":\"$WANip\"}"
/ip dns cache flush
    :if ( [/file get [/file find name=ddns.tmp.txt] size] > 0 ) do={
        /file remove ddns.tmp.txt
        :execute script=":put $WANip" file="ddns.tmp"
    }
} else={
:log info "CF: 未发生改变,无需更新!"
=============================================================

感谢
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-11-3 15:09 | 显示全部楼层
请问 local recordID 这个在哪里看?还有就是api可以用全局的吗?

点评

获取cf record id: curl -X GET "https://api.cloudflare.com/client/v4/zones/xxxxxxxxxx/dns_records" -H "X-Auth-Email:xxxx@.163.com" -H "X-Auth-Key: xxxxxxxxxxxxxx" -H "Content-Type: application/json" |  详情 回复 发表于 2023-11-3 17:17
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-3 17:17 | 显示全部楼层
longshij 发表于 2023-11-3 15:09
请问 local recordID 这个在哪里看?还有就是api可以用全局的吗?

获取cf record id:
curl -X GET "https://api.cloudflare.com/client/v4/zones/xxxxxxxxxx/dns_records" -H "X-Auth-Email:xxxx@.163.com" -H "X-Auth-Key: xxxxxxxxxxxxxx" -H "Content-Type: application/json" | python3 -mjson.tool
在linux终端上运行,注意python

全局api可以

点评

谢谢大佬,好人好报!  详情 回复 发表于 2023-11-3 22:30
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-11-3 22:30 | 显示全部楼层
enshanhe 发表于 2023-11-3 17:17
获取cf record id:
curl -X GET "https://api.cloudflare.com/client/v4/zones/xxxxxxxxxx/dns_records" ...

谢谢大佬,好人好报!
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-11-10 18:32 | 显示全部楼层
dengdechao 发表于 2023-10-29 18:35
买个域名一年几块那种,做dnspod,v4 v6都可以解析

Aliyun有文档吗
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-12 21:01 | 显示全部楼层
有搞定吗?我也在找这个,目前的脚本都不行,只能找个linux脚本挂在pve定时运行ddns
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-12 21:46 | 显示全部楼层
github上那个就很好用 https://github.com/mike6715b/Mikrotik_CF_DDNS
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-20 20:48 | 显示全部楼层
dengdechao 发表于 2023-10-29 18:35
买个域名一年几块那种,做dnspod,v4 v6都可以解析

dnspod V4 V6麻烦给下脚本,谢谢。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-9-23 15:58 | 显示全部楼层
感谢大佬
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-9-28 07:02

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表