影刀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_codeGET 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-name或name属性标识可以先右键检查查看。我当时踩过这个坑表单字段是动态加载的页面打开了但表单还没渲染完影刀就去填数据填了个空。解决方式用等待元素出现指令等表单的第一个输入框出现后再开始填数据。三、变量与数据类型审批表单数据的组装飞书审批API的form字段格式是一个JSON字符串里面包含表单所有字段的键值对。键值对的键是字段的字段名值在飞书审批后台配置表单时定义。拼多多店群自动化上架方案比如报销审批表单有这些字段字段名类型说明报销金额数字单位元报销事由文本字符串报销类型单选差旅/办公/其他附件文件发票图片在影刀里组装form数据用配置参数指令先组装一个字典再用Python的json.dumps()转成字符串importjson form_data[{name:报销金额,value:1200},{name:报销事由,value:上海出差住宿费},{name:报销类型,value:差旅}]form_strjson.dumps(form_data,ensure_asciiFalse)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_xxx1200出差住宿差旅用影刀的读取Excel指令加载数据用遍历循环逐条提交。我当时踩过这个坑批量提交时没加工等待飞书API限频第6条开始全部失败。正确做法每次提交后加1-2秒等待加失败重试逻辑。五、网页自动化从ERP抓取报销数据自动填表报销数据来自ERP系统用影刀的启动新浏览器指令打开ERP页面。XPath CSS双定位优先XPath//table[idexpense-list]//tr[td[contains(text(),张三)]]/td[classamount]XPath定位不到用CSStable#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填到表单里。上传文件APIPOST https://open.feishu.cn/open-apis/im/v1/files 参数 file_type stream Body 文件二进制流返回结果里包含file_key把file_key填到审批表单的附件字段里。在影刀里发票文件通常存在本地用Python读取文件并上传importrequestsdefupload_invoice_file(token,file_path):urlhttps://open.feishu.cn/open-apis/im/v1/files?file_typestreamheaders{Authorization:fBearer{token}}withopen(file_path,rb)asf:files{file:f}resprequests.post(url,headersheaders,filesfiles,timeout60)resultresp.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元的先发消息给申请人确认确认后再提交。十二、速查表与常见报错报错199991663 审批定义不存在原因approval_code错误或者应用没有该审批定义的权限。解决重新获取approval_code在飞书开放平台给应用添加审批权限。报错299991664 表单数据格式错误原因form字段的格式不对或者字段名和审批定义不匹配。解决检查form字段的格式确认字段名和审批后台的配置一致。报错399991665 没有权限操作该审批原因使用的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:值},...] urlhttps://open.feishu.cn/open-apas/approval/v4/instancesheaders{Authorization:fBearer{token},Content-Type:application/json}data{approval_code:approval_code,open_id:open_id,form:{form_data:json.dumps(form_data,ensure_asciiFalse)}}resprequests.post(url,headersheaders,jsondata,timeout30)resultresp.json()ifresult.get(code)0:instance_idresult[data][instance_id]returninstance_idelse:raiseException(f发起审批失败{result})# 查询审批状态defget_approval_status(token,instance_id):urlfhttps://open.feishu.cn/open-apis/approval/v4/instances/{instance_id}headers{Authorization:fBearer{token}}resprequests.get(url,headersheaders,timeout30)resultresp.json()ifresult.get(code)0:statusresult[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 #林焱作者林焱

相关新闻