当前位置: 首页 > news >正文

影刀RPA新手教程:飞书审批流自动发起完全指南——表单填写、附件上传与审批状态追踪

影刀RPA新手教程:飞书审批流自动发起完全指南——表单填写、附件上传与审批状态追踪

作者:林焱 | 真实案例驱动,每篇覆盖12大核心模块,禁止空话。

案例背景:报销审批从3天缩短到10分钟

公司报销流程是:填飞书审批 → 领导审批 → 财务审批。

大部分人卡在第一步:不知道怎么填审批表单,或者填错了被打回来重新填。

我用影刀RPA做了两件事:

第一,自动把ERP里的报销数据填入飞书审批表单,员工只需要确认一下点提交。

第二,自动追踪审批状态,审批通过后自动通知财务系统付款。

整套方案上线后,报销平均处理时间从3天降到了10分钟。


一、安装与准备工作

飞书审批流是通过飞书开放API来操作的,不是通过网页自动化(也可以,但API更稳定)。

需要的准备:

  • 飞书开放平台创建应用,拿到 App ID 和 App Secret
  • 开启"审批"权限:在开放平台 → 应用 → 权限管理中,开启"审批"相关权限
  • 获取tenant_access_token(企业级访问令牌)

tenant_access_token的获取方式:

POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal Body: { "app_id": "你的App ID", ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e7ef2607656546ddbe3fd0971f37b1b6.png#pic_center) "app_secret": "你的App Secret" }

返回结果:

{"code":0,"msg":"success","tenant_access_token":"xxxxxx","expire":7200}

我当时犯的第一个错:用了app_access_token而不是tenant_access_token

app_access_token是以应用身份访问,看不到企业里的审批数据。

tenant_access_token是以企业身份访问,才能操作审批流。


二、元素定位:两种方式操作审批表单

操作飞书审批表单,有两种方式:

方式一:API方式(推荐),通过飞书审批API直接提交审批。

方式二:网页自动化方式,模拟人在飞书网页上填表单。

API方式更稳定,不受页面改版影响。

网页自动化方式在数据量小、API不满足需求时用。

API方式

先查审批定义,获取approval_code

GET https://open.feishu.cn/open-apis/approval/v4/approvals 参数: app_id = 你的App ID

返回结果里包含企业里所有审批定义的approval_code

approval_code发起审批实例:

POST https://open.feishu.cn/open-apis/approval/v4/instances Header: Authorization: Bearer {tenant_access_token} Body: { "approval_code": "xxx", "open_id": "员工的open_id", ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/df60f0231ef24fe2b67fd5694a2c4177.png#pic_center) "form": { "form_data": "[{\"name\":\"报销金额\",\"value\":\"1200\"}]" } }

网页自动化方式

用影刀的"启动新浏览器"指令,打开飞书审批页面。

用XPath定位表单输入框:

//input[@data-field-name='报销金额']

飞书审批表单的字段名在HTML里通常用data-field-namename属性标识,可以先右键"检查"查看。

我当时踩过这个坑:表单字段是动态加载的,页面打开了但表单还没渲染完,影刀就去填数据,填了个空。

解决方式:用"等待元素出现"指令,等表单的第一个输入框出现后再开始填数据。


三、变量与数据类型:审批表单数据的组装

飞书审批API的form字段,格式是一个JSON字符串,里面包含表单所有字段的键值对。

键值对的键是字段的"字段名",值在飞书审批后台配置表单时定义。

拼多多店群自动化上架方案

比如报销审批表单有这些字段:

字段名类型说明
报销金额数字单位元
报销事由文本字符串
报销类型单选差旅/办公/其他
附件文件发票图片

在影刀里组装form数据:

用"配置参数"指令,先组装一个字典,再用Python的json.dumps()转成字符串:

importjson form_data=[{"name":"报销金额","value":"1200"},{"name":"报销事由","value":"上海出差住宿费"},{"name":"报销类型","value":"差旅"}]form_str=json.dumps(form_data,ensure_ascii=False)print(form_str)

注意:form_data是一个数组,不是字典。每个字段是一个对象,包含namevalue

我当时踩过这个坑:把form_data写成了字典格式{"报销金额": "1200"},API一直返回"表单格式错误"。


四、流程控制:按报销类型走不同审批流

不同金额的报销,走不同的审批流程。

比如500元以下只需要直属领导审批,500元以上需要加财务审批。

用影刀的"如果…否则"指令实现分支:

如果 报销金额 < 500 审批流 = "小额报销审批" approval_code = "小额报销的approval_code" 否则如果 报销金额 >= 500 且 报销金额 < 5000 审批流 = "常规报销审批" approval_code = "常规报销的approval_code" 否则 审批流 = "大额报销审批" approval_code = "大额报销的approval_code" 需要附加说明 = true 结束如果

循环用在批量提交场景。

比如每月批量提交部门所有人的报销,从Excel表里读取报销数据,遍历提交。

Excel格式:

姓名open_id报销金额报销事由报销类型
张三ou_xxx1200出差住宿差旅

用影刀的"读取Excel"指令加载数据,用"遍历循环"逐条提交。

我当时踩过这个坑:批量提交时没加工等待,飞书API限频,第6条开始全部失败。

正确做法:每次提交后加1-2秒等待,加"失败重试"逻辑。


五、网页自动化:从ERP抓取报销数据自动填表

报销数据来自ERP系统,用影刀的"启动新浏览器"指令打开ERP页面。

XPath + CSS双定位

优先XPath:

//table[@id='expense-list']//tr[td[contains(text(),'张三')]]/td[@class='amount']

XPath定位不到用CSS:

table#expense-listtr:contains('张三')td.amount

ERP页面通常需要登录,用影刀的"Cookie管理"指令,保存登录态,避免每次都输入账号密码。

我当时踩过这个坑:ERP登录用了滑块验证码,影刀自动登录失败。

解决方式:先在影刀里手动登录一次,保存Cookie,后续用Cookie直接登录,跳过验证码。


六、数据处理:把ERP数据转换成审批表单格式

ERP里的报销数据,和飞书审批表单的字段格式不一定一致。

需要做的转换:

金额格式:ERP里可能是"1,200.00",飞书表单里要填"1200"。

金额 = 替换(金额, ",", "") # 去掉千分位逗号 金额 = 替换(金额, ".00", "") # 去掉小数部分(如果不需要)

日期格式:ERP里可能是"2024/11/11",飞书表单里要填"2024-11-11"。

日期 = 替换(日期, "/", "-")

报销类型映射:ERP里的类型是编码,飞书表单里是文字。

如果 类型编码 == "01" 类型文字 = "差旅" 否则如果 类型编码 == "02" 类型文字 = "办公" 否则 类型文字 = "其他" 结束如果

我当时踩过这个坑:类型映射漏了一个值,ERP里有个"03"类型的报销,流程里没处理,表单提交后类型字段是空的,审批人看不懂。


七、鼠标键盘图像:发票附件自动上传

报销需要上传发票附件,用影刀的"上传文件"指令。

飞书审批API支持通过"文件"类型的表单字段上传附件,但需要先调用"上传文件"API拿到file_token,再把file_token填到表单里。

上传文件API:

POST https://open.feishu.cn/open-apis/im/v1/files 参数: file_type = stream Body: 文件二进制流

返回结果里包含file_key,把file_key填到审批表单的附件字段里。

在影刀里,发票文件通常存在本地,用Python读取文件并上传:

importrequestsdefupload_invoice_file(token,file_path):url="https://open.feishu.cn/open-apis/im/v1/files?file_type=stream"headers={"Authorization":f"Bearer{token}"}withopen(file_path,'rb')asf:files={'file':f}resp=requests.post(url,headers=headers,files=files,timeout=60)result=resp.json()returnresult.get('data',{}).get('file_key')

我当时踩过这个坑:发票文件是PDF格式,飞书审批的附件字段只支持图片格式(jpg、png)。

解决方式:用影刀的"PDF转图片"指令,把PDF发票转成图片再上传。


八、进阶技能:审批状态追踪与自动催办

审批提交后,要追踪审批状态,审批通过后自动触发后续动作。

查询审批实例状态:

GET https://open.feishu.cn/open-apis/approval/v4/instances/{instance_id} Header: Authorization: Bearer {tenant_access_token}

返回结果里的status字段:

  • PENDING:审批中
  • APPROVED:已通过
  • REJECTED:已拒绝
  • CANCELED:已撤销

用影刀的"定时任务",每隔10分钟查询一次待审批的实例状态。

如果状态变成APPROVED,自动发消息通知申请人"审批通过"。

如果状态变成REJECTED,自动发消息通知申请人"审批被拒,原因:xxx"。

我当时踩过这个坑:定时任务查询频率太高(每10秒一次),飞书API限频了。

现在查询间隔改成10分钟,对于报销审批来说足够及时了。


九、平台实战:在影刀配置审批自动提交任务

报销数据每天新增,需要每天自动提交审批。

在影刀控制台配置定时任务:

Cron表达式:0 1 * * *(每天凌晨1点执行)

流程逻辑:

步骤1:从ERP读取当日新增的报销数据 步骤2:过滤掉已经提交过审批的数据(用审批单号去重) 步骤3:遍历数据,调用飞书审批API提交审批 步骤4:把提交结果写回ERP(更新审批单号字段) 步骤5:发送提交结果汇总消息到飞书群

"过滤已提交数据"这一步很重要,防止重复提交。

用影刀的"配置文件"或"数据表",记录已处理的报销单号,每次执行前先过滤。

我当时没做去重,有一个报销单在Excel里被误存了两次,流程跑了两遍,提交了两次审批,财务付了两次款。


十、系统联动:审批通过与财务系统自动付款

审批通过后,要自动通知财务系统付款。

方案:用影刀的定时任务,查询"已通过但未付款"的审批实例,调用财务系统API触发付款。

财务系统API(假设):

POST https://finance.example.com/api/pay Body: { "expense_id": "报销单号", "amount": 1200, "payee": "收款人" }

在影刀流程里:

步骤1:查询飞书审批状态 = APPROVED 且 付款状态 = 未付款 的记录 步骤2:遍历记录,调用财务系统API触发付款 步骤3:如果付款API返回成功,更新本地记录的付款状态 = 已付款 步骤4:如果付款API返回失败,记录错误日志并发送告警

我当时踩过这个坑:财务系统API偶尔超时,我的流程直接标记"付款失败",但实际上付款可能已经成功了(只是返回超时)。

正确做法:API超时后,先查询付款状态,确认是否真的失败,再做处理。


十一、工程化规范:审批数据的完整审计链

审批流程涉及钱,必须有完整的审计链,防止纠纷。

规范一:所有审批操作记录日志,不可删除,只可追加。

TEMU店群如何管理运营?

[审批操作] 时间 | 操作人 | 报销单号 | 操作类型 | 详情

规范二:审批状态变更要有明确的来源记录。

比如"审批通过"是因为定时任务查询到的,还是因为收到了飞书的审批回调(如果配置了回调)。

规范三:所有涉及金额的审批,在提交前要做二次确认,金额超过一定阈值要人工审核。

我在流程里加了"大额审批人工确认"步骤:金额超过5000元的,先发消息给申请人确认,确认后再提交。


十二、速查表与常见报错

报错1:99991663 审批定义不存在

原因:approval_code错误,或者应用没有该审批定义的权限。

解决:重新获取approval_code,在飞书开放平台给应用添加审批权限。

报错2:99991664 表单数据格式错误

原因:form字段的格式不对,或者字段名和审批定义不匹配。

解决:检查form字段的格式,确认字段名和审批后台的配置一致。

报错3:99991665 没有权限操作该审批

原因:使用的token权限不足,或者open_id对应的用户不在应用可见范围内。

解决:确认tenant_access_token的权限,把用户加到应用的可见范围。

报错4:审批提交成功但看不见

原因:审批实例是提交成功了,但审批人在飞书里看不到,可能是审批流的"发起条件"配置有问题。

解决:去飞书管理后台,检查审批流的"发起条件"和"审批人"配置。

飞书审批API常用接口速查

接口用途
GET /approval/v4/approvals查询审批定义
POST /approval/v4/instances发起审批实例
GET /approval/v4/instances/{id}查询审批实例状态
POST /approval/v4/instances/{id}/approve同意审批(代审批)
POST /approval/v4/instances/{id}/reject拒绝审批(代审批)

完整案例代码参考

发起审批实例(Python实现,在影刀"执行Python代码"指令里调用):

importrequestsimportjsondefstart_approval(token,approval_code,open_id,form_data):""" 发起飞书审批 token: tenant_access_token approval_code: 审批定义CODE open_id: 发起人的open_id form_data: 表单数据,格式是 [{"name":"字段名","value":"值"},...] """url="https://open.feishu.cn/open-apas/approval/v4/instances"headers={"Authorization":f"Bearer{token}","Content-Type":"application/json"}data={"approval_code":approval_code,"open_id":open_id,"form":{"form_data":json.dumps(form_data,ensure_ascii=False)}}resp=requests.post(url,headers=headers,json=data,timeout=30)result=resp.json()ifresult.get('code')==0:instance_id=result['data']['instance_id']returninstance_idelse:raiseException(f"发起审批失败:{result}")# 查询审批状态defget_approval_status(token,instance_id):url=f"https://open.feishu.cn/open-apis/approval/v4/instances/{instance_id}"headers={"Authorization":f"Bearer{token}"}resp=requests.get(url,headers=headers,timeout=30)result=resp.json()ifresult.get('code')==0:status=result['data']['instance']['status']returnstatuselse:raiseException(f"查询审批状态失败:{result}")

XPath元素定位参考(飞书审批网页表单):

# 报销金额输入框 //input[contains(@placeholder,'金额') or @data-field-name='报销金额'] # 报销事由文本框 //textarea[@data-field-name='报销事由'] # 提交按钮 //button[contains(@class,'submit') or text()='提交']

CSS选择器:

/* 表单输入框 */.form-field input[data-field-name] .form-field textarea[data-field-name]/* 提交按钮 */button.btn-submit,button.approval-submit

我当时踩过这个坑:三个最深刻的教训

教训一open_id用了错误的用户标识。

飞书有多个用户标识:open_idunion_iduser_id

审批API里要的是open_id,我用成了user_id,一直报"用户不存在"。

open_id是通过"获取用户信息"API拿到的,不是飞书里的显示名或账号。

教训二:审批表单的字段名改了没同步更新流程。

管理员在飞书后台改了审批表单的字段名(加了个别名),我的流程里还是用的旧字段名,表单提交后字段值是空的。

现在每次提交前,先调"查询审批定义"API,动态获取字段名,不再硬编码。

教训三:批量提交时没有做失败隔离。

有一条报销数据有问题(金额格式错误),导致整批提交全部失败。

现在每条数据用独立的"尝试捕获"处理,一条失败不影响其他数据的提交。


延伸

飞书审批流的完整封装代码,包含发起、查询、催办、代审批功能,我都整理到了 home.linyan.cloud。

还有一套"报销数据自动对账"工具,可以自动核对审批记录和财务付款记录,防止重复付款。


#影刀RPA #RPA教程 #飞书审批 #审批自动化 #RPA #林焱

作者:林焱

http://www.jsqmd.com/news/1114159/

相关文章:

  • 软考成绩过期前72小时紧急补救方案:如何用1次重考激活全部历史合格科目?
  • GitHub中文界面终极指南:5分钟让GitHub说中文的完整解决方案
  • 邮件功能不敢直接发给真实用户?用MailHog搭建安全测试收件箱
  • ChatGPT提示词效能跃迁:从模糊指令到精准角色驱动的5步结构化方法论
  • 新手向 OpenClaw 小龙虾部署教程,Win11 环境零配置运行(含安装包)
  • 降重降AI工具横向测评:如何选择靠谱的AIGC降重平台?
  • ModelArts平台部署Claude Code Agent全指南
  • League Akari:英雄联盟玩家的智能自动化助手,3大核心功能提升游戏体验
  • 学生奖惩管理系统-ssm vue mysql
  • 软考单科成绩保留年限深度溯源(依据人社部函〔2023〕87号+近5年全国12省市实证数据)
  • 5分钟掌握华为光猫配置解密工具:网络运维的终极解决方案
  • 养生科普|从“泄阳”到“扶阳”,新式正气罐凭什么革新传统拔罐体系
  • 毕业设计旅游网站开发:从开题到答辩全流程指南
  • m4s-converter:B站缓存视频格式转换与本地备份解决方案
  • 3分钟学会微博备份:Speechless一键导出PDF完整指南
  • 22个Illustrator自动化脚本:告别重复劳动,让创意真正自由
  • 仅限前500名开放|ChatGPT角色设定提示词诊断工具包(含动态权重校准算法v2.1)
  • FanControl终极指南:从零掌握Windows风扇智能控制,告别噪音与高温困扰
  • 为什么主板显卡搭配会影响整机性能
  • 暗黑破坏神2存档编辑器完整指南:5分钟学会可视化修改角色与装备
  • 3分钟打造专业Markdown阅读体验:Markdown Viewer浏览器插件全攻略
  • 如何在Linux上安装AC1200双频USB无线网卡驱动:rtl8812AU_8821AU完整指南
  • 专科生论文写作利器:9款AI工具实测与使用攻略
  • YOLOv10模型改进-Backbone改进-第51篇:YOLOv10改进策略【Backbone】| ResNet50 Backbone替换
  • 第19章:Celery 分布式任务队列深度解析
  • 如何零基础使用暗黑破坏神2存档编辑器:快速修改角色装备的终极教程
  • SpringBoot + MySQL + JWT 实现前后端分离的在线教育视频点播平台
  • 守护健康的“生命元素”,你补对了吗?
  • 软考2026新增科目备考资源极度稀缺:仅3家机构获授权开发模拟题库,其中2套已遭命题组紧急叫停——现在入手还剩最后72小时
  • D2DX现代化补丁:3大核心功能彻底解决暗黑破坏神2老游戏卡顿与画面问题