#!/bin/bash # ============================================================ # TikTok 真实可访问性检测脚本 v1.0 # 检测原理: 先通过美国 VPS DNS 解析 TikTok 域名, # 再用解析到的 IP 发起实际 HTTP 请求, # 模拟手机/设备的真实访问行为 # ============================================================ Font_Red="\033[31m" Font_Green="\033[32m" Font_Yellow="\033[33m" Font_SkyBlue="\033[36m" Font_Suffix="\033[0m" Font_Bold="\033[1m" # 美国 VPS DNS 服务器 US_DNS="142.171.202.195" UA_Browser="Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1" print_banner() { echo "" echo -e "${Font_SkyBlue}${Font_Bold}╔══════════════════════════════════════════════╗${Font_Suffix}" echo -e "${Font_SkyBlue}${Font_Bold}║ TikTok 真实访问检测脚本 v1.0 ║${Font_Suffix}" echo -e "${Font_SkyBlue}${Font_Bold}╚══════════════════════════════════════════════╝${Font_Suffix}" echo -e " 测试时间: $(date)" echo "" } get_ip_info() { local ip ip=$(curl -4 -s --max-time 8 https://api64.ipify.org 2>/dev/null) local ip_mask ip_mask=$(awk -F"." '{print $1"."$2".*.*"}' <<<"${ip}") local isp isp=$(curl -s -4 --max-time 8 "https://api.ip.sb/geoip/${ip}" 2>/dev/null | grep '"organization"' | cut -f4 -d'"') echo -e " ${Font_SkyBlue}本机出口: ${isp:-未知} (${ip_mask})${Font_Suffix}" echo -e " ${Font_SkyBlue}使用 DNS: ${US_DNS} (美国 VPS)${Font_Suffix}" echo "" } check_dns_resolution() { echo -n -e " [1/3] DNS 解析测试..." local resolved_ip resolved_ip=$(dig +short @"$US_DNS" www.tiktok.com A 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -1) if [ -n "$resolved_ip" ]; then echo -e "\r [1/3] DNS 解析测试 ${Font_Green}✅ 成功${Font_Suffix} → ${Font_SkyBlue}${resolved_ip}${Font_Suffix}" echo "$resolved_ip" return 0 else echo -e "\r [1/3] DNS 解析测试 ${Font_Red}❌ 失败(无法通过美国 DNS 解析)${Font_Suffix}" return 1 fi } check_tcp_connect() { local ip=$1 echo -n -e " [2/3] TCP 连接测试..." if timeout 8 bash -c "echo >/dev/tcp/${ip}/443" 2>/dev/null; then echo -e "\r [2/3] TCP 连接测试 ${Font_Green}✅ 成功${Font_Suffix} → ${Font_SkyBlue}${ip}:443 可达${Font_Suffix}" return 0 else echo -e "\r [2/3] TCP 连接测试 ${Font_Red}❌ 失败(${ip}:443 不可达)${Font_Suffix}" return 1 fi } check_http_access() { local ip=$1 echo -n -e " [3/3] HTTP 访问测试..." # 用解析到的 IP 直接请求,通过 Host 头指定域名(模拟设备真实访问) local result result=$(curl \ --resolve "www.tiktok.com:443:${ip}" \ --user-agent "${UA_Browser}" \ -sL --max-time 15 \ -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \ -H "Accept-Encoding: gzip" \ -H "Accept-Language: en-US,en;q=0.9" \ "https://www.tiktok.com/" 2>/dev/null | gunzip 2>/dev/null) local region region=$(echo "$result" | grep -o '"region":"[^"]*"' | head -1 | cut -f4 -d'"') if [ -n "$region" ]; then echo -e "\r [3/3] HTTP 访问测试 ${Font_Green}✅ 成功${Font_Suffix} → TikTok Region: ${Font_Green}【${region}】${Font_Suffix}" return 0 fi # 尝试不带 gzip local result2 result2=$(curl \ --resolve "www.tiktok.com:443:${ip}" \ --user-agent "${UA_Browser}" \ -s --max-time 15 \ -H "Accept-Language: en-US,en;q=0.9" \ "https://www.tiktok.com/" 2>/dev/null) local region2 region2=$(echo "$result2" | grep -o '"region":"[^"]*"' | head -1 | cut -f4 -d'"') if [ -n "$region2" ]; then echo -e "\r [3/3] HTTP 访问测试 ${Font_Green}✅ 成功${Font_Suffix} → TikTok Region: ${Font_Green}【${region2}】${Font_Suffix}" return 0 fi local http_code http_code=$(curl \ --resolve "www.tiktok.com:443:${ip}" \ --user-agent "${UA_Browser}" \ -s -o /dev/null -w "%{http_code}" \ --max-time 10 \ "https://www.tiktok.com/" 2>/dev/null) if [[ "$http_code" =~ ^(200|301|302)$ ]]; then echo -e "\r [3/3] HTTP 访问测试 ${Font_Yellow}⚠️ 可连接${Font_Suffix}(HTTP ${http_code},未获取到 region,可能为 IDC IP)" return 0 else echo -e "\r [3/3] HTTP 访问测试 ${Font_Red}❌ 失败${Font_Suffix}(HTTP ${http_code:-超时})" return 1 fi } print_summary() { local result=$1 echo "" if [ "$result" -eq 0 ]; then echo -e " ${Font_Green}${Font_Bold}══════════════════════════════════════════${Font_Suffix}" echo -e " ${Font_Green}${Font_Bold} ✅ 结论:设备通过此 DNS 可正常访问 TikTok${Font_Suffix}" echo -e " ${Font_Green}${Font_Bold}══════════════════════════════════════════${Font_Suffix}" else echo -e " ${Font_Red}${Font_Bold}══════════════════════════════════════════${Font_Suffix}" echo -e " ${Font_Red}${Font_Bold} ❌ 结论:设备通过此 DNS 无法访问 TikTok${Font_Suffix}" echo -e " ${Font_Red}${Font_Bold}══════════════════════════════════════════${Font_Suffix}" fi echo "" } # ── 主流程 ────────────────────────────────────── print_banner get_ip_info resolved_ip=$(check_dns_resolution) dns_ok=$? if [ $dns_ok -ne 0 ]; then print_summary 1 exit 1 fi check_tcp_connect "$resolved_ip" tcp_ok=$? if [ $tcp_ok -ne 0 ]; then print_summary 1 exit 1 fi check_http_access "$resolved_ip" http_ok=$? print_summary $http_ok