Upload files to "/"
This commit is contained in:
parent
b6dfad4310
commit
39da16bad1
|
|
@ -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 "$@"
|
||||
Loading…
Reference in New Issue