#46 的登录只有手工输验证码一条路。顺运宝会话24 小时就过期, 意味着每天第一次同步都必须有人在场,而且将来做不了定时同步。
docs/admin/08 §8 当时写死了「不引入 OCR 服务」,理由是 「多一个必须先启动的东西」——那条判断基于示例脚本里的 http://127.0.0.1:8000/ocr(本机服务)。
docs/admin/08
http://127.0.0.1:8000/ocr
用户提供了托管地址 https://ocr.ilapage.cn/ocr,那条理由不成立了: 没有要启动的东西,就是一次 HTTP 调用。本工单推翻 08 §8 的这条决定。
https://ocr.ilapage.cn/ocr
做:
config.yaml
不做:
POST https://ocr.ilapage.cn/ocr Content-Type: multipart/form-data,字段名 file → 200 {"code":200,"message":"Success","data":"kycv"}
实测耗时约 1.4 秒。
[必须]
code:200
实测用一张无文字的图片探测,返回:
{"code":200,"message":"Success","data":""}
识别不出来不是错误码,是 code:200 加空 data。
data
[必须] 判断成功必须同时满足:HTTP 200、code == 200、data 非空。 只看 code 会把「没识别出来」当成功,拿空字符串去登录——白白消耗一次 登录尝试,还可能触发对方风控。
code == 200
code
// 顺运宝验证码固定 4 位字母数字(08 §3.2 实测)。 // 长度不对说明识别错了,直接换一张重试,不要拿去试登录—— // 白费一次尝试,而且频繁的错误登录可能触发风控。 if len(code) != 4 { /* 换图重试 */ }
[必须] 只保留字母和数字,滤掉 OCR 可能带回的空格和标点 (示例脚本 ocr_captcha() 的做法)。
ocr_captcha()
点同步 → 会话过期 ├─ OCR 已配置 │ └─ 循环 N 次:取验证码图 → OCR → 校验(非空 && 4位) → 登录 │ ├─ 登录成功 ─────────────────→ 直接同步,无人值守 │ └─ N 次都失败 ───────────────┐ └─ OCR 未配置 / 服务不可达 ────────────┴─→ 弹手工输入框(#46 已有)
[必须] OCR 不可达要降级,不是报错。 外部服务挂了不该让整个同步 功能不可用——手工路径一直在,走它就是了。
[必须] 每次重试都要重新取验证码图。同一张图再识别一次结果一样, 纯属浪费;而且验证码可能已经被上一次失败的登录作废了。
[必须] 重试次数上限可配,默认 5(示例脚本用的也是 5)。
[必须] 降级到手工时,弹窗里要说明为什么: 「自动识别验证码失败(已尝试 5 次),请手工输入」或 「验证码识别服务暂时不可用,请手工输入」。不写原因的话, 操作员不知道是配置错了还是服务挂了。
syb: # 验证码自动识别。留空则只用手工输入。 ocr_url: https://ocr.ilapage.cn/ocr ocr_max_attempts: 5
[必须] ocr_url 留空 = 禁用,直接走手工,不报错。
ocr_url
[必须] OCR 请求要有独立的超时(实测 1.4 秒,[建议] 设 10 秒), 不要和顺运宝的超时共用——OCR 慢不该拖垮整个登录流程。
[建议]
[必须] 调 OCR 不要带顺运宝的 Cookie。用独立的 HTTP 客户端, 理由和示例脚本注释里写的一样:避免把 ERP 会话泄漏给另一个服务。
[必须] 示例脚本把图片存成 captcha.jpg,那是命令行脚本的做法。 Admin 里在内存里传字节即可,不要写文件——省掉清理逻辑, 也不会在 data/ 里堆垃圾。
captcha.jpg
data/
[必须] docs/admin/08 §8 里那条「不引入 OCR 服务」已被本工单推翻, 要改写并说明原委(原判断基于本机服务的前提,托管服务不适用), 不要直接删掉——留着能让后来人知道这个决定变过、为什么变。
[必须] 补一条说明:验证码图片会被发送到外部 OCR 服务。 当前那个域名是自己的服务,所以不算交给第三方;换成别人的服务时 必须重新评估。
admin/config/config.go
OcrURL
OcrMaxAttempts
admin/config.example.yaml
admin/syb/ocr.go
admin/syb/ocr_test.go
httptest
admin/syb/client.go
admin/service/syb.go
admin/templates/syb/list.html
docs/admin/08-顺运宝接口.md
docs/admin/00-getting-started.md
OCR 调用
ocr_max_attempts
降级
其他
ocr.ilapage.cn
shunyunbaoerp.com
GOTOOLCHAIN=go1.23.0
go vet
gofmt -l .
go test ./...
cd D:\chengma\cmautobuy\admin $env:GOTOOLCHAIN="go1.23.0" go vet ./...; gofmt -l .; go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN
[必须] 单元测试要覆盖这三种假响应:
{"code":200,"message":"Success","data":"kycv"} → 成功 {"code":200,"message":"Success","data":""} → 失败并重试 {"code":200,"message":"Success","data":"ab"} → 长度不对,重试
真机验证(需要真实账号和网络,实现方跑不了就如实写进「未验证到的部分」):
go run .
/syb
回退:git revert。手工输入路径不受影响,回退后仍能正常登录同步。
git revert
用户已于 2026-08-09 明确通过验收,本工单验收完成。
2e686b1
2756999
docs/task/47-顺运宝验证码自动识别.md
go build ./...
go test ./... -count=1
go vet ./...
现关闭工单,并同步 #15、#14 的任务清单。
No dependencies set.
The note is not visible to the blocked user.
基本信息
要解决什么
#46 的登录只有手工输验证码一条路。顺运宝会话24 小时就过期,
意味着每天第一次同步都必须有人在场,而且将来做不了定时同步。
docs/admin/08§8 当时写死了「不引入 OCR 服务」,理由是「多一个必须先启动的东西」——那条判断基于示例脚本里的
http://127.0.0.1:8000/ocr(本机服务)。用户提供了托管地址
https://ocr.ilapage.cn/ocr,那条理由不成立了:没有要启动的东西,就是一次 HTTP 调用。本工单推翻 08 §8 的这条决定。
做什么 / 不做什么
做:
config.yaml,留空则完全禁用不做:
怎么做
响应格式(已实测)
实测耗时约 1.4 秒。
[必须]识别失败也是code:200,这是最容易写错的地方实测用一张无文字的图片探测,返回:
识别不出来不是错误码,是
code:200加空data。[必须]判断成功必须同时满足:HTTP 200、code == 200、data非空。只看
code会把「没识别出来」当成功,拿空字符串去登录——白白消耗一次登录尝试,还可能触发对方风控。
[必须]长度校验:不是 4 位就不要拿去登录[必须]只保留字母和数字,滤掉 OCR 可能带回的空格和标点(示例脚本
ocr_captcha()的做法)。重试与降级
[必须]OCR 不可达要降级,不是报错。 外部服务挂了不该让整个同步功能不可用——手工路径一直在,走它就是了。
[必须]每次重试都要重新取验证码图。同一张图再识别一次结果一样,纯属浪费;而且验证码可能已经被上一次失败的登录作废了。
[必须]重试次数上限可配,默认 5(示例脚本用的也是 5)。[必须]降级到手工时,弹窗里要说明为什么:「自动识别验证码失败(已尝试 5 次),请手工输入」或
「验证码识别服务暂时不可用,请手工输入」。不写原因的话,
操作员不知道是配置错了还是服务挂了。
配置
[必须]ocr_url留空 = 禁用,直接走手工,不报错。[必须]OCR 请求要有独立的超时(实测 1.4 秒,[建议]设 10 秒),不要和顺运宝的超时共用——OCR 慢不该拖垮整个登录流程。
[必须]调 OCR 不要带顺运宝的 Cookie。用独立的 HTTP 客户端,理由和示例脚本注释里写的一样:避免把 ERP 会话泄漏给另一个服务。
验证码图片不落盘
[必须]示例脚本把图片存成captcha.jpg,那是命令行脚本的做法。Admin 里在内存里传字节即可,不要写文件——省掉清理逻辑,
也不会在
data/里堆垃圾。文档要改
[必须]docs/admin/08§8 里那条「不引入 OCR 服务」已被本工单推翻,要改写并说明原委(原判断基于本机服务的前提,托管服务不适用),
不要直接删掉——留着能让后来人知道这个决定变过、为什么变。
[必须]补一条说明:验证码图片会被发送到外部 OCR 服务。当前那个域名是自己的服务,所以不算交给第三方;换成别人的服务时
必须重新评估。
预计修改文件
admin/config/config.goOcrURL/OcrMaxAttemptsadmin/config.example.yamladmin/syb/ocr.goadmin/syb/ocr_test.gohttptest假 OCRadmin/syb/client.goadmin/service/syb.goadmin/templates/syb/list.htmldocs/admin/08-顺运宝接口.mddocs/admin/00-getting-started.md验收标准
OCR 调用
code:200+data非空 + 4 位)→ 自动登录,不弹手工框code:200但data为空 → 判定失败并重试,不拿空串去登录ocr_max_attempts仍失败 → 降级手工,弹窗说明「已尝试 N 次」降级
ocr_url留空 → 直接走手工,不报错其他
httptest,不打真实的ocr.ilapage.cn和shunyunbaoerp.comdocs/admin/08§8 那条决定已改写并说明原委,不是删掉GOTOOLCHAIN=go1.23.0下go vet/gofmt -l ./go test ./...全过怎么验证
[必须]单元测试要覆盖这三种假响应:真机验证(需要真实账号和网络,实现方跑不了就如实写进「未验证到的部分」):
go run .→/syb→ 点同步 → 不应弹验证码框,直接开始同步ocr_url改成一个不存在的地址 → 再点同步 → 应弹手工框并说明服务不可用ocr_url留空 → 再点同步 → 应直接弹手工框,不报错风险和回退
data为空当成识别成功httptest,已列为验收项回退:
git revert。手工输入路径不受影响,回退后仍能正常登录同步。用户已于 2026-08-09 明确通过验收,本工单验收完成。
2e686b12756999docs/task/47-顺运宝验证码自动识别.mdgo build ./...、go test ./... -count=1、go vet ./...全部通过。现关闭工单,并同步 #15、#14 的任务清单。