AC2100/check_tiktok.sh

305 lines
9.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"