feat(纯算): 增加 captcha 域 cookie 透传 + H3 单变量实验脚本

做了什么:
- TencentCaptchaClient 新增可选 cookies 参数, 逐条写入 captcha 域 Cookie 头 (默认 None, 行为不变)
- OneMsAdapter 新增 captcha_cookies 透传
- 新增 scripts/experiment_h3_cookie_ab.py: 只改 cookie 一个变量做 A/B 对照并自动判读

为什么:
- 账本 §7.5 的 H3 (腾讯云登录 cookie uin/skey/qcmainCSRFToken/intl) 是唯一
  尚未单变量验证过的差异; 其余 (环境 / 后端 / 出口 IP / 静默时长) 均已排除

怎么验证:
- 离线: 带 cookie 时请求头为 Cookie=uin=..;intl=1, 不带时为 None (默认行为不变)
- .venv/bin/python -m tcaptcha.selftest 全绿 (crypto_core + glyph 8/8 + xtea_key)
This commit is contained in:
yml2213
2026-10-11 21:36:59 +08:00
parent 47ce74b160
commit 795235ac38
3 changed files with 140 additions and 12 deletions
+22 -11
View File
@@ -108,6 +108,7 @@ class TencentCaptchaClient:
inter_attempt_delay: float = 0.25,
telemetry_mode: str = "python_keyed",
proxy: Optional[str] = None,
cookies: Optional[dict] = None,
):
"""
telemetry_mode 决定 collect/eks 怎么来 (见 tcaptcha.crypto.generate_telemetry), 只走纯算:
@@ -123,6 +124,11 @@ class TencentCaptchaClient:
9 分钟静默后单发, **全部都是 12**。所以 12 不是遥测/环境/IP 问题,
不要再走"补环境"或"换 IP"的路; 真正的变量 (登录态 / 真实验证码页面上下文)
尚未被单变量实验区分。
cookies: 可选, 逐条写入 captcha 域 (turing.captcha.qcloud.com) 的 Cookie 头。
成功样本 (har/签到成功-1.har) 的 captcha 域请求带着腾讯云登录 cookie
(uin / skey / qcmainCSRFToken / intl), 而本客户端此前完全不带 ——
这是账本 §7.5 的 H3 单变量实验入口 (默认 None, 不改变原有行为)。
"""
self.aid = str(aid)
self.timeout = timeout
@@ -146,21 +152,26 @@ class TencentCaptchaClient:
self._text_solver = text_solver
self.subsid = 1
headers = {
"User-Agent": self.user_agent,
"Referer": self.referer,
"Accept-Language": "zh-CN,zh;q=0.9,fr;q=0.8,de;q=0.7,en;q=0.6",
"sec-ch-ua": '"Google Chrome";v="155", "Chromium";v="155", "Not(A:Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"macOS"',
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
}
# 可选: 透传 captcha 域的腾讯云登录 cookie (账本 §7.5 的 H3 单变量实验入口)
if cookies:
headers["Cookie"] = "; ".join(f"{k}={v}" for k, v in cookies.items())
self.http_client = httpx.Client(
base_url=self.BASE_URL,
trust_env=False, # 屏蔽环境代理干扰
proxy=self.proxy,
headers={
"User-Agent": self.user_agent,
"Referer": self.referer,
"Accept-Language": "zh-CN,zh;q=0.9,fr;q=0.8,de;q=0.7,en;q=0.6",
"sec-ch-ua": '"Google Chrome";v="155", "Chromium";v="155", "Not(A:Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"macOS"',
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
},
headers=headers,
timeout=self.timeout,
follow_redirects=True,
)
+5 -1
View File
@@ -55,13 +55,16 @@ class OneMsAdapter:
def __init__(self, cookie: Optional[str] = None, user_agent: str = DEFAULT_USER_AGENT,
timeout: float = 15.0, proxy: Optional[str] = None,
proxy_api: Optional[str] = None, telemetry_mode: str = "python_keyed"):
proxy_api: Optional[str] = None, telemetry_mode: str = "python_keyed",
captcha_cookies: Optional[Dict[str, str]] = None):
self.user_agent = user_agent
self.timeout = timeout
# 出口代理 (可选)。注意: 实测换出口 IP 并不能解决 errorCode=12 (见 ANALYSIS.md §7)
self.proxy = proxy
self.proxy_api = proxy_api
self.telemetry_mode = telemetry_mode
# 可选: 透传到 captcha 域的腾讯云登录 cookie (账本 §7.5 的 H3 实验入口)
self.captcha_cookies = captcha_cookies
headers = {
"User-Agent": user_agent,
"Origin": ONE_MS_BASE,
@@ -130,6 +133,7 @@ class OneMsAdapter:
accept_kinds=(KIND_TEXT_CLICK,),
proxy=proxy,
telemetry_mode=self.telemetry_mode,
cookies=self.captcha_cookies,
)
connectivity_error = False
try: