ipprobe/choose-cn-v2.sh
chunzhi dd9b272fe5 ws检测
ws检测
2024-02-12 11:43:19 +08:00

179 lines
6.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 检查并安装依赖项 jq 和 bc
if ! command -v jq &> /dev/null
then
echo "jq could not be found, installing now..."
sudo apt-get update && sudo apt-get install -y jq
fi
if ! command -v bc &> /dev/null
then
echo "bc could not be found, installing now..."
sudo apt-get update && sudo apt-get install -y bc
fi
# 输出设置 crontab 的命令
echo "To run this script every day at 3 AM, add the following line to your crontab:"
echo "0 3 * * * /path/to/this/script.sh"
# 测速脚本部分
# 使用 dig 命令查询 DNS 记录并写入 ip.txt
dig cf.youoffer.net A +short > ip.txt
# 创建一个新的文件 final_ips.txt
touch final_ips.txt
#延迟检测部分
while IFS= read -r ip
do
echo "Checking latency for $ip"
# 使用 ping 命令检查延迟
ping_result=$(ping -c 1 -W 1 "$ip" 2>&1)
ping_status=$?
# 如果 ping 成功
if [ $ping_status -eq 0 ]; then
# 提取延迟时间
ping_time=$(echo "$ping_result" | grep time= | cut -d'=' -f 4 | cut -d' ' -f 1)
# 显示延迟时间
echo "Latency for $ip is $ping_time ms"
# 如果延迟时间大于 200ms
if (( $(echo "$ping_time > 200" | bc -l) )); then
echo "Latency for $ip is too high, discarding."
# 从 ip.txt 删除延迟时间大于 200ms 的 IP
sed -i "/$ip/d" ip.txt
fi
else
echo "Ping to $ip failed or timed out."
# 从 ip.txt 删除无法 ping 通的 IP
sed -i "/$ip/d" ip.txt
fi
done < ip.txt
# 读取 ip.txt 中的每个 IP 地址进行下载测试
while IFS= read -r ip
do
echo "Starting download test for $ip"
# 使用 curl 命令进行下载测试
start_time=$(date +%s.%N)
curl -s --resolve speed.cloudflare.com:443:"$ip" https://speed.cloudflare.com/__down?bytes=10000000 -o /dev/null --connect-timeout 5 --max-time 10
curl_status=$?
end_time=$(date +%s.%N)
elapsed_time=$(echo "$end_time - $start_time" | bc)
# 检查 curl 命令的返回状态
if [ $curl_status -eq 0 ]; then
# 计算下载速度
download_speed=$(echo "scale=2; (10000000*8)/(($elapsed_time)*1000000)" | bc)
# 显示下载速度
echo "$ip has a download speed of $download_speed Mbps"
# 如果下载速度大于等于 8Mbps
if (( $(echo "$download_speed >= 8" | bc -l) )); then
# 将大于等于 8Mbps 的 IP 写入 final_ips.txt
echo "$ip" >> final_ips.txt
fi
else
echo "Download test for $ip failed with status $curl_status"
fi
done < ip.txt
echo "Download tests completed. IPs with download speed >= 8Mbps are written to final_ips.txt"
# WebSocket 检测部分
IP_USE_FILE="ip_use.txt"
touch "$IP_USE_FILE"
# 读取 final_ips.txt 文件中的每个 IP 地址,并进行 WebSocket 测试
while IFS= read -r IP_ADDRESS; do
# 忽略空行
if [[ -z "$IP_ADDRESS" ]]; then
continue
fi
echo "Testing WebSocket connection for IP address: $IP_ADDRESS"
# 使用 curl 测试 WebSocket 连接
HTTP_RESPONSE=$(curl --include \
--no-buffer \
--max-time 5 \
--resolve speed.cloudflare.com:443:"$IP_ADDRESS" \
--header "Connection: Upgrade" \
--header "Upgrade: websocket" \
--header "Host: speed.cloudflare.com" \
--header "Origin: https://speed.cloudflare.com" \
--header "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" \
--header "Sec-WebSocket-Version: 13" \
"https://speed.cloudflare.com/" --silent --output /dev/null --write-out "%{http_code}")
# 检查 HTTP 响应码
if [[ "$HTTP_RESPONSE" == "101" ]]; then
echo "$IP_ADDRESS" >> "$IP_USE_FILE"
echo "WebSocket connection success: HTTP 101 Switching Protocols"
else
echo "WebSocket connection failed: HTTP response was $HTTP_RESPONSE or connection timed out"
# 从 final_ips.txt 删除无法建立 WebSocket 连接的 IP
sed -i "/$IP_ADDRESS/d" final_ips.txt
fi
done < final_ips.txt
echo "WebSocket tests completed. IPs with successful WebSocket connections are written to $IP_USE_FILE"
# Cloudflare DDNS 更新部分
# 以下变量需要填写
API_KEY="your_cloudflare_global_api_key"
EMAIL="your_email@example.com"
ZONE_ID="your_zone_id"
DOMAIN="your_domain.com"
SUBDOMAIN="sub.your_domain.com"
TTL=300
# 使用Cloudflare API获取子域名的所有A记录
records=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?type=A&name=${SUBDOMAIN}" \
-H "X-Auth-Email: ${EMAIL}" \
-H "X-Auth-Key: ${API_KEY}" \
-H "Content-Type: application/json")
# 从返回值中提取出所有A记录的ID
record_ids=$(echo "$records" | jq -r '.result[].id')
# 遍历所有A记录的ID并使用Cloudflare API删除DNS记录
for record_id in $record_ids
do
response=$(curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${record_id}" \
-H "X-Auth-Email: ${EMAIL}" \
-H "X-Auth-Key: ${API_KEY}" \
-H "Content-Type: application/json")
if echo "$response" | grep -q '"success":true'; then
echo "DNS record with ID $record_id deleted successfully"
else
echo "Failed to delete DNS record with ID $record_id"
fi
done
# 从final_ips.txt文件中读取IP地址并使用Cloudflare API添加DNS记录
while IFS= read -r ip
do
# 使用Cloudflare API添加DNS记录
response=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records" \
-H "X-Auth-Email: ${EMAIL}" \
-H "X-Auth-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"'${SUBDOMAIN}'","content":"'${ip}'","ttl":'${TTL}',"proxied":false}')
# 检查返回值中的success字段是否为true
if echo "$response" | grep -q '"success":true'; then
echo "DNS record for IP $ip added successfully"
else
echo "Failed to add DNS record for IP $ip"
fi
done < ip_use.txt
# 删除临时文件
rm -rf ip.txt final_ips.txt ip_use.txt