影刀RPA新手教程:钉钉自动化实战——消息机器人与审批流程对接

开篇:钉钉自动化的两个核心场景

影刀和钉钉打通,最常见两个场景:①采集到异常数据自动发钉钉消息告警。②自动触发审批流程。这两个场景打通后,你的RPA流程就从"自己看"变成了"团队协作"。

影刀的安装如果还没搞定,去home.linyan.cloud下载最新版,一路下一步就行,不用装D盘,默认C盘完全没问题——这么多年从没因为路径出过问题。

模块1:机器人Webhook消息通知(重点)

Webhook地址获取

  1. 打开钉钉PC端,进入目标群→右上角「群设置」→智能群助手→添加机器人→选择「自定义」

  2. 机器人名称随便填,安全设置选「加签」——这一步千万不能跳过,否则后面消息发不出去

  3. 复制Webhook地址,格式是https://oapi.dingtalk.com/robot/send?access_token=xxxx

  4. 在这里插入图片描述

  5. 复制签名密钥,一长串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&timestamp=' + timestamp + '&sign=' + sign

关键点:sign参数直接拼在URL后面,不是放在请求体里。签名的body要传JSON,Content-Type必须是application/json。

XPath定位四合一(扒钉钉管理页)

这里顺便讲元素定位。影刀元素捕获支持四种方式,实际工作中混着用:

在这里插入图片描述

  1. XPath:最灵活,推荐//div[contains(@class,'xxx')]这种模糊匹配
  2. CSS选择器:速度快,div.item > span.title
  3. 正则:从文本内容匹配,比如提取网页中所有手机号:1[3-9]\d{9}
  4. 文本匹配:最简单,直接找包含"提交"的按钮

钉钉管理后台的元素经常变,用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是企业应用的。

在这里插入图片描述

  1. 登录钉钉开放平台→创建企业内部应用→获取AppKey和AppSecret
  2. 调接口获取token:GET /gettoken?appkey=xxx&appsecret=xxx
  3. 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:工程化与报错速查

流程规范

  1. 变量命名:dd_token、dd_sign、feishu_url、data_list
  2. 异常处理:每个HTTP请求外包Try-Catch,钉钉消息发送失败不要阻断主流程
  3. 日志:每个关键节点打日志,方便排查——打印日志:开始采集第{page}页

常见报错解决

错误现象原因解决
sign not match签名算法不对检查timestamp格式(毫秒不是秒)、secret是否复制完整
ip不在白名单钉钉应用设置了IP白名单开放平台→应用详情→安全设置→添加服务器IP
token expiredaccess_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}&timestamp={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_tokenGET /gettokenappkey + appsecret
创建审批POST /topapi/processinstance/createprocess_code
查询审批POST /topapi/processinstance/getinstance_id
签名算法HMAC-SHA256 + Base64secret密钥(SEC开头)
try-catch模板Try / Except / Finally3次重试后报错
XPath模糊匹配//*[contains(@class,‘xxx’)]class可以部分匹配
正则提取手机号1[3-9]\d{9}用「匹配文本」指令

#影刀RPA #新手教程 #钉钉自动化 #机器人通知 #审批流程
作者:林焱

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