diff --git a/check_tiktok.sh b/check_tiktok.sh new file mode 100644 index 0000000..9b75a2c --- /dev/null +++ b/check_tiktok.sh @@ -0,0 +1,304 @@ +#!/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 "$@"