AC2100/tiktok_real_check.sh

166 lines
6.3 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 真实可访问性检测脚本 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