影刀RPA新手教程:钉钉自动化实战——消息机器人与审批流程对接
影刀RPA新手教程:钉钉自动化实战——消息机器人与审批流程对接
开篇:钉钉自动化的两个核心场景
影刀和钉钉打通,最常见两个场景:①采集到异常数据自动发钉钉消息告警。②自动触发审批流程。这两个场景打通后,你的RPA流程就从"自己看"变成了"团队协作"。
影刀的安装如果还没搞定,去home.linyan.cloud下载最新版,一路下一步就行,不用装D盘,默认C盘完全没问题——这么多年从没因为路径出过问题。
模块1:机器人Webhook消息通知(重点)
Webhook地址获取
-
打开钉钉PC端,进入目标群→右上角「群设置」→智能群助手→添加机器人→选择「自定义」
-
机器人名称随便填,安全设置选「加签」——这一步千万不能跳过,否则后面消息发不出去
-
复制Webhook地址,格式是
https://oapi.dingtalk.com/robot/send?access_token=xxxx -

-
复制签名密钥,一长串SEC开头的东西,后面签名要用
密钥一定要存好,我第一次做的时候忘了保存,回头再看已经找不到了,只能删了重建。
加签算法(这是最坑的地方)
钉钉群机器人如果开了加签,必须在请求头里带上签名,否则返回sign not match。签名算法:
timestamp = 当前时间戳(毫秒)
secret = 你复制的那串SEC开头的密钥
stringToSign = timestamp + "\n" + secret
sign = HMAC-SHA256(stringToSign, secret) 再 Base64 编码
影刀里直接用Python代码块搞定:
import time
import hmac
import hashlib
import base64
timestamp = str(round(time.time() * 1000))
secret = 'SEC你的密钥...'
string_to_sign = timestamp + '\n' + secret
sign = base64.b64encode(hmac.new(
secret.encode('utf-8'),
string_to_sign.encode('utf-8'),
digestmod=hashlib.sha256
).digest()).decode('utf-8')
webhook_url = 'https://oapi.dingtalk.com/robot/send?access_token=xxx×tamp=' + timestamp + '&sign=' + sign
关键点:sign参数直接拼在URL后面,不是放在请求体里。签名的body要传JSON,Content-Type必须是application/json。
XPath定位四合一(扒钉钉管理页)
这里顺便讲元素定位。影刀元素捕获支持四种方式,实际工作中混着用:

- XPath:最灵活,推荐
//div[contains(@class,'xxx')]这种模糊匹配 - CSS选择器:速度快,
div.item > span.title - 正则:从文本内容匹配,比如提取网页中所有手机号:
1[3-9]\d{9} - 文本匹配:最简单,直接找包含"提交"的按钮
钉钉管理后台的元素经常变,用XPath的contains()就稳很多。比如获取审批状态:
//span[contains(text(),'审批中')]
//div[contains(@class,'status')]/span
变量命名规范:钉钉相关变量用dd_前缀,比如dd_webhook_url、dd_sign,一眼就知道是钉钉的。数据类型注意:timestamp是字符串不是数字,拼接URL时用+连接。
消息格式设计(三种类型选哪个)
文本消息最简单,只能发纯文字:
{
"msgtype": "text",
"text": {
"content": "【监控告警】小红书采集异常,第3页返回空数据"
},
"at": {
"atMobiles": ["138xxxx8888"],
"isAtAll": false
}
}
Markdown消息最常用,支持标题、加粗、链接:

{
"msgtype": "markdown",
"markdown": {
"title": "数据采集日报",
"text": "## 今日采集统计\n- 成功:1200条\n- 失败:3条\n- 耗时:15分钟\n@138xxxx8888"
},
"at": {
"atMobiles": ["138xxxx8888"]
}
}
ActionCard最复杂但最美观,适合需要"点击处理"的场景。格式了解就行,90%场景用Markdown够了。
流程控制:采集完→判断→发消息
打开淘宝→搜索关键词→循环翻页采集→每页数据写入列表
→循环结束→判断:列表长度==0?
→ 是:说明采集异常,发钉钉消息"商品数据为空,请检查"
→ 否:判断是否有异常标识字段?有→发钉钉消息告警
→写入Excel→结束
影刀里用「If条件」指令,条件选"自定义表达式":len(data_list) == 0 或 error_flag == True。
模块2:钉钉审批API流程对接
access_token获取
钉钉API调用第一步永远是拿token,这个和Webhook不一样——Webhook是群机器人的,API是企业应用的。

- 登录钉钉开放平台→创建企业内部应用→获取AppKey和AppSecret
- 调接口获取token:
GET /gettoken?appkey=xxx&appsecret=xxx - token有效期7200秒(2小时),所以有缓存机制很重要
影刀里HTTP请求获取token:
HTTP请求: method=GET, url=https://oapi.dingtalk.com/gettoken?appkey={appkey}&appsecret={appsecret}
→ 返回JSON: {"errcode":0,"access_token":"xxx","expires_in":7200}
→ 提取access_token存入变量
查询审批状态
有了token,查审批接口:
POST /topapi/processinstance/get?access_token=xxx
body: {"process_instance_id":"审批实例ID"}
返回的JSON里process_instance->status:RUNNING审批中、COMPLETED已完成、TERMINATED已终止。
触发审批流程

