CDN 筛选

#!/bin/bash
##版本:V2.1.2
#新功能,支持ip地址全自动下载,更新优选完毕后推送至TG,再也不怕脚本没有成功运行了。
#使用脚本需要安装jq和timeout,新增openwrt专用cf_RE.sh文件,运行cf_RE.sh即可在openwrt安装jq和timeout两个扩展。
#其他linux请自行安装jq和timeout。
#主程序为ip_down.sh。

###################################################################################################
export LANG=zh_CN.UTF-8
###################################################################################################

##cloudflare配置
#cloudflare账号邮箱
x_email=*********************
#填写需要DDNS的完整域名
#支持多域名:域名需要填写在括号中,每个域名之间用“空格”相隔。
#例如:(cdn.test.com) 或者 (cdn1.test.com cdn2.test.com cdn3.test.com)
CDNhostname=****************
#区域ID
zone_id=********************************
#Global API Key(获取你的API令牌,你的API密钥就是你的登陆密码)
api_key=****************************
$CLIEN=v2raya.service
###################################################################################################
##CloudflareST配置
#测速地址
CFST_URL=https://download.parallels.com/desktop/v15/15.1.5-47309/ParallelsDesktop-15.1.5-47309.dmg
#测速线程数量;越多测速越快,性能弱的设备 (如路由器) 请勿太高;(默认 200 最多 1000 )
CFST_N=200
# 指定测速端口;延迟测速/下载测速时使用的端口;(默认 443 端口)
CFST_TP=8443
#下载测速数量;延迟测速并排序后,从最低延迟起下载测速的数量;(默认 10 个)
CFST_DN=10
#平均延迟上限;只输出低于指定平均延迟的 IP,可与其他上限/下限搭配;(默认9999 ms 这里推荐配置250 ms)
CFST_TL=250
#平均延迟下限;只输出高于指定平均延迟的 IP,可与其他上限/下限搭配、过滤假墙 IP;(默认 0 ms 这里推荐配置40)
CFST_TLL=40
#下载速度下限;只输出高于指定下载速度的 IP,凑够指定数量 [-dn] 才会停止测速;(默认 0.00 MB/s 这里推荐5.00MB/s)
CFST_SL=3
#更新几个 默认10个
CFST_P=10
#####################################################################################################
# 定义下载链接和保存路径
download_url=”https://zip.baipiao.eu.org/”
save_path=”/root/txt.zip”
extracted_folder=”/root/txt” # 解压后的文件夹路径
###################################################################################################

# 定义最大尝试次数
max_attempts=10
current_attempt=1
###################################################################################################
# 关闭开启科学上网
systemctl stop $CLIEN;
#sleep 20s
# 循环尝试下载
while [ $current_attempt -le $max_attempts ]
do
# 下载文件
wget “${download_url}” -O $save_path

# 检查是否下载成功
if [ $? -eq 0 ]; then
break
else
echo “Download attempt $current_attempt failed.”
current_attempt=$((current_attempt+1))
fi
done
###################################################################################################

