223 lines
6.1 KiB
Bash
Executable File
223 lines
6.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# 代理域名管理器
|
|
# 功能:检查域名是否需要代理,自动添加到列表
|
|
# 用法:
|
|
# ./proxy-domain-check.sh check <域名> - 检查域名是否需要代理
|
|
# ./proxy-domain-check.sh add <域名> - 手动添加域名到列表
|
|
# ./proxy-domain-check.sh list - 显示当前列表
|
|
# ./proxy-domain-check.sh test <域名> - 测试域名直连和代理访问
|
|
|
|
PROXY_MANAGER_DIR="/root/.openclaw/scripts/proxy-manager"
|
|
DOMAIN_LIST="${PROXY_MANAGER_DIR}/proxy-domains.txt"
|
|
LOG_FILE="${PROXY_MANAGER_DIR}/access.log"
|
|
PROXY_URL="http://192.168.0.66:7890" # 代理地址
|
|
TIMEOUT=5
|
|
|
|
mkdir -p "$PROXY_MANAGER_DIR"
|
|
touch "$DOMAIN_LIST"
|
|
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
|
}
|
|
|
|
# 提取域名(去除协议和路径)
|
|
extract_domain() {
|
|
local url="$1"
|
|
# 去除 http:// https://
|
|
url="${url#http://}"
|
|
url="${url#https://}"
|
|
# 去除路径
|
|
url="${url%%/*}"
|
|
# 去除端口
|
|
url="${url%%:*}"
|
|
echo "$url"
|
|
}
|
|
|
|
# 检查域名是否在列表中
|
|
is_proxy_required() {
|
|
local domain="$1"
|
|
local base_domain=$(echo "$domain" | sed 's/^www\.//')
|
|
|
|
# 检查完整域名和各级父域名
|
|
while [ -n "$base_domain" ]; do
|
|
# 直接匹配
|
|
if grep -q "^${base_domain}$" "$DOMAIN_LIST" 2>/dev/null; then
|
|
return 0
|
|
fi
|
|
# 通配符匹配
|
|
if grep -q "^\*\.$base_domain$" "$DOMAIN_LIST" 2>/dev/null; then
|
|
return 0
|
|
fi
|
|
# 父域名(去掉一级)
|
|
base_domain="${base_domain#*.}"
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# 测试直连是否可用
|
|
test_direct() {
|
|
local domain="$1"
|
|
local result
|
|
|
|
# 尝试使用 curl 直连
|
|
result=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$TIMEOUT" \
|
|
--resolve "${domain}:443:8.8.8.8" \
|
|
"https://${domain}" 2>/dev/null || echo "FAILED")
|
|
|
|
if [ "$result" = "200" ] || [ "$result" = "301" ] || [ "$result" = "302" ]; then
|
|
return 0 # 直连成功
|
|
fi
|
|
# 尝试 HTTP
|
|
result=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$TIMEOUT" \
|
|
--resolve "${domain}:80:8.8.8.8" \
|
|
"http://${domain}" 2>/dev/null || echo "FAILED")
|
|
|
|
if [ "$result" = "200" ] || [ "$result" = "301" ] || [ "$result" = "302" ]; then
|
|
return 0
|
|
fi
|
|
return 1 # 直连失败
|
|
}
|
|
|
|
# 测试代理是否可用
|
|
test_proxy() {
|
|
local domain="$1"
|
|
local result
|
|
|
|
result=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$TIMEOUT" \
|
|
--proxy "$PROXY_URL" \
|
|
"https://${domain}" 2>/dev/null || echo "FAILED")
|
|
|
|
if [ "$result" = "200" ] || [ "$result" = "301" ] || [ "$result" = "302" ]; then
|
|
return 0 # 代理成功
|
|
fi
|
|
return 1 # 代理失败
|
|
}
|
|
|
|
# 检查并自动添加域名
|
|
check_and_add() {
|
|
local domain="$1"
|
|
local action="$2" # auto 或 manual
|
|
|
|
if is_proxy_required "$domain"; then
|
|
echo "⛔ 域名 '$domain' 已在代理列表中"
|
|
log "SKIP: $domain - already in list"
|
|
return 1
|
|
fi
|
|
|
|
echo "🔍 检测域名: $domain"
|
|
log "CHECK: $domain"
|
|
|
|
# 测试直连
|
|
if test_direct "$domain"; then
|
|
echo "✅ 直连可用,无需代理"
|
|
log "OK: $domain - direct access works"
|
|
return 0
|
|
fi
|
|
|
|
# 测试代理
|
|
if test_proxy "$domain"; then
|
|
echo "🌐 直连失败,代理可用,添加到列表"
|
|
log "ADD: $domain - proxy required"
|
|
|
|
# 添加到列表
|
|
echo "$domain" >> "$DOMAIN_LIST"
|
|
echo "✅ 已添加 '$domain' 到代理列表"
|
|
|
|
# 发送 Telegram 通知(如果配置)
|
|
if [ -f "${PROXY_MANAGER_DIR}/../send-session-alert.sh" ]; then
|
|
bash "${PROXY_MANAGER_DIR}/../send-session-alert.sh" "proxy" "$domain" "代理访问已添加"
|
|
fi
|
|
return 0
|
|
fi
|
|
|
|
echo "❌ 直连和代理都无法访问"
|
|
log "FAIL: $domain - neither direct nor proxy works"
|
|
return 1
|
|
}
|
|
|
|
# 手动添加域名
|
|
add_domain() {
|
|
local domain="$1"
|
|
|
|
# 提取纯域名
|
|
domain=$(extract_domain "$domain")
|
|
|
|
if is_proxy_required "$domain"; then
|
|
echo "⛔ '$domain' 已在代理列表中"
|
|
return 1
|
|
fi
|
|
|
|
echo "$domain" >> "$DOMAIN_LIST"
|
|
echo "✅ 已添加 '$domain' 到代理列表"
|
|
log "MANUAL_ADD: $domain"
|
|
}
|
|
|
|
# 显示列表
|
|
show_list() {
|
|
echo "📋 代理域名列表 (共 $(grep -c '^[^#]' "$DOMAIN_LIST") 个):"
|
|
echo "----------------------------------------"
|
|
grep -v '^#' "$DOMAIN_LIST" | grep -v '^$' | sort
|
|
echo "----------------------------------------"
|
|
}
|
|
|
|
# 主命令处理
|
|
case "$1" in
|
|
check)
|
|
if [ -z "$2" ]; then
|
|
echo "用法: $0 check <域名>"
|
|
exit 1
|
|
fi
|
|
domain=$(extract_domain "$2")
|
|
check_and_add "$domain" auto
|
|
;;
|
|
add)
|
|
if [ -z "$2" ]; then
|
|
echo "用法: $0 add <域名>"
|
|
exit 1
|
|
fi
|
|
add_domain "$2"
|
|
;;
|
|
list)
|
|
show_list
|
|
;;
|
|
test)
|
|
if [ -z "$2" ]; then
|
|
echo "用法: $0 test <域名>"
|
|
exit 1
|
|
fi
|
|
domain=$(extract_domain "$2")
|
|
echo "🌐 测试域名: $domain"
|
|
echo ""
|
|
echo "直连测试:"
|
|
if test_direct "$domain"; then
|
|
echo " ✅ 成功"
|
|
else
|
|
echo " ❌ 失败"
|
|
fi
|
|
echo ""
|
|
echo "代理测试:"
|
|
if test_proxy "$domain"; then
|
|
echo " ✅ 成功"
|
|
else
|
|
echo " ❌ 失败"
|
|
fi
|
|
;;
|
|
*)
|
|
echo "代理域名管理器 v1.0"
|
|
echo ""
|
|
echo "用法: $0 <命令> [参数]"
|
|
echo ""
|
|
echo "命令:"
|
|
echo " check <域名> - 检查域名,自动添加到列表(如需要)"
|
|
echo " add <域名> - 手动添加域名到列表"
|
|
echo " list - 显示当前代理域名列表"
|
|
echo " test <域名> - 测试直连和代理访问"
|
|
echo ""
|
|
echo "示例:"
|
|
echo " $0 check google.com"
|
|
echo " $0 add twitter.com"
|
|
echo " $0 list"
|
|
echo " $0 test youtube.com"
|
|
;;
|
|
esac
|