#!/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