影刀采集完数据→判断需要触发审批→调钉钉接口创建审批实例:
POST /topapi/processinstance/create?access_token=xxx
body: {
"process_code": "PROC-你的审批模板ID",
"originator_user_id": "发起人ID",
"dept_id": 部门ID,
"form_component_values": [
{"name":"费用金额","value":"500"},
{"name":"用途说明","value":"采集任务紧急采购"}
]
}
form_component_values里的name必须和审批模板的字段名完全一致,包括空格,差一个字符都不行。
模块3:多平台联动作战
采集任务完整链路:
定时触发器(每天早上8点)→ 打开淘宝/拼多多采集商品数据
→ 数据处理(筛选/去重/格式化)→ 写入Excel
→ 判断:数据是否有异常?
→ 正常 → 发钉钉消息(每日数据正常)
→ 异常 → 发钉钉消息告警 + 触发审批流程
→ 飞书同步通知(备份通道)
→ 邮件发送日报到主管
飞书通知作为备份:钉钉挂了还能收到消息。飞书机器人配置类似——群设置→添加群机器人→复制Webhook。但飞书签名方式和钉钉不一样,用的是timestamp+key做HMAC,别搞混。
图片识别和键盘操作(备用方案)

有时候钉钉后台的元素抓不到,用图像识别备选:截图→「查找图片」指令定位→鼠标点击。或者纯键盘:Tab切到输入框→Ctrl+A全选→输入内容→Tab到发送按钮→Enter。稳定性不如元素定位,但关键时刻能救命。
OCR识别审批单
如果审批内容是截图(比如发票、报销单),用影刀的OCR指令:截图→OCR识别→提取文字→填充到审批表单。影刀内置百度OCR和腾讯OCR,开箱即用。
模块4:工程化与报错速查
流程规范
- 变量命名:
dd_token、dd_sign、feishu_url、data_list - 异常处理:每个HTTP请求外包Try-Catch,钉钉消息发送失败不要阻断主流程
- 日志:每个关键节点打日志,方便排查——
打印日志:开始采集第{page}页
常见报错解决
| 错误现象 | 原因 | 解决 |
|---|---|---|
| sign not match | 签名算法不对 | 检查timestamp格式(毫秒不是秒)、secret是否复制完整 |
| ip不在白名单 | 钉钉应用设置了IP白名单 | 开放平台→应用详情→安全设置→添加服务器IP |
| token expired | access_token过期(2小时) | 每次调API前检查token时间,过期重新获取 |
![]() |
| 返回errcode=88 | token无效或subcode不匹配 | 确认appkey和appsecret正确,确认应用有对应权限 |
| 消息发不出去 | webhook被限流 | 每分钟最多20条,加个延迟控制发送频率 |
| element not found | 钉钉后台页面元素变化 | 改用XPath的contains()模糊匹配 |
Python进阶层:封装成函数
把签名计算、消息发送封装成函数,一次写好到处复用:
def send_dingtalk_msg(webhook, secret, content, at_mobiles=None):
import time, hmac, hashlib, base64
ts = str(round(time.time() * 1000))
sign_str = ts + '\n' + secret
sign = base64.b64encode(hmac.new(
secret.encode(), sign_str.encode(), hashlib.sha256
).digest()).decode()
url = f'{webhook}×tamp={ts}&sign={sign}'
import json
body = json.dumps({
"msgtype": "markdown",
"markdown": {"title": "通知", "text": content},
"at": {"atMobiles": at_mobiles or [], "isAtAll": False}
})
import requests
r = requests.post(url, data=body, headers={'Content-Type': 'application/json'}, timeout=10)
return r.json()
正则技巧:从钉钉返回的JSON里提取手机号,用1[3-9]\d{9}匹配。从审批数据里提取金额:\d+\.?\d*。
速查表
| 操作 | 路径/指令 | 关键参数 |
|---|---|---|
| 钉钉Webhook地址 | 群设置→智能群助手→机器人 | access_token在URL里 |
| 获取access_token | GET /gettoken | appkey + appsecret |
| 创建审批 | POST /topapi/processinstance/create | process_code |
| 查询审批 | POST /topapi/processinstance/get | instance_id |
| 签名算法 | HMAC-SHA256 + Base64 | secret密钥(SEC开头) |
| try-catch模板 | Try / Except / Finally | 3次重试后报错 |
| XPath模糊匹配 | //*[contains(@class,‘xxx’)] | class可以部分匹配 |
| 正则提取手机号 | 1[3-9]\d{9} | 用「匹配文本」指令 |
#影刀RPA #新手教程 #钉钉自动化 #机器人通知 #审批流程
作者:林焱
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐





所有评论(0)