#!/bin/bash # ============================================================ # TikTok 可访问性检测脚本 # 适用系统: Debian / Ubuntu VPS # 作者: Claude # ============================================================ # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' # No Color # 超时时间(秒) TIMEOUT=10 # 检测目标列表 declare -A TARGETS=( ["TikTok 主站"]="www.tiktok.com" ["TikTok API"]="api.tiktok.com" ["TikTok 直播"]="live.tiktok.com" ["TikTok 静态资源"]="sf16-website-login.neutral.ttwstatic.com" ["TikTok CDN"]="p16-sign-va.tiktokcdn.com" ) # HTTP 检测目标 declare -A HTTP_TARGETS=( ["TikTok 主站 HTTPS"]="https://www.tiktok.com" ["TikTok m站"]="https://m.tiktok.com" ) # ============================================================ # 工具函数 # ============================================================ print_banner() { echo "" echo -e "${CYAN}${BOLD}╔══════════════════════════════════════════════╗${NC}" echo -e "${CYAN}${BOLD}║ TikTok 可访问性检测脚本 v1.0 ║${NC}" echo -e "${CYAN}${BOLD}╚══════════════════════════════════════════════╝${NC}" echo "" } print_section() { echo "" echo -e "${BOLD}─── $1 ───────────────────────────────────${NC}" } check_command() { command -v "$1" &>/dev/null } install_tool() { local tool=$1 echo -e "${YELLOW}[!] 正在安装 $tool ...${NC}" apt-get install -y "$tool" -qq &>/dev/null if check_command "$tool"; then echo -e "${GREEN}[✓] $tool 安装成功${NC}" else echo -e "${RED}[✗] $tool 安装失败,请手动安装${NC}" fi } check_dependencies() { print_section "环境检查" local missing=() for cmd in curl ping dig; do if check_command "$cmd"; then echo -e " ${GREEN}✓${NC} $cmd 已安装" else echo -e " ${RED}✗${NC} $cmd 未安装" missing+=("$cmd") fi done if [ ${#missing[@]} -gt 0 ]; then echo "" echo -e "${YELLOW}[!] 检测到缺少工具,尝试自动安装...${NC}" if [ "$EUID" -ne 0 ]; then echo -e "${RED}[✗] 需要 root 权限安装依赖,请使用 sudo 运行此脚本${NC}" exit 1 fi apt-get update -qq &>/dev/null for tool in "${missing[@]}"; do case "$tool" in dig) install_tool "dnsutils" ;; *) install_tool "$tool" ;; esac done fi } # ============================================================ # 检测函数 # ============================================================ check_dns() { print_section "DNS 解析检测" local pass=0 local fail=0 for name in "${!TARGETS[@]}"; do local domain="${TARGETS[$name]}" local result result=$(dig +short "$domain" 2>/dev/null | head -1) if [ -n "$result" ]; then echo -e " ${GREEN}✓${NC} ${name} (${domain})" echo -e " 解析 IP: ${CYAN}${result}${NC}" ((pass++)) else echo -e " ${RED}✗${NC} ${name} (${domain})" echo -e " ${RED}DNS 解析失败${NC}" ((fail++)) fi done echo "" echo -e " DNS 检测结果: ${GREEN}${pass} 成功${NC} / ${RED}${fail} 失败${NC}" return $fail } check_ping() { print_section "PING 连通性检测" local pass=0 local fail=0 for name in "${!TARGETS[@]}"; do local domain="${TARGETS[$name]}" local result result=$(ping -c 3 -W "$TIMEOUT" "$domain" 2>/dev/null | tail -1) if echo "$result" | grep -qE "min/avg/max"; then local avg avg=$(echo "$result" | awk -F'/' '{print $5}') echo -e " ${GREEN}✓${NC} ${name}" echo -e " 平均延迟: ${CYAN}${avg} ms${NC}" ((pass++)) else echo -e " ${RED}✗${NC} ${name} (${domain}) — ${RED}PING 超时或不可达${NC}" ((fail++)) fi done echo "" echo -e " PING 检测结果: ${GREEN}${pass} 成功${NC} / ${RED}${fail} 失败${NC}" return $fail } check_http() { print_section "HTTP/HTTPS 访问检测" local pass=0 local fail=0 for name in "${!HTTP_TARGETS[@]}"; do local url="${HTTP_TARGETS[$name]}" local http_code local time_total http_code=$(curl -o /dev/null -s -w "%{http_code}" \ --max-time "$TIMEOUT" \ --connect-timeout 5 \ -L \ -A "Mozilla/5.0 (Linux x86_64) AppleWebKit/537.36" \ "$url" 2>/dev/null) time_total=$(curl -o /dev/null -s -w "%{time_total}" \ --max-time "$TIMEOUT" \ --connect-timeout 5 \ -L \ -A "Mozilla/5.0 (Linux x86_64) AppleWebKit/537.36" \ "$url" 2>/dev/null) if [[ "$http_code" =~ ^(200|301|302|303|307|308)$ ]]; then echo -e " ${GREEN}✓${NC} ${name}" echo -e " HTTP 状态码: ${CYAN}${http_code}${NC} 响应时间: ${CYAN}${time_total}s${NC}" ((pass++)) elif [[ "$http_code" == "000" ]]; then echo -e " ${RED}✗${NC} ${name}" echo -e " ${RED}连接失败 (超时或被拦截)${NC}" ((fail++)) else echo -e " ${YELLOW}~${NC} ${name}" echo -e " HTTP 状态码: ${YELLOW}${http_code}${NC} (可能受限)" ((fail++)) fi done echo "" echo -e " HTTP 检测结果: ${GREEN}${pass} 成功${NC} / ${RED}${fail} 失败${NC}" return $fail } check_tcp_port() { print_section "TCP 端口检测 (443/HTTPS)" local pass=0 local fail=0 for name in "${!TARGETS[@]}"; do local domain="${TARGETS[$name]}" if timeout "$TIMEOUT" bash -c "echo >/dev/tcp/${domain}/443" 2>/dev/null; then echo -e " ${GREEN}✓${NC} ${name}:443 — ${GREEN}端口开放${NC}" ((pass++)) else echo -e " ${RED}✗${NC} ${name}:443 — ${RED}端口不可达${NC}" ((fail++)) fi done echo "" echo -e " TCP 检测结果: ${GREEN}${pass} 成功${NC} / ${RED}${fail} 失败${NC}" return $fail } check_ip_info() { print_section "本机出口 IP 信息" local ip ip=$(curl -s --max-time 5 https://api.ipify.org 2>/dev/null) if [ -n "$ip" ]; then echo -e " 出口 IP: ${CYAN}${BOLD}${ip}${NC}" local geo geo=$(curl -s --max-time 5 "https://ipapi.co/${ip}/json/" 2>/dev/null) if [ -n "$geo" ]; then local country city org country=$(echo "$geo" | grep -o '"country_name": *"[^"]*"' | cut -d'"' -f4) city=$(echo "$geo" | grep -o '"city": *"[^"]*"' | cut -d'"' -f4) org=$(echo "$geo" | grep -o '"org": *"[^"]*"' | cut -d'"' -f4) echo -e " 归属地: ${CYAN}${country} ${city}${NC}" echo -e " 运营商: ${CYAN}${org}${NC}" # TikTok 封锁国家提示 local blocked_countries=("CN" "IR" "IN") local country_code country_code=$(echo "$geo" | grep -o '"country_code": *"[^"]*"' | cut -d'"' -f4) for bc in "${blocked_countries[@]}"; do if [ "$country_code" == "$bc" ]; then echo "" echo -e " ${RED}⚠ 警告: 当前 IP 归属地 (${country}) 可能受 TikTok 地区限制${NC}" fi done fi else echo -e " ${RED}✗ 无法获取出口 IP${NC}" fi } print_summary() { local dns_fail=$1 local ping_fail=$2 local http_fail=$3 local tcp_fail=$4 print_section "综合判断" local total_fail=$((dns_fail + http_fail + tcp_fail)) if [ "$total_fail" -eq 0 ]; then echo -e " ${GREEN}${BOLD}✅ TikTok 可正常访问!${NC}" echo -e " DNS 解析、HTTP 请求、TCP 端口均通过检测。" elif [ "$http_fail" -eq 0 ] && [ "$dns_fail" -eq 0 ]; then echo -e " ${GREEN}${BOLD}✅ TikTok 基本可访问${NC}" echo -e " HTTP/DNS 检测通过,部分节点可能有延迟。" elif [ "$dns_fail" -gt 0 ] && [ "$http_fail" -gt 0 ]; then echo -e " ${RED}${BOLD}❌ TikTok 无法访问${NC}" echo -e " DNS 和 HTTP 均检测失败,IP 可能被封锁或地区受限。" else echo -e " ${YELLOW}${BOLD}⚠ TikTok 访问受限${NC}" echo -e " 部分检测项失败,访问可能不稳定。" fi echo "" echo -e " 检测时间: $(date '+%Y-%m-%d %H:%M:%S %Z')" echo "" echo -e "${CYAN}${BOLD}══════════════════════════════════════════════════${NC}" echo "" } # ============================================================ # 主流程 # ============================================================ main() { print_banner check_dependencies check_ip_info check_dns local dns_fail=$? check_tcp_port local tcp_fail=$? check_http local http_fail=$? check_ping local ping_fail=$? print_summary "$dns_fail" "$ping_fail" "$http_fail" "$tcp_fail" } main "$@"