Files

10 KiB
Raw Permalink Blame History

授权验证流程

本文件用于第二阶段:用户已经看到 solution_options,并明确选择某个方案后,再进入验证流程。默认先离线验证;真实网页操作、打码平台调用、表单提交都必须再次确认。

进入条件

必须同时满足:

  1. 已有第一阶段输出:captcha_type、provider、confidence、signals、solution_options。
  2. 用户明确选择方案,例如“用 ddddocr + OpenCV 做滑块偏移”。
  3. 如果需要真实网页验证或失败复盘,优先已有用户手动成功样本基线;不足时必须显式提示风险。

标准流程

  1. 复述当前识别结论:类型、厂商、置信度、关键证据。
  2. 复述用户选择的方案,并列出将使用的参考文件和脚本。
  3. 做执行前检查:
    • 证据是否足够:图片、HTML、截图、题面、脚本 URL、元素尺寸、DPR、接口名。
    • 依赖是否可用:Python、OpenCV、ddddocr、Tesseract、Whisper、平台 API key 等。
    • 是否需要真实浏览器:只要涉及打开页面、点击、拖动、提交、抓 Cookie/Storage,就需要再次确认。
  4. 评估成功样本基线:
    • 真实网页验证前,先检查 success_samples。
    • 默认同一授权目标至少 5 次用户手动成功样本。
    • 如果取证中观察到新的验证码类型,每个新类型至少 2 次成功样本。
    • 用 scripts/evaluate_success_baseline.py 输出 success_baseline_status、success_baseline_summary 和 missing_success_samples。
    • 基线不足时强提示:当前缺少真实成功流程对照,用户确认后仍可继续离线分析或受控验证。
  5. 离线执行:
    • 用开源工具识别答案、偏移、角度、坐标、点列或 token 诊断结果。
    • 用 scripts/map_coordinates.py 换算坐标。
    • 用 scripts/generate_motion_track.py 生成轨迹 JSON。
    • 用 scripts/solver_request_template.py 生成打码平台请求模板。
  6. 展示中间产物:
    • 识别结果、置信度、坐标/轨迹 JSON、缺失证据、失败原因。
    • 不要默认提交给真实页面。
  7. 每次验证后记录 attempts JSON:
    • 记录方案、验证码类型、厂商、授权目标、输入证据、识别结果、坐标/轨迹、切片还原结论、环境检查结论、challenge 新鲜度、成功/失败和失败原因。
    • 同一授权目标、同一验证码类型、同一用户选择方案连续失败时,用 scripts/evaluate_verification_attempts.py 做失败复盘。
    • 只有达到 5 次失败且无一次成功,且图片/坐标/轨迹/切片还原/补环境/challenge 新鲜度都无明显异常时,才主动建议切换到平台对照。
  8. 需要真实网页验证时:
    • 先读取 references/browser-acquisition.md。
    • 让用户确认 ruyiPage/Camoufox/CloakBrowser 模式。
    • 让用户确认具体动作:打开页面、截图、拖动、点击、提交或人工接管。
  9. 结束时输出报告:
    • 使用方案、输入证据、产物、成功/失败、失败原因、下一步建议。

成功样本基线

成功样本基线用于回答“真实成功流程长什么样”。没有它时,失败复盘很容易把验证码动态切题、隐藏回调、服务端绑定或成功状态漏判为本地识别失败。

默认门槛:

  1. 同一授权目标至少 5 次用户手动成功样本。
  2. 如果观察到新的验证码类型,每个类型至少 2 次成功样本。
  3. 每轮成功样本必须独立记录,不要只保存最后一轮。

评估脚本:

python scripts/evaluate_success_baseline.py --samples success_samples.json --pretty

脚本只做离线评估,不打开网页、不读取 Cookie/Storage、不提交验证。

成功样本最小结构:

{
  "authorization_scope": "用户确认的自有/授权测试目标",
  "success_samples": [
    {
      "sample_id": "manual-success-001",
      "success": true,
      "captcha_type": "slider",
      "provider": "geetest",
      "captcha_variant": null,
      "evidence": {
        "screenshot_before": "<relative path or description>",
        "screenshot_after": "<relative path or description>",
        "dom_summary": "<captcha container summary>",
        "script_or_iframe_urls": ["<url without secrets>"],
        "network_summary": ["<request/response summary without secrets>"],
        "success_signal": "UI/callback/response 显示验证成功",
        "challenge_id": "<non-secret id if available>",
        "timeline": ["rendered", "user solved", "success observed"]
      }
    }
  ]
}

基线不足时输出:

  • success_baseline_status: insufficient
  • missing_success_samples
  • recommended_next_route: collect-more-manual-success-samples
  • 强提示“缺少真实成功流程对照”;用户明确确认后,仍可继续离线分析或受控验证。

5 次失败复盘门槛

