Files
hello_js_reverse_skill/scripts/check_real_tencent_aid.py
T
yml2213 bc8cc5e124 feat(验证): 纯算链路在真实 aid 上端到端出 ticket —— 归因 1ms 的 12 为 aid 级风控
做了什么
- 新增 scripts/check_real_tencent_aid.py: 用**可反复测**的真实 aid 回归纯算链路
  (默认 aid=190758559 / mliev.login.wang 短信登录; 也可 --aid 195672344 对照)。
- 账本 har/1ms_dianxuan/PROGRESS.md: 已知 #26~#28、已排除新增三行、下一步重写为"已闭合结论 + 可复现靶子"。

为什么 (AGENTS §2.1 第 0 问 / §5.7)
- 用户提供可重复的真机登录抓包 har/原始抓包/登录抓包-点选.har, 得以把"12 到底是不是我们的问题"
  用一个能成功的目标做单变量反证。

怎么验证 (2026-10-11 实测)
- aid 190758559: 本客户端 solve() => errorCode=0 + 真 ticket, 连续 4 次:
  tr03lxdviLWtn4uXGjWjmrLQ / tr03A5zTSQ9bCog51sDm / tr039KeeQxXX-OdduJoY / tr03fGUOpcJTZWXWmZG7Uioc0Y8GlHPn
  其中 **httpx + 无 cookie + 无任何头部保真** 也拿到 0 —— 证明纯算链路本就完好。
- aid 195672344 (1ms): 在 cookie / curl_cffi Chrome 指纹 / 逐 endpoint 头保真 / collect 内容
  逐字节同构 / 带签名 identity_context 先行注册 —— 全部仍 12。
- 结论: 1ms 的 12 是该 aid 自身风控不放行"非真机页面"会话; 请求侧已无自变量,
  纯协议侧无解, 只能真机桥接或换入口。
2026-10-11 23:11:36 +08:00

68 lines
2.7 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
真机 aid 冒烟测试 —— 用**可反复测**的真实 aid 回归"纯算链路是否完好"。
背景 (har/1ms_dianxuan/PROGRESS.md 已知 #26/#27):
aid 195672344 (1ms.run) 对本客户端恒返回 errorCode=12 (aid 级风控, 与请求侧无关),
且 1ms 签到每天只能试一次 —— 不适合做回归。
而抓包 `har/原始抓包/登录抓包-点选.har` 里的 aid **190758559** (mliev.login.wang 短信登录)
可反复测: 本客户端 (纯算, 零 Node) 稳定拿到 errorCode=0 + 真 ticket。
用法:
.venv/bin/python scripts/check_real_tencent_aid.py # 默认 190758559
.venv/bin/python scripts/check_real_tencent_aid.py --aid 195672344 # 对照: 1ms 会得到 12
注意: 只调用腾讯天御的验证码接口 (prehandle/tdc.js/getcapbysig/verify),
**不会**触发任何短信/签到等业务副作用。
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
from tcaptcha.client import KIND_TEXT_CLICK, TencentCaptchaClient # noqa: E402
# (aid, entry_url, referer, wb)
TARGETS = {
"190758559": ("https://mliev.login.wang/auth/#/oidc/authorize", "https://mliev.login.wang/", "1"),
"195672344": ("https://1ms.run/console/personal/benefits/check-in", "https://1ms.run/", "1"),
}
def main() -> int:
ap = argparse.ArgumentParser(description="真机 aid 冒烟: 纯算链路端到端")
ap.add_argument("--aid", default="190758559", choices=sorted(TARGETS))
ap.add_argument("--transport", default="httpx", choices=["httpx", "curl"])
ap.add_argument("--refreshes", type=int, default=25)
args = ap.parse_args()
entry_url, referer, wb = TARGETS[args.aid]
client = TencentCaptchaClient(aid=args.aid, entry_url=entry_url, referer=referer, wb=wb,
accept_kinds=(KIND_TEXT_CLICK,), telemetry_mode="python_keyed",
transport=args.transport)
try:
result = client.solve(max_retries=2, max_refreshes=args.refreshes)
finally:
client.close()
raw = result.get("raw_response") or {}
print("\n=== 结果 ===")
print("aid :", args.aid)
print("transport :", args.transport)
print("success :", result.get("success"))
print("errorCode :", raw.get("errorCode"))
print("ticket :", (raw.get("ticket") or "")[:32])
print("randstr :", raw.get("randstr"))
print("telemetry :", result.get("raw_response", {}).get("sess") and "python_keyed(纯算)")
return 0 if result.get("success") else 1
if __name__ == "__main__":
raise SystemExit(main())