diff --git a/docs/task/47-顺运宝验证码自动识别.md b/docs/task/47-顺运宝验证码自动识别.md new file mode 100644 index 0000000..5e1e399 --- /dev/null +++ b/docs/task/47-顺运宝验证码自动识别.md @@ -0,0 +1,52 @@ +# 47 Admin:顺运宝登录接入验证码自动识别 + +- 类型:需求 +- 父级大工单:#14 +- 所属 MVP / 版本:#15 / MVP +- 状态:已完成 +- 日期:2026-08-09 +- Gitea 工单: + +## 背景与目标 + +#46 只能由操作员手工输入验证码,而顺运宝会话会过期。本任务接入可配置的托管 OCR:优先自动识别并登录,识别失败或服务不可用时保留手工输入兜底,避免 OCR 故障阻断同步。 + +## 最终方案 + +- 配置增加 `ocr_url` 和默认 5 次的 `ocr_max_attempts`;地址留空即禁用 OCR。 +- OCR 使用独立、带超时的 HTTP 客户端,不携带顺运宝 Cookie;验证码图片只在内存中传递。 +- 只接受过滤后恰好 4 位的字母数字结果;空结果或长度错误会换新验证码重试,不提交错误登录。 +- OCR 不可达、响应异常或重试耗尽时降级到手工弹窗,并显示明确原因。 +- 保留 #46 的手工登录、会话缓存、同步和字段映射逻辑。 +- 更新顺运宝接口决策记录,说明托管 OCR 改变了原“不引入本机 OCR 服务”的前提,以及验证码图片会发送到所配置服务。 + +## 改了哪些 + +- `admin/config.example.yaml`、`admin/config/config.go`:OCR 地址、次数和默认值。 +- `admin/syb/ocr.go`、`admin/syb/ocr_test.go`:独立 OCR 客户端及假服务测试。 +- `admin/syb/client.go`、`admin/syb/client_test.go`:验证码重取、结果校验、自动登录与降级测试。 +- `admin/handler/web/others.go`、`admin/templates/syb/list.html`:自动登录编排和手工降级原因。 +- `docs/admin/00-getting-started.md`、`docs/admin/08-顺运宝接口.md`:配置和安全边界。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 合格的 4 位结果自动登录,空值和错误长度不提交登录 | 通过 | +| 每次重试重新取得验证码,达到上限后手工降级 | 通过 | +| OCR 留空、超时、不可达或异常响应均安全降级 | 通过 | +| OCR 客户端独立、带超时且不携带顺运宝 Cookie | 通过 | +| 验证码图片不落盘,手工输入路径保持可用 | 通过 | +| 测试只使用 `httptest`,不访问真实 OCR 或顺运宝 | 通过 | +| 配置和接口决策文档已更新 | 通过 | +| 五个页面和 Go 1.23 自动化检查通过 | 通过 | + +## 测试 + +- 执行的命令:在 `admin/` 使用 Go 1.23.0 执行 `go build ./...`、`go test ./... -count=1`、`go vet ./...`。 +- 结果:构建、全部测试和静态检查通过;空数据、错误长度、合格结果、服务异常、重试和 Cookie 隔离均由假服务覆盖。 +- **没验证到的部分**:本次验收未请求真实 OCR 服务或真实顺运宝账号,未重新执行真实浏览器中的自动登录与手工降级流程;用户已明确通过验收。 + +## 相关提交 + +- `2e686b1` feat: 顺运宝登录接入验证码自动识别 (#47)