欢迎光临
我们一直在努力

影刀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&timestamp=' + 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}&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_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 #新手教程 #钉钉自动化 #机器人通知 #审批流程
    作者:林焱

    赞(0)
    未经允许不得转载:171主机测评 » 影刀RPA新手教程:钉钉自动化实战——消息机器人与审批流程对接
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址