refactor(纯算): 移除全部补环境后端,收敛为纯算单一路径 + 修复两处红灯

做了什么:
- 删除 generate_telemetry_node/browser/probe 三个伪造环境后端, 以及 apply_real_environment、
  4 段拼接旧结构、human_dt_ms、generate_collect_pure (crypto.py 955 -> 389 行)
- 遥测只剩纯算: python_keyed = Node 仅提取 XTEA 密钥字 + Python 模板回填 + 教科书 XTEA
- 修复 crypto.py 重复的 xtea_encrypt_block (内置自测从失败到通过), 并并入 selftest
- 修复 glyph_solver 强校验: 改用集成得分矩阵行 argmax 自洽校验, 回归 5/8 -> 8/8
- 移除注释里无证据的 errorCode=12 归因; 移除 12 自动换 IP 重试
- extract_eks 不再写死变量名; UA 常量统一为 Chrome/155
- 文档对齐: ANALYSIS §8 修订 / PROGRESS 重写 / TOOLCHAIN_REPORT §三 更正

为什么:
- 本项目证据账本已证: 12 与遥测后端/出口 IP/静默时长均无关, 补环境无收益且引入脆弱面
- 强校验用单引擎 ocr_text 会误杀正确解 (实测 簿->垂 / 笆->芭 / 筹->努)

怎么验证:
- .venv/bin/python -m tcaptcha.selftest 全绿 (crypto_core + glyph 8/8 + xtea_key)
- 端到端纯算: python / python_keyed 均可解回 '{"cd":[' 开头明文, probe 模式被拒绝
This commit is contained in:
yml2213
2026-10-11 21:30:26 +08:00
parent 60ae14d54a
commit 47ce74b160
11 changed files with 297 additions and 753 deletions
+11 -5
View File
@@ -121,13 +121,19 @@ class SolveResult:
@property
def text_match_ok(self) -> bool:
"""检查指派的每个字形直接 OCR 文本是否与目标汉字一致 (杜绝图字不符或混淆干扰字盲猜提交)"""
if not self.assignments or len(self.assignments) != len(self.targets):
"""**自洽性校验**: 每个被指派的字形, 在集成得分矩阵里最优的目标字, 必须正好是它被指派的目标。
注意: 不能用单引擎的 `ocr_text` 做判断 —— 那只是给肉眼看的弱信号, 实测会把
"簿"读成"垂"、"笆"读成"芭"、"筹"读成"努"; 而**用于指派的那份集成矩阵**的行 argmax
始终与指派一致。因此这里以矩阵为唯一依据 (既可靠又不会误杀正确解)。
"""
if self.score_matrix is None or not self.assignments:
return False
if len(self.assignments) != len(self.targets):
return False
for ti, g in enumerate(self.assignments):
target_char = self.targets[ti]
ocr_char = self.glyphs[g].ocr_text
if ocr_char and target_char not in ocr_char:
row = self.score_matrix[g]
if row.size == 0 or int(row.argmax()) != ti:
return False
return True