Archived
Public Access
Use Speedtest API for China server lookup
This commit is contained in:
@@ -191,7 +191,7 @@ net.ipv4.tcp_slow_start_after_idle = 0
|
|||||||
10. BBR v3 智能带宽优化
|
10. BBR v3 智能带宽优化
|
||||||
```
|
```
|
||||||
|
|
||||||
脚本会优先安装并运行 Ookla 官方 `speedtest`,要求用户在中国移动、中国联通、中国电信中选择一个运营商,然后优先尝试中国境内最近的匹配测速节点并获取上传带宽、下载带宽和 Ping;如果找不到匹配节点,会降级为香港节点,最后才使用 Ookla 自动选择。测速失败时会提示手动输入上传带宽。
|
脚本会优先安装并运行 Ookla 官方 `speedtest`,要求用户在中国移动、中国联通、中国电信中选择一个运营商,然后通过 Speedtest server API 查找中国境内匹配测速节点并获取上传带宽、下载带宽和 Ping;如果找不到匹配节点,会降级为香港节点,最后才使用 Ookla 自动选择。测速失败时会提示手动输入上传带宽。
|
||||||
|
|
||||||
优化逻辑:
|
优化逻辑:
|
||||||
|
|
||||||
|
|||||||
+33
-31
@@ -44,6 +44,7 @@ MODULES_CONF="/etc/modules-load.d/joeyblog-qdisc.conf"
|
|||||||
SECURITY_MODPROBE_CONF="/etc/modprobe.d/99-joeyblog-security.conf"
|
SECURITY_MODPROBE_CONF="/etc/modprobe.d/99-joeyblog-security.conf"
|
||||||
# 可选:提升 GitHub API 限额(支持 GITHUB_TOKEN / GH_TOKEN)
|
# 可选:提升 GitHub API 限额(支持 GITHUB_TOKEN / GH_TOKEN)
|
||||||
GITHUB_API_TOKEN="${GITHUB_TOKEN:-${GH_TOKEN:-}}"
|
GITHUB_API_TOKEN="${GITHUB_TOKEN:-${GH_TOKEN:-}}"
|
||||||
|
SPEEDTEST_BIN="speedtest"
|
||||||
|
|
||||||
gh_api_get() {
|
gh_api_get() {
|
||||||
local url="$1"
|
local url="$1"
|
||||||
@@ -193,7 +194,9 @@ calculate_smart_buffer_mb() {
|
|||||||
|
|
||||||
# 函数:确保 Ookla 官方 speedtest 可用
|
# 函数:确保 Ookla 官方 speedtest 可用
|
||||||
ensure_ookla_speedtest() {
|
ensure_ookla_speedtest() {
|
||||||
if command -v speedtest > /dev/null 2>&1; then
|
if command -v speedtest > /dev/null 2>&1 \
|
||||||
|
&& speedtest --version 2>&1 | grep -q "Speedtest by Ookla"; then
|
||||||
|
SPEEDTEST_BIN=$(command -v speedtest)
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -222,7 +225,9 @@ ensure_ookla_speedtest() {
|
|||||||
sudo mv speedtest /usr/local/bin/speedtest
|
sudo mv speedtest /usr/local/bin/speedtest
|
||||||
sudo chmod +x /usr/local/bin/speedtest
|
sudo chmod +x /usr/local/bin/speedtest
|
||||||
rm -f speedtest.tgz speedtest.5 speedtest.md
|
rm -f speedtest.tgz speedtest.5 speedtest.md
|
||||||
)
|
) || return 1
|
||||||
|
|
||||||
|
SPEEDTEST_BIN="/usr/local/bin/speedtest"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:选择中国境内测速运营商
|
# 函数:选择中国境内测速运营商
|
||||||
@@ -240,17 +245,17 @@ select_china_speedtest_isp() {
|
|||||||
case "$choice" in
|
case "$choice" in
|
||||||
1)
|
1)
|
||||||
SPEEDTEST_ISP_LABEL="中国移动"
|
SPEEDTEST_ISP_LABEL="中国移动"
|
||||||
SPEEDTEST_ISP_PATTERN='(Mobile|CMCC|China Mobile|中国移动|移动)'
|
SPEEDTEST_SEARCH_QUERY="China%20Mobile"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
SPEEDTEST_ISP_LABEL="中国联通"
|
SPEEDTEST_ISP_LABEL="中国联通"
|
||||||
SPEEDTEST_ISP_PATTERN='(Unicom|CUCC|China Unicom|中国联通|联通)'
|
SPEEDTEST_SEARCH_QUERY="China%20Unicom"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
3)
|
3)
|
||||||
SPEEDTEST_ISP_LABEL="中国电信"
|
SPEEDTEST_ISP_LABEL="中国电信"
|
||||||
SPEEDTEST_ISP_PATTERN='(Telecom|CTCC|China Telecom|中国电信|电信)'
|
SPEEDTEST_SEARCH_QUERY="China%20Telecom"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -260,36 +265,33 @@ select_china_speedtest_isp() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:从 Ookla server list 中筛选中国境内节点
|
# 函数:从 Speedtest server API 中搜索节点
|
||||||
get_china_speedtest_servers() {
|
get_speedtest_api_servers() {
|
||||||
local isp_pattern="$1"
|
local search_query="$1"
|
||||||
local server_output
|
local country_code="$2"
|
||||||
local china_pattern='(China|Beijing|Shanghai|Guangzhou|Shenzhen|Hangzhou|Nanjing|Wuhan|Chengdu|Chongqing|Tianjin|Xi.?an|Zhengzhou|Changsha|Jinan|Qingdao|Fuzhou|Xiamen|Hefei|Suzhou|Ningbo|Dongguan|Foshan|中国|北京|上海|广州|深圳|杭州|南京|武汉|成都|重庆|天津|西安|郑州|长沙|济南|青岛|福州|厦门|合肥|苏州|宁波|东莞|佛山)'
|
local response
|
||||||
|
|
||||||
server_output=$(speedtest --accept-license --accept-gdpr --servers 2>/dev/null || true)
|
response=$(curl -fsSL "https://www.speedtest.net/api/js/servers?engine=js&search=${search_query}" 2>/dev/null || true)
|
||||||
if [[ -z "$server_output" ]]; then
|
if [[ -z "$response" ]]; then
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$server_output" \
|
echo "$response" | jq -r --arg cc "$country_code" '
|
||||||
| grep -Ei "$china_pattern" \
|
.[]
|
||||||
| grep -Ei "$isp_pattern" \
|
| select((.cc // "") == $cc)
|
||||||
| sed -nE 's/^[[:space:]]*([0-9]+).*/\1/p'
|
| .id
|
||||||
|
' 2>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:从 Ookla server list 中筛选香港节点
|
# 函数:从 Speedtest server API 中筛选中国境内节点
|
||||||
|
get_china_speedtest_servers() {
|
||||||
|
local search_query="$1"
|
||||||
|
get_speedtest_api_servers "$search_query" "CN"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 函数:从 Speedtest server API 中筛选香港节点
|
||||||
get_hongkong_speedtest_servers() {
|
get_hongkong_speedtest_servers() {
|
||||||
local server_output
|
get_speedtest_api_servers "Hong%20Kong" "HK"
|
||||||
local hongkong_pattern='(Hong[ -]?Kong|Hongkong|香港|HKBN|HKT|CMHK|SmarTone|HGC|PCCW|Netvigator)'
|
|
||||||
|
|
||||||
server_output=$(speedtest --accept-license --accept-gdpr --servers 2>/dev/null || true)
|
|
||||||
if [[ -z "$server_output" ]]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$server_output" \
|
|
||||||
| grep -Ei "$hongkong_pattern" \
|
|
||||||
| sed -nE 's/^[[:space:]]*([0-9]+).*/\1/p'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:运行 Ookla Speedtest 并解析 Ping/Download/Upload
|
# 函数:运行 Ookla Speedtest 并解析 Ping/Download/Upload
|
||||||
@@ -306,7 +308,7 @@ run_speedtest_measurement() {
|
|||||||
local servers_list
|
local servers_list
|
||||||
local speedtest_output=""
|
local speedtest_output=""
|
||||||
local attempt=0
|
local attempt=0
|
||||||
servers_list=$(get_china_speedtest_servers "$SPEEDTEST_ISP_PATTERN" | head -n 10)
|
servers_list=$(get_china_speedtest_servers "$SPEEDTEST_SEARCH_QUERY" | head -n 10)
|
||||||
if [[ -z "$servers_list" ]]; then
|
if [[ -z "$servers_list" ]]; then
|
||||||
echo -e "\033[33m⚠ 未找到匹配运营商的中国境内节点,改用香港节点。\033[0m"
|
echo -e "\033[33m⚠ 未找到匹配运营商的中国境内节点,改用香港节点。\033[0m"
|
||||||
servers_list=$(get_hongkong_speedtest_servers | head -n 10)
|
servers_list=$(get_hongkong_speedtest_servers | head -n 10)
|
||||||
@@ -323,9 +325,9 @@ run_speedtest_measurement() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$server_id" == "auto" ]]; then
|
if [[ "$server_id" == "auto" ]]; then
|
||||||
speedtest_output=$(speedtest --accept-license --accept-gdpr 2>&1)
|
speedtest_output=$("$SPEEDTEST_BIN" --accept-license --accept-gdpr 2>&1)
|
||||||
else
|
else
|
||||||
speedtest_output=$(speedtest --accept-license --accept-gdpr --server-id="$server_id" 2>&1)
|
speedtest_output=$("$SPEEDTEST_BIN" --accept-license --accept-gdpr --server-id="$server_id" 2>&1)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SPEEDTEST_PING=$(echo "$speedtest_output" | sed -nE 's/.*(Idle Latency|Latency|Ping):[[:space:]]*([0-9]+(\.[0-9]+)?).*/\2/p' | head -n1)
|
SPEEDTEST_PING=$(echo "$speedtest_output" | sed -nE 's/.*(Idle Latency|Latency|Ping):[[:space:]]*([0-9]+(\.[0-9]+)?).*/\2/p' | head -n1)
|
||||||
|
|||||||
Reference in New Issue
Block a user