Upload files to "/"

This commit is contained in:
mike 2026-04-27 10:40:48 +08:00
parent b6dfad4310
commit 39da16bad1
1 changed files with 304 additions and 0 deletions

304
check_tiktok.sh Normal file
View File

@ -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 "$@"