当用户已经选择方案并确认授权后,不要无限沿用当前方案。每次尝试结束都要把结果追加到 attempts JSON,再按以下规则判断:

  1. 先确认复盘对象是否是同一授权目标、同一验证码类型、同一用户选择方案。
  2. 如果连续失败不足 5 次,继续收集样本和诊断证据,不急于切平台。
  3. 如果同一方案已有至少 1 次成功,不触发切换;输出“当前方案可用但需优化稳定性”,并继续分析失败样本。
  4. 如果失败原因仍明确属于图片识别、坐标映射、轨迹、切片乱序未还原、补环境/浏览器环境或 challenge 过期,优先修复对应问题,不急于切平台。
  5. 如果连续 5 次失败且无成功,图片/坐标/轨迹/切片还原/补环境/challenge 新鲜度均为 ok,输出 escalation_decision: recommend-platform-control,主动建议切换到打码平台做授权 QA 对照。
  6. pow-challenge、waf-challenge、biometric-liveness 不默认推荐普通打码平台;优先走官方协议、浏览器环境/厂商日志诊断、人工复核或厂商支持。

复盘脚本示例:

python scripts/evaluate_verification_attempts.py --attempts attempts.json --pretty

脚本只做离线判断,不打开网页、不读取 API key、不发送平台请求。

attempts JSON 可以使用这个最小结构:

{
  "authorization_scope": "用户确认的自有/授权测试目标",
  "captcha_type": "slider",
  "provider": "geetest",
  "chosen_solution": "open-source-slider",
  "attempts": [
    {
      "success": false,
      "diagnosis_status": {
        "image": "ok",
        "coordinates": "ok",
        "track": "ok",
        "browser_env": "ok",
        "challenge_freshness": "ok"
      },
      "failure_reason": "服务端仍判定失败,视觉偏移与轨迹检查未发现异常"
    }
  ]
}

动作分级

动作 默认允许 是否需要再次确认
离线分类、读取本地 HTML/截图 是 否
本地 OCR、图像匹配、坐标换算、轨迹生成 是 否
生成打码平台请求模板 是 否
发送打码平台请求 否 是,且用户提供 API key 和授权范围
打开真实网页 否 是,且按浏览器取证模式
点击、拖动、提交、注入 token 否 是;未授权场景拒绝
读取 Cookie/Storage/账号材料 否 是;默认避免

方案路由

类型 首选参考
text、math、audio references/open-source-recipes.md
slider、rotate、image-restore references/open-source-recipes.md + references/motion-and-coordinate.md
click-select、grid、area-select、difference-click、font-identify、semantic-reasoning references/open-source-recipes.md + references/motion-and-coordinate.md
drag-drop、trace-draw、scratch references/motion-and-coordinate.md
token-widget、game-challenge、risk-score references/provider-execution-notes.md + references/solver-platform-recipes.md
pow-challenge references/provider-execution-notes.md
waf-challenge references/browser-acquisition.md + references/provider-execution-notes.md
biometric-liveness 只做合规接入和人工复核建议

输出模板

{
  "phase": "verification-flow",
  "captcha_type": "slider",
  "provider": "geetest",
  "chosen_solution": "open-source-slider",
  "authorization_scope": "用户确认的自有/授权测试目标",
  "preflight": {
    "evidence_ready": true,
    "dependencies_ready": false,
    "missing": ["背景图", "滑块图"]
  },
  "offline_steps": [
    "识别滑块偏移",
    "换算 DOM 坐标",
    "生成轨迹 JSON"
  ],
  "requires_live_browser": false,
  "success_baseline_status": "insufficient",
  "success_baseline_summary": {
    "total_success_samples": 0,
    "min_total_success_samples": 5,
    "min_success_samples_per_type": 2,
    "observed_captcha_types": []
  },
  "missing_success_samples": [],
  "attempt_summary": {
    "consecutive_same_context": 0,
    "failures": 0,
    "successes": 0
  },
  "diagnosis_status": {},
  "switch_triggered": false,
  "recommended_next_route": "continue-current-route-with-diagnostics",
  "platform_control_plan": {
    "role": "授权 QA 对照,不默认替代所有本地方案",
    "send_request": false
  },
  "requires_user_confirmation": [
    "如需真实页面拖动或提交,需要再次确认"
  ],
  "artifacts": []
}

失败处理

  • 证据不足:要求补充最小证据,不猜测。
  • 成功样本基线不足:先建议用户手动完成更多成功样本;用户确认后仍可继续离线分析或受控验证,但报告必须标记风险。
  • 开源工具低通过率:先给出失败样本原因;若连续 5 次失败且图像/坐标/轨迹/还原/补环境/challenge 新鲜度均无明显异常,再建议平台作为授权 QA 对照或人工接管。
  • 失败不足 5 次:继续收集样本、运行本地诊断,不触发方案切换。
  • 已有 1 次成功:当前方案可用但稳定性不足,继续优化失败样本,不触发平台切换。
  • 图像识别、坐标映射、轨迹、切片乱序还原、补环境或 challenge 过期仍有明确异常:优先修复对应问题,不切换平台。
  • 平台任务失败:检查题型、sitekey/pageurl/action、TTL、代理/IP/session、图片坐标系。
  • 真实网页失败:优先诊断环境、浏览器模式、DPR、坐标映射、challenge 过期和厂商绑定。