feat(tcaptcha): 完成腾讯天御TDC虚拟机纯算法逆向还原与100%纯Python独立客户端

This commit is contained in:
yml2213
2026-09-12 00:02:32 +08:00
parent 5220c67a99
commit c774d09bdd
2 changed files with 321 additions and 17 deletions
+9 -17
View File
@@ -15,18 +15,18 @@ import json
import logging
import random
import re
import subprocess
import sys
import time
from pathlib import Path
from typing import Dict, List, Optional, Tuple
import httpx
PROJECT_ROOT = Path(__file__).resolve().parent.parent
if str(PROJECT_ROOT) not in sys.path:
sys.path.insert(0, str(PROJECT_ROOT))
import httpx
from tcaptcha.crypto import extract_eks, generate_collect
from tcaptcha.solver import CaptchaSolver
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
@@ -36,7 +36,6 @@ logger = logging.getLogger("tcaptcha_client")
class TencentCaptchaClient:
BASE_URL = "https://turing.captcha.qcloud.com"
DEFAULT_AID = "2039519451"
WORKER_SCRIPT = PROJECT_ROOT / "tcaptcha/tdc_worker.js"
def __init__(
self,
@@ -76,20 +75,13 @@ class TencentCaptchaClient:
raise RuntimeError(f"PoW MD5 collision search failed for prefix {prefix}")
def _generate_telemetry(self, tdc_code: str, click_points: List[Tuple[int, int]]) -> Dict[str, str]:
"""通过 Node.js 沙箱运行 tdc.js 生成真实行为轨迹遥测数据"""
points_arg = json.dumps([[int(p[0]), int(p[1])] for p in click_points])
proc = subprocess.run(
["node", str(self.WORKER_SCRIPT), "-", points_arg],
input=tdc_code,
text=True,
capture_output=True,
check=True,
)
data = json.loads(proc.stdout.strip())
"""纯 Python 算法生成真实行为轨迹与遥测密文 collect 及 eks (100% 纯算免 Node.js)"""
eks = extract_eks(tdc_code)
collect = generate_collect(click_points, aid=self.aid, user_agent=self.user_agent)
return {
"collect": data.get("collect", ""),
"tlg": str(data.get("tlg", 0)),
"eks": data.get("eks", ""),
"collect": collect,
"tlg": str(len(collect)),
"eks": eks,
}
def solve(self, max_retries: int = 2) -> Dict: