├── start.sh ├── ip.txt ├── README.md ├── hk-1-443.txt ├── hk-0-80.txt ├── config.conf └── cf_ddns ├── cf_ddns_cloudflare.sh ├── cf_push.sh ├── cf_check.sh └── cf_ddns_dnspod.sh /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | source config.conf; 3 | 4 | source ./cf_ddns/cf_check.sh 5 | 6 | case $DNS_PROVIDER in 7 | 1) 8 | source ./cf_ddns/cf_ddns_cloudflare.sh 9 | ;; 10 | 2) 11 | source ./cf_ddns/cf_ddns_dnspod.sh 12 | ;; 13 | *) 14 | echo "未选择任何DNS服务商" 15 | ;; 16 | esac 17 | 18 | source ./cf_ddns/cf_push.sh 19 | 20 | exit 0; -------------------------------------------------------------------------------- /ip.txt: -------------------------------------------------------------------------------- 1 | 85.8.181.0/24 2 | 202.81.231.0/24 3 | 193.176.153.0/24 4 | 216.118.228.0/24 5 | 203.198.207.0/24 6 | 165.154.132.0/24 7 | 123.58.212.0/24 8 | 146.196.54.0/24 9 | 218.250.221.0/24 10 | 185.224.171.0/24 11 | 112.213.105.0/24 12 | 103.160.204.0/24 13 | 199.15.0.0/16 14 | 172.67.208.0/24 15 | 172.64.229.0/24 16 | 162.158.0.0/15 17 | 104.21.53.0/24 18 | 104.16.0.0/12 19 | 173.245.48.0/20 20 | 103.21.244.0/22 21 | 103.22.200.0/22 22 | 103.31.4.0/22 23 | 141.101.64.0/18 24 | 108.162.192.0/18 25 | 190.93.240.0/20 26 | 188.114.96.0/20 27 | 197.234.240.0/22 28 | 198.41.128.0/17 29 | 172.64.0.0/17 30 | 172.64.128.0/18 31 | 172.64.192.0/19 32 | 172.64.224.0/22 33 | 172.64.229.0/24 34 | 172.64.230.0/23 35 | 172.64.232.0/21 36 | 172.64.240.0/21 37 | 172.64.248.0/21 38 | 172.65.0.0/16 39 | 172.66.0.0/16 40 | 172.67.0.0/16 41 | 131.0.72.0/22 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CloudflareSpeedTestDDNS 2 | openwrt优选IP定时上传CF和dnspod 3 | 更多地区IP地址[下载](https://zip.baipiao.eu.org) 4 | # 食用说明 5 | v0.0.1 6 | 1.下载[CloudflareSpeedTest](https://github.com/XIU2/CloudflareSpeedTest/releases)只保留`ip.txt`和`CloudflareST` 7 | 2.下载[CloudflareSpeedTestDDNS](https://github.com/Jason6111/CloudflareSpeedTestDDNS/releases/download/0.0.1/CloudflareSpeedTestDDNS.zip) 8 | 3.将以上两个放到一个文件夹里上传到openwrt 9 | 4.安装所需插件`bash``jq``coreutils-timeout` 10 | 5.ssh连接openwrt进入对应目录chmod +x CloudflareST赋予权限 11 | 6.vi ip.sh 填写对应信息 12 | 6.1.点击网站-域名-区域ID-概述-右下角的区域ID 13 | 6.2.点击获取你的令牌-找到Global API Key-点击查看-验证密码后-将获取到的API密钥填入配置文件 14 | 7.bash ip.sh运行测试 15 | 8.openwrt设置定时计划例如`6 0 * * * cd /mnt/nvme0n1p4/ip && bash ip.sh` 16 | 17 | v0.0.2 18 | 1.下载[CloudflareSpeedTestDDNS](https://github.com/Jason6111/CloudflareSpeedTestDDNS/releases/download/0.0.2/CloudflareSpeedTestDDNS-0.0.2.zip)并上传openwrt 19 | 2.设置config.conf 20 | 3.bash start.sh运行测试 21 | 4.openwrt设置定时计划例如`6 0 * * * cd /mnt/nvme0n1p4/ip && bash start.sh` 22 | -------------------------------------------------------------------------------- /hk-1-443.txt: -------------------------------------------------------------------------------- 1 | 146.196.54.75 2 | 123.58.212.234 3 | 165.154.132.204 4 | 203.198.207.253 5 | 216.118.228.117 6 | 193.176.153.63 7 | 193.176.158.247 8 | 193.176.158.211 9 | 202.81.231.150 10 | 85.8.181.104 11 | 123.202.159.108 12 | 1.64.165.40 13 | 218.250.221.100 14 | 185.224.171.148 15 | 185.224.171.146 16 | 185.224.171.147 17 | 185.224.171.150 18 | 185.224.171.149 19 | 210.56.49.118 20 | 112.213.105.238 21 | 112.213.105.229 22 | 112.213.105.223 23 | 103.160.204.79 24 | 103.160.204.174 25 | 103.160.204.242 26 | 103.160.204.137 27 | 103.160.204.150 28 | 103.160.204.186 29 | 103.160.204.75 30 | 103.160.204.64 31 | 103.160.204.38 32 | 103.160.204.251 33 | 103.160.204.83 34 | 103.160.204.68 35 | 103.160.204.136 36 | 103.160.204.113 37 | 103.160.204.184 38 | 103.160.204.112 39 | 103.160.204.140 40 | 103.160.204.124 41 | 103.160.204.214 42 | 103.160.204.250 43 | 103.160.204.145 44 | 103.160.204.77 45 | 103.160.204.86 46 | 103.160.204.105 47 | 103.160.204.149 48 | 103.160.204.162 49 | 103.160.204.126 50 | 103.160.204.220 51 | 103.160.204.202 52 | 103.160.204.130 53 | 103.160.204.252 54 | 103.160.204.181 55 | 103.160.204.240 56 | 103.160.204.189 57 | 103.160.204.30 58 | -------------------------------------------------------------------------------- /hk-0-80.txt: -------------------------------------------------------------------------------- 1 | 193.176.179.105 2 | 103.160.204.103 3 | 103.160.204.170 4 | 103.160.204.229 5 | 103.160.204.155 6 | 103.160.204.239 7 | 103.160.204.219 8 | 103.160.204.2 9 | 103.160.204.68 10 | 103.160.204.119 11 | 103.160.204.53 12 | 103.160.204.253 13 | 103.160.204.87 14 | 103.160.204.198 15 | 103.160.204.156 16 | 103.160.204.214 17 | 103.160.204.233 18 | 103.160.204.197 19 | 103.160.204.183 20 | 103.160.204.57 21 | 103.160.204.193 22 | 103.160.204.244 23 | 103.160.204.59 24 | 103.160.204.199 25 | 103.160.204.210 26 | 103.160.204.149 27 | 103.160.204.105 28 | 103.160.204.205 29 | 103.160.204.49 30 | 103.160.204.113 31 | 103.160.204.200 32 | 103.160.204.234 33 | 103.160.204.213 34 | 103.160.204.190 35 | 103.160.204.128 36 | 103.160.204.227 37 | 103.160.204.54 38 | 103.160.204.20 39 | 103.160.204.93 40 | 103.160.204.180 41 | 103.160.204.19 42 | 103.160.204.72 43 | 103.160.204.131 44 | 103.160.204.38 45 | 103.160.204.166 46 | 103.160.204.46 47 | 103.160.204.207 48 | 103.160.204.25 49 | 103.160.204.89 50 | 103.160.204.106 51 | 103.160.204.162 52 | 103.160.204.34 53 | 103.160.204.78 54 | 103.160.204.146 55 | 103.160.204.75 56 | 103.160.204.109 57 | 103.160.204.161 58 | 103.160.204.249 59 | 103.160.204.48 60 | 103.160.204.176 61 | 103.160.204.150 62 | 103.160.204.61 63 | 103.160.204.208 64 | 103.160.204.41 65 | 103.160.204.44 66 | 103.160.204.9 67 | 103.160.204.90 68 | 103.160.204.158 69 | 103.160.204.142 70 | 103.160.204.209 71 | 103.160.204.182 72 | 103.160.204.217 73 | 103.160.204.74 74 | 103.160.204.42 75 | 103.160.204.63 76 | 103.160.204.174 77 | 103.160.204.0 78 | 103.160.204.56 79 | 103.160.204.102 80 | 103.160.204.111 81 | 103.160.204.121 82 | 103.160.204.120 83 | 103.160.204.147 84 | 103.160.204.202 85 | 103.160.204.242 86 | 103.160.204.254 87 | 103.160.204.245 88 | 103.160.204.12 89 | 103.160.204.51 90 | 103.160.204.16 91 | 103.160.204.116 92 | 103.160.204.179 93 | 103.160.204.98 94 | 103.160.204.151 95 | 103.160.204.225 96 | 103.160.204.168 97 | 103.160.204.248 98 | 103.160.204.247 99 | 103.160.204.140 100 | 103.160.204.33 101 | 103.160.204.64 102 | 103.160.204.45 103 | 103.160.204.194 104 | 103.160.204.65 105 | 103.160.204.223 106 | 103.160.204.77 107 | 103.160.204.189 108 | 103.160.204.29 109 | 103.160.204.96 110 | 103.160.204.92 111 | 103.160.204.159 112 | 103.160.204.10 113 | 103.160.204.192 114 | 103.160.204.24 115 | 103.160.204.100 116 | 103.160.204.135 117 | 103.160.204.124 118 | 103.160.204.172 119 | 103.160.204.181 120 | 103.160.204.58 121 | 103.160.204.36 122 | 103.160.204.99 123 | 103.160.204.201 124 | 103.160.204.241 125 | 103.160.204.188 126 | 103.160.204.115 127 | 103.160.204.178 128 | 103.160.204.144 129 | 103.160.204.143 130 | 103.160.204.23 131 | 103.160.204.211 132 | 103.160.204.91 133 | 103.160.204.221 134 | 103.160.204.43 135 | 103.160.204.108 136 | 103.160.204.133 137 | 103.160.204.203 138 | 103.160.204.6 139 | 103.160.204.95 140 | 103.160.204.112 141 | 103.160.204.196 142 | 103.160.204.117 143 | 103.160.204.84 144 | 103.160.204.40 145 | 103.160.204.39 146 | 103.160.204.94 147 | 103.160.204.129 148 | 103.160.204.169 149 | 103.160.204.27 150 | 103.160.204.175 151 | 103.160.204.47 152 | 103.160.204.22 153 | 103.160.204.228 154 | 103.160.204.235 155 | 103.160.204.71 156 | 103.160.204.184 157 | 103.160.204.123 158 | 103.160.204.252 159 | 103.160.204.21 160 | 103.160.204.138 161 | 103.160.204.5 162 | 103.160.204.62 163 | 103.160.204.4 164 | 103.160.204.104 165 | 103.160.204.240 166 | 103.160.204.28 167 | 103.160.204.165 168 | 103.160.204.232 169 | 103.160.204.18 170 | 103.160.204.97 171 | 103.160.204.154 172 | 103.160.204.187 173 | 103.160.204.148 174 | 103.160.204.152 175 | 103.160.204.216 176 | 103.160.204.236 177 | 103.160.204.30 178 | 103.160.204.35 179 | 103.160.204.160 180 | 103.160.204.79 181 | 103.160.204.212 182 | 103.160.204.50 183 | 103.160.204.101 184 | 152.32.239.228 185 | 152.32.207.95 186 | 210.3.205.142 187 | 202.81.231.150 188 | 202.81.231.234 189 | 185.224.171.147 190 | 185.211.133.110 191 | 185.211.133.109 192 | 113.252.171.4 193 | 223.19.157.54 194 | 219.78.193.12 195 | 219.78.233.112 196 | 218.250.221.100 197 | 1.36.16.245 198 | 1.64.165.40 199 | 146.196.54.75 200 | 112.120.5.16 201 | 113.252.34.222 202 | 163.53.18.170 203 | -------------------------------------------------------------------------------- /config.conf: -------------------------------------------------------------------------------- 1 | # 版本:V0.0.2 2 | # 更改文件结构。 3 | # 新增了dnspod DNS服务商支持。 4 | # 新增了docker版。docker版不能自动停止路由器的科学插件,请将docker配置到没有科学环境的设备使用。 5 | # 增加了pushdeer推送、企业微信推送、Server酱、Synology Chat。 6 | # 增加了更新到hosts模式 7 | # 8 | # 9 | #------------------------------------------工作模式配置--------------------------------------------- 10 | # --运行模式-- 11 | # ipv4 or ipv6 默认为:ipv4 12 | # 指定工作模式为ipv4还是ipv6。如果为ipv6,请在文件夹下添加ipv6.txt 13 | # ipv6.txt在CloudflareST工具包里,下载地址:https://github.com/XIU2/CloudflareSpeedTest/releases 14 | IP_ADDR=ipv4 15 | # 16 | # --是否使用反代ip-- 17 | # 是否使用优质CF反代ip地址进行优选 true=使用代理IP地址 false=不适用代理ip地址 默认为 false 18 | # CF反代ip地址调用ip-scanner/cloudflare仓库,每次运行本脚本都自动重新拉取。仓库地址:https://github.com/ip-scanner/cloudflare 19 | IP_PR_IP=false 20 | # 21 | # --是否同步更新到hosts-- 22 | # true=开启更新到hosts false=不更新到hosts 默认为 false 23 | IP_TO_HOSTS=false 24 | # 25 | # --选择DNS服务商-- 26 | # 选择DNS服务商后,需要下方对应服务商配置中补充完整 27 | # 1=cloudflare 2=dnspod 28 | DNS_PROVIDER=1 29 | # 30 | # --填写需要DDNS的完整域名-- 31 | # 支持多域名:域名需要填写在括号中,每个域名之间用“空格”相隔。 32 | # 例如:(cdn.test.com) 或者 (cdn1.test.com cdn2.test.com cdn3.test.com) 33 | hostname=() 34 | # 35 | #------------------------------------------cloudflare配置------------------------------------------ 36 | # --cloudflare账号邮箱-- 37 | x_email= 38 | # 39 | # --空间ID-- 40 | zone_id= 41 | # 42 | # --Global API Key-- 43 | api_key= 44 | # 45 | #------------------------------------------dnspod配置------------------------------------------ 46 | # --dnspod的id,token-- 47 | # API密钥-DNSPod Token(注意,不是腾讯云API密钥)-创建密钥,得到ID以及Token。填写格式为:"ID,Token" 48 | # 例如"123456,abcd123abcd123..." 49 | dnspod_token="" 50 | # 51 | # --选择线路-- 52 | # 0=默认,1=电信,2=联通,3=移动,4=铁通,5=广电,6=教育网,7=境内,8=境外 53 | LINE=0 54 | # 55 | #-----------------------------------openwrt科学上网插件配置------------------------------------------ 56 | # --优选节点时是否自动停止科学上网服务-- 57 | # true=自动停止 false=不停止 默认为 true 58 | pause=true 59 | # 60 | # --客户端代码-- 61 | # 填写openwrt使用的是哪个科学上网客户端,填写对应的“数字” 默认为 1 客户端为passwall 62 | # 1=passwall 2=passwall2 3=ShadowSocksR Plus+ 4=clash 5=openclash 6=bypass 63 | clien=1 64 | # 65 | # --延时执行-- 66 | # 填写重启科学上网服务后,需要等多少秒后才开始更新DNS 单位:秒 67 | # 根据自己的网络情况来填写 推荐 15 68 | sleepTime=15 69 | # 70 | #--------------------------------------CloudflareST配置--------------------------------------------- 71 | # --测速地址-- 72 | # 有自己的测速地址可替换,若不填写则使用默认地址 73 | CFST_URL=替换测试地址 74 | # 75 | # --测速线程数量-- 76 | # 越多测速越快,性能弱的设备 (如路由器) 请勿太高;(默认 200 最多 1000 ) 77 | CFST_N=200 78 | # 79 | # --延迟测速次数-- 80 | # 单个 IP 延迟测速次数,为 1 时将过滤丢包的IP,TCP协议;(默认 4 次 ) 81 | CFST_T=4 82 | # 83 | # --下载测速数量-- 84 | # 延迟测速并排序后,从最低延迟起下载测速的数量;(默认 6 个) 85 | CFST_DN=6 86 | # 87 | # --平均延迟上限-- 88 | # 只输出低于指定平均延迟的 IP,可与其他上限/下限搭配;(默认9999 ms 这里推荐配置250 ms) 89 | CFST_TL=250 90 | # 91 | # --平均延迟下限-- 92 | # 只输出高于指定平均延迟的 IP,可与其他上限/下限搭配、过滤假墙 IP;(默认 0 ms 这里推荐配置20) 93 | CFST_TLL=20 94 | # 95 | # --下载速度下限-- 96 | # 只输出高于指定下载速度的 IP,凑够指定数量 [-dn] 才会停止测速;(默认 0.00 MB/s 这里推荐1.00MB/s) 97 | CFST_SL=1 98 | # 99 | #------------------------------------------推送设置------------------------------------------------ 100 | # ----TG推送设置---- 101 | # (填写即为开启推送,未填写则为不开启) 102 | # 103 | # --TG机器人token-- 104 | # 例如:123456789:ABCDEFG... 105 | telegramBotToken= 106 | # 107 | # --用户ID或频道、群ID-- 108 | # 例如:123456789 109 | telegramBotUserId= 110 | # 111 | # --tg推送代理域名-- 112 | # 可用于本地没有科学环境,想要调用tgAPI需要自建反向代理API域名 113 | Proxy_TG= 114 | # 115 | # ----TG推送设置结束---- 116 | ## 117 | # ----PushPlus设置---- 118 | # PushPlus推送说明(https://www.pushplus.plus/) 119 | # --token码-- 120 | PushPlusToken= 121 | # 122 | # -----PushPlus推送设置结束---- 123 | ## 124 | # ----Server 酱推送设置---- 125 | # Server 酱推送说明(https://sct.ftqq.com/) 126 | # --token码-- 127 | ServerSendKey= 128 | # 129 | # ----Server 酱推送设置结束---- 130 | ## 131 | # ----pushdeer推送设置---- 132 | # PushDeer推送说明(http://www.pushdeer.com/product.html) 133 | # --token码-- 134 | PushDeerPushKey= 135 | # 136 | # ----pushdeer推送设置结束---- 137 | ## 138 | # ----企业微信推送设置---- 139 | # --企业ID-- 140 | # (https://developer.work.weixin.qq.com/document/path/90665#corpid) 141 | CORPID= 142 | # 143 | # --应用ID-- 144 | # (https://developer.work.weixin.qq.com/document/path/90665#secret) 145 | SECRET= 146 | # 147 | # --agentid-- 148 | # (https://developer.work.weixin.qq.com/document/path/90665#agentid) 149 | AGENTID= 150 | # 151 | # --成员ID-- 152 | # (https://developer.work.weixin.qq.com/document/path/90665#userid) 153 | # 设置需要推送给谁,不填写默认推送给全员 154 | USERID= 155 | # 156 | # --企业微信推送代理域名-- 157 | # 由于企业微信限制推送需要ip白名单,但家里的网络一般不是固定ip,所以需要自建反向代理API域名,将反向代理服务器的ip加入企业微信的ip白名单 158 | Proxy_WX= 159 | # 160 | # ----企业微信推送设置结束---- 161 | ## 162 | # 163 | # --Synology Chat推送 164 | # 使用群晖的chat套件进行推送,下方填写群晖chat中-整合-传入的webhook中,的Webhook URL地址。 165 | Synology_Chat_URL="" 166 | # 167 | #--------------------------------------------结束---------------------------------------------------- 168 | -------------------------------------------------------------------------------- /cf_ddns/cf_ddns_cloudflare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 版本:V0.0.2 3 | # 用于CloudflareST调用,更新hosts和更新cloudflare DNS。 4 | 5 | ipv4Regex="((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])"; 6 | 7 | if [ "$IP_TO_CF" = "1" ]; then 8 | # 验证cf账号信息是否正确 9 | res=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${zone_id}" -H "X-Auth-Email:$x_email" -H "X-Auth-Key:$api_key" -H "Content-Type:application/json"); 10 | resSuccess=$(echo "$res" | jq -r ".success"); 11 | if [[ $resSuccess != "true" ]]; then 12 | echo "登陆错误,检查cloudflare账号信息填写是否正确!" 13 | echo "登陆错误,检查cloudflare账号信息填写是否正确!" > $informlog 14 | source $cf_push; 15 | exit 1; 16 | fi 17 | echo "Cloudflare账号验证成功"; 18 | else 19 | echo "未配置Cloudflare账号" 20 | fi 21 | 22 | # 获取域名填写数量 23 | num=${#hostname[*]}; 24 | 25 | # 判断优选ip数量是否大于域名数,小于则让优选数与域名数相同 26 | if [ "$CFST_DN" -le $num ] ; then 27 | CFST_DN=$num; 28 | fi 29 | CFST_P=$CFST_DN; 30 | 31 | # 判断工作模式 32 | if [ "$IP_ADDR" = "ipv6" ] ; then 33 | if [ ! -f "./cf_ddns/ipv6.txt" ]; then 34 | echo "当前工作模式为ipv6,但该目录下没有【ipv6.txt】,请配置【ipv6.txt】。下载地址:https://github.com/XIU2/CloudflareSpeedTest/releases"; 35 | exit 2; 36 | else 37 | echo "当前工作模式为ipv6"; 38 | fi 39 | else 40 | echo "当前工作模式为ipv4"; 41 | fi 42 | 43 | #读取配置文件中的客户端 44 | case $clien in 45 | "6") CLIEN=bypass;; 46 | "5") CLIEN=openclash;; 47 | "4") CLIEN=clash;; 48 | "3") CLIEN=shadowsocksr;; 49 | "2") CLIEN=passwall2;; 50 | *) CLIEN=passwall;; 51 | esac 52 | 53 | # 判断是否停止科学上网服务 54 | if [ "$pause" = "false" ] ; then 55 | echo "按要求未停止科学上网服务"; 56 | else 57 | /etc/init.d/$CLIEN stop; 58 | echo "已停止$CLIEN"; 59 | fi 60 | 61 | # 判断是否配置测速地址 62 | if [[ "$CFST_URL" == http* ]] ; then 63 | CFST_URL_R="-url $CFST_URL"; 64 | else 65 | CFST_URL_R=""; 66 | fi 67 | 68 | if [ "$IP_PR_IP" = "true" ] ; then 69 | wget -P ./cf_ddns/ https://cf.vbar.fun/pr_ip.txt 70 | $CloudflareST $CFST_URL_R -t $CFST_T -n $CFST_N -dn $CFST_DN -tl $CFST_TL -sl $CFST_SL -p $CFST_P -f ./cf_ddns/pr_ip.txt -o ./cf_ddns/result.csv 71 | rm ./cf_ddns/pr_ip.txt 72 | elif [ "$IP_ADDR" = "ipv6" ] ; then 73 | # 开始优选IPv6 74 | $CloudflareST $CFST_URL_R -t $CFST_T -n $CFST_N -dn $CFST_DN -tl $CFST_TL -tll $CFST_TLL -sl $CFST_SL -p $CFST_P -f ./cf_ddns/ipv6.txt -o ./cf_ddns/result.csv 75 | else 76 | # 开始优选IPv4 77 | $CloudflareST $CFST_URL_R -t $CFST_T -n $CFST_N -dn $CFST_DN -tl $CFST_TL -tll $CFST_TLL -sl $CFST_SL -p $CFST_P -f ./cf_ddns/ip.txt -o ./cf_ddns/result.csv 78 | fi 79 | 80 | echo "测速完毕"; 81 | 82 | #判断是否重启科学服务 83 | if [ "$pause" = "false" ] ; then 84 | echo "按要求未重启科学上网服务"; 85 | sleep 3s; 86 | else 87 | /etc/init.d/$CLIEN restart; 88 | echo "已重启$CLIEN"; 89 | echo "等待${sleepTime}秒后开始更新DNS!" 90 | sleep ${sleepTime}s; 91 | fi 92 | 93 | # 开始循环 94 | echo "正在更新域名,请稍后..." 95 | x=0 96 | 97 | while [[ ${x} -lt $num ]]; do 98 | CDNhostname=${hostname[$x]} 99 | 100 | # 获取优选后的ip地址 101 | ipAddr=$(sed -n "$((x + 2)),1p" ./cf_ddns/result.csv | awk -F, '{print $1}') 102 | 103 | if [ "$IP_TO_HOSTS" = 1 ]; then 104 | echo $ipAddr $CDNhostname >> ./cf_ddns/hosts_new 105 | fi 106 | 107 | if [ "$IP_TO_CF" = 1 ]; then 108 | echo "开始更新第$((x + 1))个---$ipAddr" 109 | 110 | # 开始DDNS 111 | if [[ $ipAddr =~ $ipv4Regex ]]; then 112 | recordType="A" 113 | else 114 | recordType="AAAA" 115 | fi 116 | 117 | listDnsApi="https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records?type=${recordType}&name=${CDNhostname}" 118 | createDnsApi="https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records" 119 | 120 | # 关闭小云朵 121 | proxy="false" 122 | 123 | res=$(curl -s -X GET "$listDnsApi" -H "X-Auth-Email:$x_email" -H "X-Auth-Key:$api_key" -H "Content-Type:application/json") 124 | recordId=$(echo "$res" | jq -r ".result[0].id") 125 | recordIp=$(echo "$res" | jq -r ".result[0].content") 126 | 127 | if [[ $recordIp = "$ipAddr" ]]; then 128 | echo "更新失败,获取最快的IP与云端相同" 129 | resSuccess=false 130 | elif [[ $recordId = "null" ]]; then 131 | res=$(curl -s -X POST "$createDnsApi" -H "X-Auth-Email:$x_email" -H "X-Auth-Key:$api_key" -H "Content-Type:application/json" --data "{\"type\":\"$recordType\",\"name\":\"$CDNhostname\",\"content\":\"$ipAddr\",\"proxied\":$proxy}") 132 | resSuccess=$(echo "$res" | jq -r ".success") 133 | else 134 | updateDnsApi="https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${recordId}" 135 | res=$(curl -s -X PUT "$updateDnsApi" -H "X-Auth-Email:$x_email" -H "X-Auth-Key:$api_key" -H "Content-Type:application/json" --data "{\"type\":\"$recordType\",\"name\":\"$CDNhostname\",\"content\":\"$ipAddr\",\"proxied\":$proxy}") 136 | resSuccess=$(echo "$res" | jq -r ".success") 137 | fi 138 | 139 | if [[ $resSuccess = "true" ]]; then 140 | echo "$CDNhostname更新成功" 141 | else 142 | echo "$CDNhostname更新失败" 143 | fi 144 | fi 145 | 146 | x=$((x + 1)) 147 | sleep 3s 148 | done > $informlog 149 | 150 | if [ "$IP_TO_HOSTS" = 1 ]; then 151 | if [ ! -f "/etc/hosts.old_cfstddns_bak" ]; then 152 | cp /etc/hosts /etc/hosts.old_cfstddns_bak 153 | cat ./cf_ddns/hosts_new >> /etc/hosts 154 | else 155 | rm /etc/hosts 156 | cp /etc/hosts.old_cfstddns_bak /etc/hosts 157 | cat ./cf_ddns/hosts_new >> /etc/hosts 158 | echo "hosts已更新" 159 | echo "hosts已更新" >> $informlog 160 | rm ./cf_ddns/hosts_new 161 | fi 162 | fi 163 | 164 | -------------------------------------------------------------------------------- /cf_ddns/cf_push.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ##用于CloudflareSpeedTestDDNS执行情况推送。 3 | 4 | message_text=$(echo "$(sed "$ ! s/$/\\\n/ " ./cf_ddns/informlog | tr -d '\n')") 5 | 6 | if [[ -z ${Proxy_TG} ]]; then 7 | tgapi="https://api.telegram.org" 8 | else 9 | tgapi=$Proxy_TG 10 | fi 11 | 12 | if [[ -z ${Proxy_WX} ]]; then 13 | wxapi="https://qyapi.weixin.qq.com" 14 | else 15 | wxapi=$Proxy_WX 16 | fi 17 | 18 | TGURL="$tgapi/bot${telegramBotToken}/sendMessage" 19 | PushDeerURL="https://api2.pushdeer.com/message/push?pushkey=${PushDeerPushKey}" 20 | WX_tkURL="$wxapi/cgi-bin/gettoken" 21 | WXURL="$wxapi/cgi-bin/message/send?access_token=" 22 | 23 | ##tg推送## 24 | if [[ -z ${telegramBotToken} ]]; then 25 | echo "未配置TG推送" 26 | else 27 | res=$(timeout 20s curl -s -X POST $TGURL -H "Content-type:application/json" -d '{"chat_id":"'$telegramBotUserId'", "parse_mode":"HTML", "text":"'$message_text'"}') 28 | 29 | if [ $? == 124 ];then 30 | echo 'TG_api请求超时,请检查网络是否重启完成并是否能够访问TG' 31 | fi 32 | 33 | resSuccess=$(echo "$res" | jq -r ".ok") 34 | if [[ $resSuccess = "true" ]]; then 35 | echo "TG推送成功"; 36 | else 37 | echo "TG推送失败,请检查网络或TG机器人token和ID"; 38 | fi 39 | fi 40 | #### 41 | 42 | ##PushPlus推送## 43 | if [[ -z ${PushPlusToken} ]]; then 44 | echo "未配置PushPlus推送" 45 | else 46 | P_message_text=$(sed "$ ! s/$/\\%0A/ " ./cf_ddns/informlog) 47 | res=$(timeout 20s curl -s -X POST "http://www.pushplus.plus/send" -d "token=${PushPlusToken}" -d "title=cf优选ip推送" -d "content=${P_message_text}" -d "template=html") 48 | 49 | if [ $? == 124 ];then 50 | echo 'PushPlus请求超时,请检查网络是否正常' 51 | fi 52 | 53 | resCode=$(echo "$res" | jq -r ".code") 54 | if [[ $resCode = 200 ]]; then 55 | echo "PushPlus推送成功"; 56 | else 57 | echo "PushPlus推送失败,请检查PushPlusToken是否填写正确"; 58 | fi 59 | fi 60 | #### 61 | 62 | ##Server 酱## 63 | if [[ -z ${ServerSendKey} ]]; then 64 | echo "未配置Server 酱" 65 | else 66 | res=$(timeout 20s curl -X POST https://sctapi.ftqq.com/${ServerSendKey}.send?title="cf优选ip推送" -d desp=${message_text}) 67 | 68 | if [ $? == 124 ];then 69 | echo 'Server 酱请求超时,请检查网络是否可用' 70 | fi 71 | 72 | resSuccess=$(echo "$res" | jq -r ".code") 73 | if [[ $resSuccess = "0" ]]; then 74 | echo "Server 酱推送成功"; 75 | else 76 | echo "Server 酱推送失败,请检查Server 酱ServerSendKey是否配置正确"; 77 | fi 78 | fi 79 | #### 80 | 81 | ##PushDeer推送## 82 | if [[ -z ${PushDeerPushKey} ]]; then 83 | echo "未配置PushDeer推送" 84 | else 85 | P_message_text=$(sed "$ ! s/$/\\%0A/ " ./cf_ddns/informlog) 86 | res=$(timeout 20s curl -s -X POST $PushDeerURL -d text="## cf优选ip推送" -d desp="${P_message_text}" ) 87 | if [ $? == 124 ];then 88 | echo 'PushDeer_api请求超时,请检查网络是否正常' 89 | fi 90 | 91 | resSuccess=$(echo "$res" | jq -r ".code") 92 | if [[ $resSuccess = "0" ]]; then 93 | echo "PushDeer推送成功"; 94 | else 95 | echo "PushDeer推送失败,请检查PushDeerPushKey是否填写正确"; 96 | fi 97 | fi 98 | #### 99 | 100 | ##企业微信推送## 101 | #判断access_token是否过期 102 | if [[ -z ${CORPID} ]]; then 103 | echo "未配置企业微信推送" 104 | else 105 | if [ ! -f ".access_token" ]; then 106 | res=$(curl -X POST $WX_tkURL -H "Content-type:application/json" -d '{"corpid":"'$CORPID'", "corpsecret":"'$SECRET'"}') 107 | resSuccess=$(echo "$res" | jq -r ".errcode") 108 | if [[ $resSuccess = "0" ]]; then 109 | echo "access_token获取成功"; 110 | echo '{"access_token":"'$(echo "$res" | jq -r ".access_token")'", "expires":"'$(($(date -d "$(date "+%Y-%m-%d %H:%M:%S")" +%s) + 7200))'"}' > .access_token 111 | CHECK="true" 112 | else 113 | echo "access_token获取失败,请检查CORPID和SECRET"; 114 | CHECK="false" 115 | fi 116 | else 117 | if [[ $(date -d "$(date "+%Y-%m-%d %H:%M:%S")" +%s) -le $(cat .access_token | jq -r ".expires") ]]; then 118 | echo "企业微信access_token在有效期内"; 119 | CHECK="true" 120 | else 121 | res=$(curl -X POST $WX_tkURL -H "Content-type:application/json" -d '{"corpid":"'$CORPID'", "corpsecret":"'$SECRET'"}') 122 | resSuccess=$(echo "$res" | jq -r ".errcode") 123 | if [[ $resSuccess = "0" ]]; then 124 | echo "access_token获取成功"; 125 | echo '{"access_token":"'$(echo "$res" | jq -r ".access_token")'", "expires":"'$(($(date -d "$(date "+%Y-%m-%d %H:%M:%S")" +%s) + 7200))'"}' > .access_token 126 | CHECK="true" 127 | else 128 | echo "access_token获取失败,请检查CORPID和SECRET"; 129 | CHECK="false" 130 | fi 131 | fi 132 | fi 133 | fi 134 | 135 | if [[ $CHECK != "true" ]]; then 136 | echo "access_token验证不正确" 137 | else 138 | access_token=$(cat .access_token | jq -r ".access_token") 139 | WXURL=$WXURL 140 | message_text=$(echo "$(sed "$ ! s/$/\\\n/ " ./cf_ddns/informlog | tr -d '\n')") 141 | res=$(timeout 20s curl -X POST $WXURL$access_token -H "Content-type:application/json" -d '{"touser":"'$USERID'", "msgtype":"text", "agentid": "'$AGENTID'", "text":{"content":"'$message_text'"}}') 142 | if [ $? == 124 ];then 143 | echo '企业微信_api请求超时,请检查网络是否正常' 144 | fi 145 | resSuccess=$(echo "$res" | jq -r ".errcode") 146 | if [[ $resSuccess = "0" ]]; then 147 | echo "企业微信推送成功"; 148 | elif [[ $resSuccess = "81013" ]]; then 149 | echo "企业微信USERID填写错误,请检查后重试"; 150 | elif [[ $resSuccess = "60020" ]]; then 151 | echo "企业微信应用未配置本机IP地址,请在企业微信后台,添加IP白名单"; 152 | else 153 | echo "企业微信推送失败,请检查企业微信参数是否填写正确"; 154 | fi 155 | fi 156 | 157 | #Synology Chat推送 158 | if [[ -z ${Synology_Chat_URL} ]]; then 159 | echo "未配置Synology Chat推送" 160 | else 161 | res=$(timeout 20s curl -X POST \ 162 | $Synology_Chat_URL \ 163 | -H "Content-Type: application/json" \ 164 | -d method=incoming \ 165 | -d version=2 \ 166 | -d token=${Synology_Chat_URL#*token=} \ 167 | -d "payload={\"text\":\"$message_text\"}") 168 | resSuccess=$(echo "$res" | jq -r ".success") 169 | if [[ $resSuccess = "true" ]]; then 170 | echo "Synology_Chat推送成功"; 171 | else 172 | echo "Synology_Chat推送失败,请检查Synology_Chat_URL是否填写正确"; 173 | fi 174 | fi 175 | 176 | exit 0; 177 | -------------------------------------------------------------------------------- /cf_ddns/cf_check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 版本:V0.0.2 3 | # 用于CloudflareSpeedTestDDNS运行环境检测和必要软件初始化安装。 4 | 5 | #github下在CloudflareSpeedTest使用ghproxy代理 6 | PROXY=https://ghproxy.com/ 7 | 8 | flag_file=".ran_before" 9 | CloudflareST="./cf_ddns/CloudflareST" 10 | informlog="./cf_ddns/informlog" 11 | cf_push="./cf_ddns/cf_push.sh" 12 | 13 | # 初始化推送 14 | if [ -e ${informlog} ]; then 15 | rm ${informlog} 16 | fi 17 | 18 | # 检测是否配置DDNS或更新HOSTS任意一个 19 | if [[ -z ${dnspod_token} ]]; then 20 | IP_TO_DNSPOD=0 21 | else 22 | IP_TO_DNSPOD=1 23 | fi 24 | 25 | if [[ -z ${api_key} ]]; then 26 | IP_TO_CF=0 27 | else 28 | IP_TO_CF=1 29 | fi 30 | 31 | if [ "$IP_TO_HOSTS" = "true" ]; then 32 | IP_TO_HOSTS=1 33 | else 34 | IP_TO_HOSTS=0 35 | fi 36 | 37 | if [ $IP_TO_DNSPOD -eq 1 ] || [ $IP_TO_CF -eq 1 ] || [ $IP_TO_HOSTS -eq 1 ] 38 | then 39 | echo "配置获取成功!" 40 | else 41 | echo "HOSTS和cf_ddns均未配置!!!" 42 | echo "HOSTS和cf_ddns均未配置!!!" > $informlog 43 | source $cf_push; 44 | exit 1; 45 | fi 46 | 47 | # 如果是第一次运行的话,将进行初始化 48 | if [ ! -e "$flag_file" ]; then 49 | # 初始化包列表 50 | packages="" 51 | 52 | # 检查bash是否安装 53 | if ! command -v bash &> /dev/null; then 54 | echo "bash not found. Adding to the list of required packages." 55 | packages="$packages bash" 56 | else 57 | echo "bash is already installed." 58 | fi 59 | 60 | # 检查jq是否安装 61 | if ! command -v jq &> /dev/null; then 62 | echo "jq not found. Adding to the list of required packages." 63 | packages="$packages jq" 64 | else 65 | echo "jq is already installed." 66 | fi 67 | 68 | # 检查wget是否安装 69 | if ! command -v wget &> /dev/null; then 70 | echo "wget not found. Adding to the list of required packages." 71 | packages="$packages wget" 72 | else 73 | echo "wget is already installed." 74 | fi 75 | 76 | # 检查curl是否安装 77 | if ! command -v curl &> /dev/null; then 78 | echo "curl not found. Adding to the list of required packages." 79 | packages="$packages curl" 80 | else 81 | echo "curl is already installed." 82 | fi 83 | 84 | # 检查tar是否安装 85 | if ! command -v tar &> /dev/null; then 86 | echo "tar not found. Adding to the list of required packages." 87 | packages="$packages tar" 88 | else 89 | #由于有的设备有tar但版本过低还是无法正常解压,所以tar强制更新 90 | packages="$packages tar" 91 | echo "tar is already installed." 92 | fi 93 | 94 | # 检查sed是否安装 95 | if ! command -v sed &> /dev/null; then 96 | echo "sed not found. Adding to the list of required packages." 97 | packages="$packages sed" 98 | else 99 | echo "sed is already installed." 100 | fi 101 | 102 | # 检查awk是否安装 103 | if ! command -v awk &> /dev/null; then 104 | echo "awk not found. Adding to the list of required packages." 105 | packages="$packages gawk" 106 | else 107 | echo "awk is already installed." 108 | fi 109 | 110 | # 检查tr是否安装 111 | if ! command -v tr &> /dev/null; then 112 | echo "tr not found. Adding to the list of required packages." 113 | packages="$packages coreutils" 114 | else 115 | echo "tr is already installed." 116 | fi 117 | 118 | # 判断系统进行安装 119 | if [ -n "$packages" ]; then 120 | echo "The following packages are required: $packages" 121 | if grep -qi "alpine" /etc/os-release; then 122 | echo "Installing packages using apk..." 123 | apk update 124 | apk add $packages 125 | elif grep -qi "openwrt" /etc/os-release; then 126 | echo "Installing packages using opkg..." 127 | opkg update 128 | opkg install $packages 129 | #openwrt没有安装timeout 130 | opkg install coreutils-timeout 131 | elif grep -qi "ubuntu\|debian" /etc/os-release; then 132 | echo "Installing packages using apt-get..." 133 | sudo apt-get update 134 | sudo apt-get install $packages -y 135 | elif grep -qi "centos\|red hat\|fedora" /etc/os-release; then 136 | echo "Installing packages using yum..." 137 | sudo yum install $packages -y 138 | else 139 | echo "未能检测出你的系统:$(uname),请自行安装$packages这些软件。" 140 | echo "未能检测出你的系统:$(uname),请自行安装$packages这些软件。" > $informlog 141 | source $cf_push; 142 | exit 1 143 | fi 144 | fi 145 | # 检测CloudflareST是否安装 146 | LATEST_URL=https://api.github.com/repos/XIU2/CloudflareSpeedTest/releases/latest 147 | 148 | latest_version() { 149 | curl --silent $LATEST_URL | grep "tag_name" | cut -d '"' -f 4 150 | } 151 | 152 | VERSION=$(latest_version) 153 | 154 | if [ -e ./cf_ddns/tmp/ ]; then 155 | rm -rf ./cf_ddns/tmp/ 156 | fi 157 | if [ ! -f ${CloudflareST} ]; then 158 | get_arch=`uname -m` 159 | if [[ $get_arch =~ "x86_64" ]];then 160 | echo "this is x86_64" 161 | URL="https://github.com/XIU2/CloudflareSpeedTest/releases/download/$VERSION/CloudflareST_linux_amd64.tar.gz" 162 | wget -P ./cf_ddns/tmp/ ${PROXY}$URL 163 | tar -zxf ./cf_ddns/tmp/CloudflareST_linux_*.tar.gz -C ./cf_ddns/tmp/ 164 | mv ./cf_ddns/tmp/CloudflareST ./cf_ddns/tmp/ip.txt ./cf_ddns/tmp/ipv6.txt ./cf_ddns/ 165 | rm -rf ./cf_ddns/tmp/ 166 | elif [[ $get_arch =~ "aarch64" ]];then 167 | echo "this is arm64" 168 | URL="https://github.com/XIU2/CloudflareSpeedTest/releases/download/$VERSION/CloudflareST_linux_arm64.tar.gz" 169 | wget -P ./cf_ddns/tmp/ ${PROXY}$URL 170 | tar -zxf ./cf_ddns/tmp/CloudflareST_linux_*.tar.gz -C ./cf_ddns/tmp/ 171 | mv ./cf_ddns/tmp/CloudflareST ./cf_ddns/tmp/ip.txt ./cf_ddns/tmp/ipv6.txt ./cf_ddns/ 172 | rm -rf ./cf_ddns/tmp/ 173 | elif [[ $get_arch =~ "mips64" ]];then 174 | echo "this is mips64" 175 | URL="https://github.com/XIU2/CloudflareSpeedTest/releases/download/$VERSION/CloudflareST_linux_mips64.tar.gz" 176 | wget -P ./cf_ddns/tmp/ ${PROXY}$URL 177 | tar -zxf ./cf_ddns/tmp/CloudflareST_linux_*.tar.gz -C ./cf_ddns/tmp/ 178 | mv ./cf_ddns/tmp/CloudflareST ./cf_ddns/tmp/ip.txt ./cf_ddns/tmp/ipv6.txt ./cf_ddns/ 179 | rm -rf ./cf_ddns/tmp/ 180 | else 181 | echo "找不到匹配的CloudflareST程序,请自行下载'https://github.com/XIU2/CloudflareSpeedTest',并解压至'./cf_ddns/'文件夹中。" 182 | echo "找不到匹配的CloudflareST程序,请自行下载'https://github.com/XIU2/CloudflareSpeedTest',并解压至'./cf_ddns/'文件夹中。" > $informlog 183 | source $cf_push; 184 | exit 1 185 | fi 186 | fi 187 | # 检测CloudflareST权限 188 | if [[ ! -x ${CloudflareST} ]]; then 189 | # echo "${CloudflareST} 文件不可执行" 190 | chmod +x $CloudflareST 191 | fi 192 | touch "$flag_file" 193 | echo "初始化完成!" 194 | fi 195 | -------------------------------------------------------------------------------- /cf_ddns/cf_ddns_dnspod.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 版本:V0.0.2 3 | # 用于CloudflareST调用,更新hosts和更新dnspod DNS。 4 | 5 | #set -euo pipefail 6 | ipv4Regex="((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])"; 7 | 8 | networks=('电信' '联通' '移动' '铁通' '广电' '教育网' '境内' '境外') 9 | RECORD_LINE=${networks[LINE-1]} 10 | 11 | if [ "$IP_TO_DNSPOD" = "1" ]; then 12 | # 发送请求并获取响应 13 | response=$(curl -sSf -X POST "https://dnsapi.cn/Domain.List" \ 14 | -H "Content-Type: application/x-www-form-urlencoded" \ 15 | -d "login_token=${dnspod_token}&format=json&offset=0&length=20") 16 | 17 | # 解析json响应并检查状态码 18 | if [[ $(echo ${response} | jq -r '.status.code') == 1 ]]; then 19 | echo "dnspod Token有效" 20 | else 21 | echo "dnspod Token无效" 22 | echo "登陆错误,检查dnspod Token信息填写是否正确!" > $informlog 23 | source $cf_push; 24 | exit 1; 25 | fi 26 | echo "dnspod Token验证成功"; 27 | else 28 | echo "未配置dnspod Token" 29 | fi 30 | 31 | #获取域名填写数量 32 | num=${#hostname[*]}; 33 | 34 | #判断优选ip数量是否大于域名数,小于则让优选数与域名数相同 35 | if [ "$CFST_DN" -le $num ] ; then 36 | CFST_DN=$num; 37 | fi 38 | CFST_P=$CFST_DN; 39 | 40 | #判断工作模式 41 | if [ "$IP_ADDR" = "ipv6" ] ; then 42 | if [ ! -f "./cf_ddns/ipv6.txt" ]; then 43 | echo "当前工作模式为ipv6,但该目录下没有【ipv6.txt】,请配置【ipv6.txt】。下载地址:https://github.com/XIU2/CloudflareSpeedTest/releases"; 44 | exit 2; 45 | else 46 | echo "当前工作模式为ipv6"; 47 | fi 48 | else 49 | echo "当前工作模式为ipv4"; 50 | fi 51 | 52 | #读取配置文件中的客户端 53 | case $clien in 54 | "6") CLIEN=bypass;; 55 | "5") CLIEN=openclash;; 56 | "4") CLIEN=clash;; 57 | "3") CLIEN=shadowsocksr;; 58 | "2") CLIEN=paswall2;; 59 | *) CLIEN=passwall;; 60 | esac 61 | 62 | #判断是否停止科学上网服务 63 | if [ "$pause" = "false" ] ; then 64 | echo "按要求未停止科学上网服务"; 65 | else 66 | /etc/init.d/$CLIEN stop; 67 | echo "已停止$CLIEN"; 68 | fi 69 | 70 | #判断是否配置测速地址 71 | if [[ "$CFST_URL" == http* ]] ; then 72 | CFST_URL_R="-url $CFST_URL"; 73 | else 74 | CFST_URL_R=""; 75 | fi 76 | 77 | if [ "$IP_PR_IP" = "true" ] ; then 78 | curl -sSf -o ./cf_ddns/pr_ip.txt https://cf.vbar.fun/pr_ip.txt 79 | $CloudflareST $CFST_URL_R -t $CFST_T -n $CFST_N -dn $CFST_DN -tl $CFST_TL -sl $CFST_SL -p $CFST_P -f ./cf_ddns/pr_ip.txt -o ./cf_ddns/result.csv 80 | rm ./cf_ddns/pr_ip.txt 81 | elif [ "$IP_ADDR" = "ipv6" ] ; then 82 | #开始优选IPv6 83 | $CloudflareST $CFST_URL_R -t $CFST_T -n $CFST_N -dn $CFST_DN -tl $CFST_TL -tll $CFST_TLL -sl $CFST_SL -p $CFST_P -f ./cf_ddns/ipv6.txt -o ./cf_ddns/result.csv 84 | else 85 | #开始优选IPv4 86 | $CloudflareST $CFST_URL_R -t $CFST_T -n $CFST_N -dn $CFST_DN -tl $CFST_TL -tll $CFST_TLL -sl $CFST_SL -p $CFST_P -f ./cf_ddns/ip.txt -o ./cf_ddns/result.csv 87 | fi 88 | echo "测速完毕"; 89 | 90 | #判断是否重启科学服务 91 | if [ "$pause" = "false" ] ; then 92 | echo "按要求未重启科学上网服务"; 93 | sleep 3s; 94 | else 95 | /etc/init.d/$CLIEN restart; 96 | echo "已重启$CLIEN"; 97 | echo "等待${sleepTime}秒后开始更新DNS!" 98 | sleep ${sleepTime}s; 99 | fi 100 | 101 | # 开始循环 102 | echo "正在更新域名,请稍后..."; 103 | x=0; 104 | while [[ ${x} -lt $num ]]; do 105 | CDNhostname=${hostname[$x]}; 106 | 107 | # 获取优选后的ip地址 108 | ipAddr=$(sed -n "$((x + 2)),1p" ./cf_ddns/result.csv | awk -F, '{print $1}'); 109 | 110 | if [ "$IP_TO_HOSTS" = 1 ]; then 111 | echo $ipAddr $CDNhostname >> ./cf_ddns/hosts_new 112 | # else 113 | # echo "未配置hosts" 114 | fi 115 | 116 | if [ "$IP_TO_DNSPOD" = 1 ]; then 117 | echo "开始更新第$((x + 1))个---$ipAddr"; 118 | 119 | # 开始DDNS 120 | if [[ $ipAddr =~ $ipv4Regex ]]; then 121 | recordType="A"; 122 | else 123 | recordType="AAAA"; 124 | fi 125 | 126 | # split domain and subdomain by . 127 | IFS='.' read -ra arr <<< "$CDNhostname" 128 | # count the number of elements in the array 129 | len=${#arr[@]} 130 | 131 | # if there is only 1 element, it means the domain is the full domain and subdomain should be "@" 132 | if [ $len -eq 1 ]; then 133 | domain="$CDNhostname" 134 | sub_domain="@" 135 | elif [ $len -eq 2 ]; then 136 | domain="$CDNhostname" 137 | sub_domain="@" 138 | else 139 | # check if the domain ends with "eu.org" 140 | if [ "${arr[$len-2]}.${arr[$len-1]}" = "eu.org" ]; then 141 | # get the domain by joining the last three elements with . 142 | domain="${arr[$len-3]}.${arr[$len-2]}.${arr[$len-1]}" 143 | # get the subdomain by joining all elements except the last three with . 144 | if [ $len -eq 3 ]; then 145 | sub_domain="@" 146 | else 147 | sub_domain="$(IFS='.'; echo "${arr[*]:0:$len-3}")" 148 | fi 149 | else 150 | # get the domain by joining the last two elements with . 151 | domain="${arr[$len-2]}.${arr[$len-1]}" 152 | # get the subdomain by joining all elements except the last two with . 153 | sub_domain="$(IFS='.'; echo "${arr[*]:0:$len-2}")" 154 | fi 155 | fi 156 | 157 | DOMAIN_NAME=$domain 158 | SUBDOMAIN=$sub_domain 159 | 160 | ## DNS新建与更新 161 | # call DNSPod API to get the domain ID and record ID 162 | RESPONSE=$(curl -sX POST https://dnsapi.cn/Record.List -d "login_token=$dnspod_token&format=json&domain=$DOMAIN_NAME&sub_domain=$SUBDOMAIN") 163 | 164 | # check if the domain exists 165 | STATUS=$(echo "$RESPONSE" | jq -r '.status.code') 166 | if [ "$STATUS" == "1" ]; then 167 | # extract domain ID and record ID from the API response 168 | RECORD_ID=$(echo "$RESPONSE" | jq -r '.records[0].id') 169 | # update DNS record with the current IP address 170 | RESPONSE=$(curl -sX POST https://dnsapi.cn/Record.Modify -d "login_token=$dnspod_token&format=json&domain=$DOMAIN_NAME&record_id=$RECORD_ID&sub_domain=$SUBDOMAIN&record_line=$RECORD_LINE&record_type=$recordType" -d "value=$ipAddr") 171 | 172 | # check if the update was successful 173 | STATUS=$(echo "$RESPONSE" | jq -r '.status.code') 174 | if [ "$STATUS" == "1" ]; then 175 | echo "$CDNhostname更新成功" 176 | else 177 | echo "$CDNhostname更新失败" 178 | fi 179 | else 180 | # add DNS record for the domain 181 | RESPONSE=$(curl -sX POST https://dnsapi.cn/Record.Create -d "login_token=$dnspod_token&format=json&domain=$DOMAIN_NAME&sub_domain=$SUBDOMAIN&record_line=$RECORD_LINE&record_type=$recordType" -d "value=$ipAddr") 182 | 183 | # check if the creation was successful 184 | STATUS=$(echo "$RESPONSE" | jq -r '.status.code') 185 | if [ "$STATUS" == "1" ]; then 186 | echo "$CDNhostname添加成功" 187 | else 188 | echo "$CDNhostname添加失败" 189 | fi 190 | fi 191 | 192 | fi 193 | 194 | ((x++)) 195 | sleep 3s; 196 | done > $informlog 197 | 198 | if [ "$IP_TO_HOSTS" = 1 ]; then 199 | if [ ! -f "/etc/hosts.old_cfstddns_bak" ]; then 200 | cp /etc/hosts /etc/hosts.old_cfstddns_bak 201 | cat ./cf_ddns/hosts_new >> /etc/hosts 202 | else 203 | rm /etc/hosts 204 | cp /etc/hosts.old_cfstddns_bak /etc/hosts 205 | cat ./cf_ddns/hosts_new >> /etc/hosts 206 | echo "hosts已更新" 207 | echo "hosts已更新" >> $informlog 208 | rm ./cf_ddns/hosts_new 209 | fi 210 | fi 211 | #判断是否重启科学服务 212 | if [ "$pause" = "false" ] ; then 213 | echo "按要求未重启科学上网服务"; 214 | sleep 3s; 215 | else 216 | /etc/init.d/$CLIEN restart; 217 | echo "已重启$CLIEN"; 218 | echo "等待${sleepTime}秒后开始更新DNS!" 219 | sleep ${sleepTime}s; 220 | fi 221 | --------------------------------------------------------------------------------