付款回单 5 轮技术攻关复盘
钉钉群发图片这件小事,踩了 5 个坑才跑通。从 sampleImageMsg 灰色到 sampleFile 可下载,数据安全是核心决策。
本节要点:钉钉群发图片 5 轮攻关;sampleImageMsg 灰色 → actionCard+URL → data URL 模糊 → sampleFile 可下载;数据安全拒绝第三方图床,全钉钉体系内。
看着简单的事最难
需求看着简单:付款后把回单图片自动发到采购钉钉群。
实际踩了 5 个坑,每坑一轮攻关,前后 2 周才跑通。
5 轮攻关史
第 1 轮:sampleImageMsg 灰色叹号
用钉钉自定义机器人的 sampleImageMsg 接口发图片。图片发出去了,但群里显示灰色叹号,图片不显示。
排查:自定义机器人的 sampleImageMsg 要求图片是公网可访问 URL。我们图片在本地,没公网 URL。
第 2 轮:actionCard + 公开 URL
改用 actionCard 卡片消息 + 图片公开 URL。图片能显示了,但要求图片必须托管在公网图床。
第三方图床(如 SM.MS)能用,但——
第 3 轮:数据安全否决
付款回单含供应商名、金额、银行账号——敏感数据。放第三方图床:
- 数据安全不可控(图床可能被爬、被封、被卖)
- 合规风险
用户(财务负责人)直接否决:"回单不能放第三方图床。"
这一轮否决了第三方方案,必须找钉钉体系内的办法。
第 4 轮:data URL 模糊
试 data URL(图片转 base64 内嵌)。能显示,但有 20KB 大小限制,超过就压缩,回单图片变模糊看不清。
不行。
第 5 轮:sampleFile 可下载 ✅
最后用企业应用的 sampleFile 接口(upload type=file):
- 图片上传到钉钉企业应用
- 群里发文件消息,可下载高清原图
- 全在钉钉体系内,不经第三方
测试通过,回单图片清晰可下载。这一轮成了。
关键决策:文件命名
攻关同时定了命名规则:「收款公司-金额.png」。
为什么这个命名:
- 采购一眼看到"付给谁、多少"
- 文件名即摘要,不用打开就能扫
- @机器人搜索时按供应商名匹配文件名
OCR 阶段自动解析 4 字段(收款公司/金额/用途/日期),自动命名。
两个 Phase
工具最终分两阶段:
Phase 1:自动 OCR 命名
- pdfplumber 提取 PDF 文本
- PyMuPDF 裁剪图片
- 解析 4 字段 + 过滤非货款(ETc/内部/个人/政府)
- 输出「收款公司-金额.png」
Phase 2:钉钉机器人推送
- sampleFile 上传 + 群发
- 附加 @机器人查水单(Stream API)
数据安全是核心决策
整个 5 轮攻关,最关键的决策不是技术,是数据安全。
第三方图床技术上能跑通(第 2-3 轮),但用户一句话否决。这教会我:
- 涉及敏感数据,先问"能不能放外部",再问"怎么放"
- 用户的否决是硬约束,不是技术能 override 的
- 全体系内方案(钉钉 sampleFile)即使更复杂,也比第三方图床值得
实测数据
| 指标 | 改造前 | v4.0 |
|---|---|---|
| 每天发回单 | 1 小时手工截图 | 1 条命令 5 分钟 |
| 采购查回单 | 翻聊天记录 | @机器人 3 秒 |
| 数据外泄风险 | 截图发群(中) | 全钉钉内(低) |
| 错发/漏发 | 月均 3 次 | 0 |
工具已交接应付会计,稳定运行。
给同行的建议
- 钉钉群发图片用 sampleFile(企业应用),别用 sampleImageMsg(要公网 URL)
- 涉及敏感数据,第三方图床直接排除,别浪费时间试
- 文件命名即摘要,让接收方不打开就能扫
- OCR + 命名 + 推送三步合一,别分成三个工具
技术栈
- pdfplumber(PDF 文本提取)
- PyMuPDF(图片裁剪)
- dingtalk-stream SDK(@机器人 Stream API)
- 钉钉企业应用 sampleFile(图片上传 + 群发)
本节要点
- 钉钉发图片 5 轮攻关:sampleImageMsg 灰色 → URL → data URL 模糊 → sampleFile 可下载
- 数据安全是核心决策:第三方图床被否决,全钉钉体系内
- 文件命名「收款公司-金额」即摘要
- 两阶段:OCR 命名 + 机器人推送