SKILL.md
验证码处理经验
快速识别流程
页面出现验证码?
├── 有滑动条 + 背景图 + 滑块图 → 滑块验证码
├── 有图片 + 输入框 → 图片验证码(OCR)
├── 有背景图 + 文字/图标提示 → 点选验证码
├── 有旋转图片 → 旋转验证码
├── 有拼图 → 拼图验证码(类似滑块)
└── 弹出第三方页面(极验/网易/腾讯)→ 第三方验证码服务
滑块验证码
缺口检测方法
| 方法 |
适用场景 |
精度 |
| Canny 边缘检测 |
缺口边缘清晰 |
高 |
| 模板匹配 |
有独立滑块图片 |
高 |
| 像素差异对比 |
有完整背景图和缺口背景图 |
最高 |
| 灰度梯度 |
缺口区域与背景对比度大 |
中 |
轨迹生成参数
总时长: 300-800ms(过快被检测,过慢不自然)
阶段分配:
- 起步 (0-15%): 加速,速度从 0 到峰值
- 中段 (15-75%): 匀速或微加速
- 减速 (75-90%): 明显减速
- 微调 (90-100%): 缓慢靠近 + 轻微回弹 (1-3px)
Y 轴抖动: ±1-2px 随机偏移(纯水平移动会被检测)
采样间隔: 10-30ms(模拟 requestAnimationFrame)
常见失败原因
- 缺口偏移量不准 → 加 ±2px 随机偏移重试
- 轨迹太规则 → 增加 Y 轴抖动和速度波动
- 滑动太快 → 总时长调到 500ms+
- 验证接口校验 → 检查是否需要额外参数(如 trace 数据、加密 token)
图片验证码
OCR 方案选择
| 方案 |
识别率 |
成本 |
适用场景 |
| ddddocr |
60-80% |
免费 |
简单数字/字母验证码 |
| Tesseract + 预处理 |
50-70% |
免费 |
清晰文字 |
| 打码平台 (超级鹰等) |
90%+ |
付费 |
复杂验证码、量大 |
| 自训练模型 |
95%+ |
开发成本高 |
固定样式、长期使用 |
图片预处理流程
- 灰度化 → 去除颜色干扰
- 二值化 → 分离文字和背景(阈值需调试)
- 去噪点 → 中值滤波或形态学操作
- 字符分割 → 连通域分析(粘连字符需特殊处理)
常见失败原因
- 背景干扰线 → 加强二值化阈值或用形态学开运算
- 字符粘连 → 投影分割或滴水算法
- 字体扭曲 → ddddocr 通常比 Tesseract 更好
- 识别错误 → 刷新验证码重试(最多 3 次)
点选验证码
处理流程
- 获取提示信息("请依次点击:X、Y、Z")
- 目标检测:定位背景图中每个候选目标的坐标
- 匹配:将提示与候选目标对应
- 按顺序点击坐标
难点与应对
- 文字点选:OCR 识别背景图中的文字位置
- 图标点选:图像分类匹配提示图标
- 语义点选("点击最大的"):需要目标检测 + 属性比较
- 3D/旋转文字:打码平台更可靠
第三方验证码服务
| 服务商 |
常见类型 |
特征 |
| 极验 (GeeTest) |
滑块、点选、九宫格 |
gt + challenge 参数 |
| 网易易盾 |
滑块、拼图、点选 |
NECaptcha 对象 |
| 腾讯防水墙 |
滑块 |
TencentCaptcha 对象 |
| 阿里云 |
滑块、智能验证 |
ALIYUN 前缀 |
| hCaptcha |
图像分类 |
h-captcha class |
| reCAPTCHA |
图像分类、评分 |
g-recaptcha class |
通用应对策略
- 优先尝试绕过:部分验证码有 API 直接获取 token 的方式
- 浏览器方案:用 Patchright 模拟真实操作
- 打码平台:极验/hCaptcha 等有专门的打码服务
- 降低触发频率:通过反检测手段减少验证码出现
验证失败通用处理
- 第 1 次失败 → 刷新验证码,调整参数重试
- 第 2 次失败 → 换方案(如 OCR → 打码平台)
- 第 3 次失败 → 返回告知主 agent,建议人工介入或换策略