|
|
楼主 |
发表于 2023-10-30 11:44
|
显示全部楼层
脚本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: 未发生改变,无需更新!"
=============================================================
感谢 |
|