# 检查是否下载成功
if [ $current_attempt -gt $max_attempts ]; then
echo “Failed to download the file after $max_attempts attempts.”
else
# 删除原来的txt文件夹内容
rm -rf $extracted_folder/*

# 解压文件
unzip $save_path -d $extracted_folder

# 删除压缩包
rm $save_path

echo “File downloaded and unzipped successfully.”
###################################################################################################
# 合并文件为ip.txt
# 合并所有含有-1-443.txt的文本文件到一个新文件中
merged_file=”/root/CloudflareST/merged_ip.txt”
cat $extracted_folder/*-1-$CFST_TP.txt > $merged_file
###################################################################################################
# 移动到ip.txt到程序总目录

# 将合并后的文件移动到/root/CloudflareST/ip.txt并覆盖原文件
mv -f “$merged_file” “/root/cdn/ip.txt”
echo “Merged text files containing ‘-1-$CFST_TP.txt’ moved and renamed as ‘ip.txt’ in /root/cdn.”
fi
###################################################################################################
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])”;
#默认关闭小云朵
proxy=”false”;
#验证cf账号信息是否正确
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”);
resSuccess=$(echo “$res” | jq -r “.success”);
if [[ $resSuccess != “true” ]]; then
pushmessage=”登陆错误,检查cloudflare账号信息填写是否正确!”
# source cf_push;
exit 1;
fi
echo “Cloudflare账号验证成功”;
#停止科学上网服务

systemctl stop $CLIEN;
echo “已停止$CLIEN”;


#判断是否配置测速地址
if [[ “$CFST_URL” == http* ]] ; then
CFST_URL_R=”-url $CFST_URL”;
else
CFST_URL_R=””;
fi

if [ “$IP_ADDR” = “ipv6” ] ; then
#开始优选IPv6
./CloudflareST $CFST_URL_R -tp $CFST_TP -n $CFST_N -dn $CFST_DN -tl $CFST_TL -tll $CFST_TLL -sl $CFST_SL -p $CFST_P -f ipv6.txt
else
#开始优选IPv4
./CloudflareST $CFST_URL_R -tp $CFST_TP -n $CFST_N -dn $CFST_DN -tl $CFST_TL -tll $CFST_TLL -sl $CFST_SL -p $CFST_P
fi
echo “测速完毕”;
#systemctl start $CLIEN;
#echo “已重启$CLIEN”;
echo “为保证cloudflareAPI连接正常 将在30秒后开始更新域名解析”;
sleep 3s;
#开始循环
echo “正在更新域名,请稍后…”;
x=0;
#while [[ ${x} -lt $num ]]; do
# CDNhostname=${hostname[$x]};
#获取优选后的ip地址

# ipAddr=$(sed -n “$((x + 2)),1p” result.csv | awk -F, ‘{print $1}’);
# echo “开始更新第$((x + 1))个—$ipAddr”;

while (($x<3))
do
ipAddr[$x]=$(sed -n “$((x + 2)),1p” result.csv | awk -F, ‘{print $1}’);
echo “更新的IP${ipAddr[$x]}”;
let “x++”;
done
#开始DDNS
#if [[ $ipAddr =~ $ipv4Regex ]]; then
recordType=”A”;
# else
recordType=”AAAA”;
# fi
# listDnsApi=”https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records?type=${recordType}&name=${CDNhostname}”;
# createDnsApi=”https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records”;

# res=$(curl -s -X GET “$listDnsApi” -H “X-Auth-Email:$x_email” -H “X-Auth-Key:$api_key” -H “Content-Type:application/json”);



# 获取现有记录ID(如果存在)
res=$(curl -s -X GET “https://api.cloudflare.com/client/v4/zones/${zone_id}//dns_records?type=A&name=$CDNhostname” \
-H “Authorization: Bearer $api_key” \
-H “X-Auth-Email:$x_email” \
-H “X-Auth-Key:$api_key”\
-H “Content-Type:application/json”)
#EXISTING_RECORD_ID=$(echo “$res” | jq -r “.result[$id].id”)
# echo ${EXISTING_RECORD_ID};

i=0;
for IP in “${ipAddr[@]}”
do
recordId=$(echo “$res” | jq -r “.result[$i].id”);
recordIp=$(echo “$res” | jq -r “.result[$i].content”);
echo “$recordId”
if [[ $recordIp = “$IP” ]]; then
echo “更新失败,获取最快的IP与云端相同”;
resSuccess=false;
elif [[ $recordId = “null” ]]; then
sleep 3s;
res_Success =$(curl -s -X POST “https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records” \
-H “Authorization: Bearer $api_key” \
-H “X-Auth-Email:$x_email” \
-H “X-Auth-Key:$api_key”\
-H “Content-Type: application/json” \
–data ‘{
“type”: “A”,
“name”: “‘$CDNhostname'”,
“content”: “‘$IP'”,
“ttl”: 60,
“proxied”: false
}’);
resSuccess=$(echo “res_Success” | jq -r “.success”);
# echo “Added A record for $CDNhostname with IP: $IP”;
else
sleep 3s;
res_Success=$(curl -s -X PUT “https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records/$recordId” \
-H “Authorization: Bearer $api_key” \
-H “X-Auth-Email:$x_email” \
-H “X-Auth-Key:$api_key”\
-H “Content-Type: application/json” \
–data ‘{
“type”: “A”,
“name”: “‘$CDNhostname'”,
“content”: “‘$IP'”,
“ttl”: 60,
“proxied”: false
}’);
#echo “Updated A record for $CDNhostname with IP: $IP”
resSuccess=$(echo “$res_Success” | jq -r “.success”);
# echo “Updated A record for $CDNhostname with IP: $IP”;
fi

if [[ $resSuccess = “true” ]]; then
echo “$CDNhostname更新成功$IP”;
else
echo “$CDNhostname更新失败$IP”;
fi
let “i++”;

#会生成一个名为informlog的临时文件作为推送的内容。
done > informlog
pushmessage=$(cat informlog);
systemctl start $CLIEN;
echo “已停止$CLIEN”;
#source cf_push;
exit 0;

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注