diff --git a/tiktok_real_check.sh b/tiktok_real_check.sh new file mode 100644 index 0000000..1ba4e23 --- /dev/null +++ b/tiktok_real_check.sh @@ -0,0 +1,165 @@ +#!/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