2026-09-23 版。数据全部来自
../guiji_new真人录制的 19 条轨迹(1220x2712 屏幕设备,getevent 采集)。
淘宝/饿了么拼图滑块验证码的解决流程(solve_slider(driver, sx=None)):
按下滑块 → 静默停顿(60~120ms)
→ 右滑到折返点(1060~1105px, 按屏宽缩放) [真人右段速度模板]
→ 等待幕布展开 + 轮询确认滑块到右端(静默)
→ 截取展开后的拼图区 → 打码API(jfbym type=20226)拿 gap
→ 折返点停顿 = API耗时 + 0.15~0.35s
→ 折回拖到 gap [分桶锚点链速度剖面]
→ 轮询确认滑块中心到位(静默)
→ 释放前慢速微调: 幕布左边缘量出真实缺口 vs 当前位置,
差3~12px时1px/30~90ms慢慢挪过去
→ 静默停顿(40~120ms) → 抬起手指
→ OCR 验证结果, 归档成功/失败截图+轨迹JSON
| 文件 | 说明 |
|---|---|
tmp_captcha_test7.py |
当前主版本(全面真人化校准版) |
tmp_captcha_test6.py |
旧版(生产兜底,参数已过时) |
nine_grid.py |
九宫格验证码(另一类验证码) |
get_guiji.py |
真人轨迹录制工具(adb getevent,输出 JSON+PNG 到 guiji_new/) |
run_test7.py |
编码免疫启动器(纯 ASCII,自动识别 UTF-8/GBK,防 PyCharm 存 GBK 后 Python 报编码错) |
../guiji_new/ |
真人轨迹模板库(19 条,必需——缺失时右滑退回匀速模式) |
../detect_slider_button.py |
橙色滑块按钮检测 |
../detect_captcha_edge.py |
幕布(橙色覆盖层)左边缘检测 = 真实缺口位置 |
_normalize_velocity_template(points, "right")):爆发起步(峰值 4~7 px/ms)→ 长弧刹车 → 末端爬行(-0.02, +0.10) × 距离(真人实测均值 +3.6% 向下)RIGHT_END_RANGE_1220 = (1060, 1105)(按屏宽缩放,真人集中在 1023~1109)真人 19 条按距离分桶实测:
| 档 | 距离 | 巡航速度(px/ms) | 特征 |
|---|---|---|---|
| 短折 | <450×scale | 0.45~0.9 | 全程较慢,减速区 55% 路程起 |
| 中折 | 450~600×scale | 0.7~1.3 | 减速起点 150px(缩放后) |
| 长折 | >600×scale | 1.6~2.4 | 高速巡航 + 超长慢尾 |
scale = W/1220 缩放:| 档 | 锚点链(1220 基准,运行时×scale) |
|---|---|
| 长折 | (150,1.0) (100,0.40) (70,0.25) (50,0.16) (30,0.08) (20,0.04) (10,0.02) (5,0.01) |
| 中折 | (150,1.0) (100,0.26) (50,0.15) (20,0.10) (10,0.07) (5,0.01) |
| 短折 | (dec_start,1.0) (100,0.45) (50,0.28) (20,0.12) (10,0.04) (5,0.02) |
dec_start = 150×scale(≥250px),短折 max(80×scale, 0.55×距离)triangular(0.20, 0.38, 0.30) × 距离 全部向下,上限 RETURN_END_DRIFT_LIMIT_1220=240×scale(真人实测 0.19~0.39,90~239px)主机 10~14ms 采样下高速段单步可达 40px+(视觉"加速猛")。_subdivide_track:步长 >16px 的段按时间表对半拆成小步(子步间隔 ≥3.5ms)。改后右滑最大步长 ~20px、折回 ~15px。
| 停顿 | 真人 | 代码 |
|---|---|---|
| 初始按压 | 中位 75ms(62~122) | 60~120ms |
| 折返点 | 中位 0.2~0.6s(37~1014ms) | API 返回后 +0.15~0.35s(API 必须在此期间完成,实测 0.6~2.0s,故无法完全对齐真人) |
| 释放前 | 中位 43ms | 40~120ms |
打码 API 的 gap 有 ±几 px 随机误差。折回到位后:截图检测幕布左边缘(=真实缺口),差 3~12px 时 1px/30~90ms 慢速挪过去(差 ≤2px 跳过、>12px 判为检测错误跳过)。已实测把 +12px 的落点误差拉回缺口。
timeBeginPeriod(1):默认 15.6ms 精度会让 sleep(4~14ms) 随机超睡 40~360ms → 卡顿跳点计时自检:100 次 12ms sleep 测超睡率,坏窗口(杀毒/负载尖峰)提前告警入口:main1.py 的 _handle_captcha(饿了么闪购主入口 V1,最多重试 5 次)
try:
from yzm.tmp_captcha_test7 import solve_slider # 全面真人化版
except ImportError:
from yzm.tmp_captcha_test6 import solve_slider # 旧版兜底
部署到生产机需同步:yzm/tmp_captcha_test7.py + guiji_new/ 整个目录 + detect_slider_button.py + detect_captcha_edge.py
生产机若目录结构与本机不同(如 D:\drug\sg\yzm),注意 tmp_captcha_test7.py 内 sys.path.insert 与 GUIJI_ROOT 两个路径解析
image/test7_image/{success,failure}/{日期}/{设备}_{时间}_track.json/.png/_b.pngphase_timing 关键字段:
right_ms/return_ms:两段实际耗时;resyncs/shifted_ms:重同步次数与累计后移(0 为理想)hold_ms:折返点总停顿(含 settle+确认+API)micro_adjust_px/ms:释放前微调量(None=旧版代码)release_pause_ms:释放前静默停顿return_center vs gap:落点误差(>8px 需关注)计时自检(坏窗口告警)、微调: 行、远端停顿=(应为 ~1000~2400ms)InputManager.injectInputEvent + SystemClock 在手机上按时间表注入,与主机负载无关;设备无 root 也可行,方案已设计未实施)| 想调什么 | 改哪里 |
|---|---|
| 折返点范围 | RIGHT_END_RANGE_1220 |
| 右滑时长/速度 | RIGHT_TEMPLATE_DURATION_RANGE、右段模板重采样间隔 0.007~0.009 |
| 折回巡航速度 | _build_human_return_track 内三档 v_peak |
| 折回减速形状 | 三档 chain 锚点链 + dec_start |
| 事件密度 | 折回采样 10.0~14.0 ms |
| 折返点停顿时长 | solve_slider 内 time.sleep(random.uniform(0.15, 0.35))(回退旧值见注释) |
| 微调幅度 | solve_slider 内 2 < abs(micro_px) <= 12 |
| Y 漂移 | RETURN_END_DRIFT_LIMIT_1220、end_ratio |
| 步长拆分 | _subdivide_track(..., max_step_px=16.0) |
PyCharm 曾多次把文件以 GBK 保存导致 Non-UTF-8 code ... no encoding declared。tmp_captcha_test7.py 第 1 行有 # -*- coding: utf-8 -*- 声明;如再出现乱码报错,在 PyCharm 中关掉文件标签重新打开(丢弃旧缓冲区),并用 run_test7.py 启动可免疫编码问题。