- method_l_shape: OK 候选尺度 ±0.0375 精修(步长 0.0125 + ±6px 窗口), GT live_165204 Δ 179→176(真人 177),离线 9/10 保持 - 插桩 JSON.stringify 捕获 SDK 日志明文;指针 probe 排除 coalesced/pressure - 拖动不跟手指标作废:post_pos 晚于 SDK 重置滑块,鼠标事件流始终完整 - 剩余 VerifyErr = 候选整体选错(视觉确证),方向:多候选质量评估 - docs: experiments/solution/retrospective 同步收尾
2.0 KiB
2.0 KiB
经验:抖音验证码出现的检测方法
场景:自动化操作中需要知道「拖动重叠验证码」什么时候弹出来。
检测选择器
r = js("""
(() => {
const f = document.querySelector('iframe[src*="captcha"], iframe[id*="captcha"]');
if (!f) return 'no-iframe';
return 'visible=' + (f.offsetParent !== null) + ' w=' + f.offsetWidth + ' h=' + f.offsetHeight;
})()
""")
关键事实
- 抖音在页面加载时就会预加载验证码 iframe(字节 rmc-nocaptcha,无感验证框架),
默认
display:none, w=0 h=0。iframe 存在 ≠ 验证码触发。 - 判定触发看可见性:
f.offsetParent !== null或f.offsetWidth > 0。 - iframe src 特征:
https://lf-rc1.yhgfb-cn-static.com/obj/rc-verifycenter/rmc-nocaptcha/.../index.html(rc-verifycenter = 字节验证中心)。
辅助手段
1. 查页面加载过的验证码相关资源(判断风控 SDK 是否激活):
js("""
(() => performance.getEntriesByType('resource')
.map(e => e.name)
.filter(u => /captcha|verify|rc-verify|secsdk/i.test(u))
.slice(0, 20).join('\\n'))()
""")
出现 rc-verifycenter/sec_sdk_build/.../captcha/index.js、rmc-nocaptcha/.../setup.js
说明验证码 SDK 已就绪,等待触发条件。
2. MutationObserver 监听验证码 DOM 出现(挂在页面里,外部轮询读结果):
js("""
(() => {
window.__captchaSeen = [];
new MutationObserver(muts => {
for (const m of muts) for (const n of m.addedNodes) {
if (n.nodeType !== 1) continue;
const s = (n.tagName + ' ' + (n.className||'') + ' ' + (n.id||'')).toString();
if (/captcha|verify|secsdk/i.test(s)) window.__captchaSeen.push('add: ' + s.slice(0,100));
}
}).observe(document.body, {childList: true, subtree: true});
return 'ok';
})()
""")
3. 拖动验证码本体在 iframe 内部,需要 attach 到 iframe target 或在 iframe 内执行 JS 才能抓到 552×344 大图与 110×110 mark 图。