影刀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",  "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",  "form": { "form_data": "[{\"name\":\"报销金额\",\"value\":\"1200\"}]" } }网页自动化方式:
用影刀的"启动新浏览器"指令,打开飞书审批页面。
用XPath定位表单输入框:
//input[@data-field-name='报销金额']飞书审批表单的字段名在HTML里通常用data-field-name或name属性标识,可以先右键"检查"查看。
我当时踩过这个坑:表单字段是动态加载的,页面打开了但表单还没渲染完,影刀就去填数据,填了个空。
解决方式:用"等待元素出现"指令,等表单的第一个输入框出现后再开始填数据。
三、变量与数据类型:审批表单数据的组装
飞书审批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是一个数组,不是字典。每个字段是一个对象,包含name和value。
我当时踩过这个坑:把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_xxx | 1200 | 出差住宿 | 差旅 |
用影刀的"读取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.amountERP页面通常需要登录,用影刀的"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_id、union_id、user_id。
审批API里要的是open_id,我用成了user_id,一直报"用户不存在"。
open_id是通过"获取用户信息"API拿到的,不是飞书里的显示名或账号。
教训二:审批表单的字段名改了没同步更新流程。
管理员在飞书后台改了审批表单的字段名(加了个别名),我的流程里还是用的旧字段名,表单提交后字段值是空的。
现在每次提交前,先调"查询审批定义"API,动态获取字段名,不再硬编码。
教训三:批量提交时没有做失败隔离。
有一条报销数据有问题(金额格式错误),导致整批提交全部失败。
现在每条数据用独立的"尝试捕获"处理,一条失败不影响其他数据的提交。
延伸
飞书审批流的完整封装代码,包含发起、查询、催办、代审批功能,我都整理到了 home.linyan.cloud。
还有一套"报销数据自动对账"工具,可以自动核对审批记录和财务付款记录,防止重复付款。
#影刀RPA #RPA教程 #飞书审批 #审批自动化 #RPA #林焱
作者:林焱