影刀RPA结合飞书机器人,实现报表数据全自动化推送

📅 发布时间:2026/9/8 8:00:08
影刀RPA结合飞书机器人,实现报表数据全自动化推送
影刀结合飞书实现报表数据全自动化推送做运营和财务的朋友应该都有这种体会每天或者每周固定时间得从后台导出报表整理数据再手动发给领导或者同事。操作本身不难但架不住天天重复偶尔忘了发还会被问一句“今天报表呢”。时间久了这事就成了一种隐形消耗。我自己就经历过一段这种日子所以后来花了一个周末用影刀加上飞书机器人把整个流程做成了全自动推送。到现在跑了几个月基本不用再碰它每天到点数据自己发到群里省心太多了。这篇文章就把我的完整实现思路和实操过程写出来包括影刀脚本怎么设计、飞书机器人怎么配置、消息怎么发才好看、定时触发怎么设置还有我踩过的几个坑。不管你是做运营、财务还是搞数据分析只要你有“定时从某个系统取数然后发到飞书群里”的需求这套方法都可以直接抄作业。先说一下整体方案能做什么影刀RPA负责定时打开系统、抓取报表、清洗处理数据飞书机器人负责把处理后的结果以文本、富文本甚至表格文件的形式推送到指定群聊。整个过程不需要写复杂的后端服务也不需要你有编程基础影刀的图形化流程设计加上几个Webhook请求就能搞定。1. 整体方案为什么选影刀和飞书机器人而不是自己写服务1.1 核心需求拆解抛开具体业务场景任何“报表自动化推送”的需求本质上都可以拆成三个环节取数从某个系统、后台、网页或者Excel文件里拿到原始数据。加工对原始数据做清洗、汇总、格式整理变成适合阅读或进一步处理的表格。推送把加工后的结果发送到指定的平台这里是飞书和指定的人/群里。这三个环节说起来简单但落到实际执行上难点往往在细节。比如取数时目标系统可能没有开放API只能通过网页登录去查加工时数据可能散落在多个Sheet里还可能带格式混乱的脏数据推送时还要考虑消息在飞书里阅读起来是否直观是发纯文字、卡片还是直接把Excel文件丢群里。影刀在这个方案里扮演的角色是“搬运工和加工厂”它擅长模拟人的操作去访问系统、抓取数据也能调用代码块做数据处理。飞书机器人则负责最后一公里的触达它通过Webhook地址接收影刀发送的HTTP请求把消息转成群聊里的内容。1.2 为什么用RPA加Webhook而不是自己写后端服务我最早其实想过直接写一个Python脚本挂服务器上定时跑任务调用飞书接口推送。但这个方案在真实场景里有几个绕不开的问题目标系统没有API。很多内部运营后台、第三方平台根本没有对外开放的数据接口或者申请权限流程漫长。RPA直接绕过了这个问题模拟浏览器操作就行。服务器要钱要维护。公网服务器、定时任务、运行日志这些都要自己折腾。影刀本身有客户端还有调度功能装在一台常开电脑上就能跑成本低得多。排查问题是需要可视化。写服务跑挂了你要看日志、查代码。影刀的流程运行记录非常直观哪一步出错、卡在哪个元素上界面上看得一清二楚对非纯技术背景的人来说友好太多了。当然Webhook推送这条路也有限制比如飞书自定义机器人对消息频率有管控但正常发报表完全够用。我的原则是能用简单方案解决的就不要引入重架构。2. 影刀侧报表数据抓取与预处理的完整流程2.1 数据获取的两种方式影刀操作数据的方式主要有两类一类是通过界面自动化去“看”页面上的数据另一类是直接读写Excel文件。我在实际项目里这两种都会用具体根据目标系统的形态来定。如果数据源是网页后台比如运营数据平台、ERP系统那影刀的标准流程就是启动浏览器 → 输入账号密码登录 → 点击菜单进入报表页面 → 选择筛选条件 → 点击查询 → 等待页面加载 → 抓取表格数据。这里有几个关键细节登录时的验证码能免则免。如果系统有验证码建议提前在系统层面申请免验证码登录或者用影刀的 OCR 组件去识别。我自己的项目里目标系统可以记住登录态所以影刀直接复用浏览器的Cookie省掉了每次登录的麻烦。抓取表格数据优先使用影刀内置的“获取网页表格数据”指令而不是去逐个读取单元格。前者一次性能把整个表格的二维数组抓出来后者不仅慢而且容易受到页面滚动影响导致漏数据。等待页面加载时别用固定延时去赌。影刀有“等待元素出现”这类指令用轮询等待代替sleep稳定性会好很多。我见过很多人写脚本页面还没加载完就开始抓数据结果抓到一堆空值。如果数据源本身就是Excel文件那就更简单了。影刀可以直接读取指定路径下的Excel也可以通过文件对话框去操作。这里我建议提前约定好源文件的固定命名规则比如“销售数据_20250601.xlsx”这样影刀可以通过遍历文件夹自动找到最新的那个文件来读。2.2 数据清洗和汇总处理报表数据很少是拿来就能直接发的通常涉及一些加工步骤。影刀本身支持单元格操作、列运算但说实话处理稍微复杂一点的逻辑用图形化指令会显得很笨拙。我更推荐的方式是在影刀流程中嵌入Python代码块用pandas来处理数据。实际项目中DataSource是一个汇总了多个分表的数据源。按日期维度汇总后需要计算同比环比还要把数值格式化成带逗号和单位的字符串。这些如果用影刀自身的Excel指令逐个单元格算流程会非常臃肿。改用Python脚本之后十几行代码就能解决而且后续维护逻辑也更清晰。import pandas as pd df pd.read_excel(源数据路径.xlsx) df[销售额] df[销售额].fillna(0) summary df.groupby(日期)[销售额].sum().reset_index() summary[环比] summary[销售额].pct_change().fillna(0) summary[销售额显示] summary[销售额].apply(lambda x: f{x:,.0f} 元) summary.to_excel(待推送数据.xlsx, indexFalse)注意事项是影刀嵌入Python时需要保证运行环境里有pandas和openpyxl这两个库。一般影刀自带的Python环境可能没装可以先在扩展组件里确认一下缺什么补什么。这一步很多人会忽略报错之后才回头装环境。2.3 报表文件的命名和归档数据加工完之后建议做两个动作一是把待推送的文件生成到一个单独的输出目录文件名带上日期方便留档二是把原始文件移动到“已处理”文件夹避免下次重复读取。这里有个小经验影刀在处理完数据后可以顺手把输出文件的最后修改时间记录下来写到日志或者飞书消息里。这样如果推送过程中出了问题回查的时候能快速确认“数据到底是不是最新的”。输出目录结构示例 D:\ReportAuto\ - 源数据\人工放置或系统导出 - 已处理\影刀处理完成后归档 - 待推送\影刀生成的最新报表 - 日志\运行记录与错误快照3. 飞书机器人配置从创建到发送自定义消息3.1 创建一个群聊机器人飞书自定义机器人是目前最轻量的一种接入方式。不需要申请应用不需要审核只要在飞书群里添加一个自定义机器人拿到Webhook地址就能通过HTTP请求往群里发消息。添加路径我记得很清楚是在飞书群里打开“设置” → “群机器人” → “添加机器人” → 选择“自定义机器人”。添加后飞书会给一个Webhook地址形如https://open.feishu.cn/open-apis/bot/v2/hook/xxxx-xxxx-xxxx这个地址要妥善保管因为任何拿到该地址的人都能往群里发消息。飞书官方也支持设置签名校验我建议从一开始就加上具体步骤是添加机器人时开启“签名校验”会生成一个密钥后续在影刀发送请求时需要在请求头里带上用时间戳和密钥生成的签名值。后面我会给出Python代码示例。3.2 文本消息和富文本消息的发送逻辑拿到Webhook地址之后发送消息的本质就是对Webhook发一个POST请求请求体是JSON。最基本的文本消息格式import requests import json webhook 你的webhook地址 headers {Content-Type: application/json} payload { msg_type: text, content: { text: 今日销售报表已生成请查收。 } } resp requests.post(webhook, headersheaders, datajson.dumps(payload)) print(resp.status_code, resp.text)如果是开了签名校验的机器人还需要再加一步签名计算。签名的算法是把时间戳秒级和密钥拼成字符串再用HMAC-SHA256加密最后把时间戳和签名字符串放进请求头。import time import hmac import hashlib import base64 timestamp str(int(time.time())) secret 你的密钥 string_to_sign f{timestamp}\n{secret}.encode(utf-8) hmac_code hmac.new(string_to_sign, digestmodhashlib.sha256).digest() sign base64.b64encode(hmac_code).decode(utf-8) headers { Content-Type: application/json, X-Lark-Signature: sign, X-Lark-Request-Timestamp: timestamp }富文本消息比纯文本好看得多适合展示报表指标。它的msg_type是“post”content里是一个二维数组也就是多个行每行里可以放多个文本段。我经常用来发日报第一行是标题第二行是核心指标第三、四行分别是环比和说明。payload { msg_type: post, content: { post: { zh-CN: { title: 6月1日销售数据日报, content: [ [{tag: text, text: 销售额1,234,567 元, style: bold}], [{tag: text, text: 环比昨日12.5%}], [{tag: text, text: 备注华东区域增长明显。}] ] } } } }这里有个小技巧富文本消息里的文本段加上style: bold可以让重要指标加粗显示阅读体验提升非常大。大家在推送给领导看的时候务必把关键数字标粗否则一串平铺直叙的文字重点很难被注意到。3.3 把表格文件推送到群聊如果只是发文字摘要那数据明细怎么办两个思路一是把明细也贴进消息里但飞书对消息内容长度有限制超出会被截断二是直接把Excel文件发到群里这也是很多团队的实际需求。飞书机器人发送文件需要通过两个步骤先把文件上传到飞书拿到media_id再调用消息接口把media_id作为文件消息发出去。这里要注意的是上传文件接口需要tenant_access_token而这又涉及创建一个飞书应用。听起来绕但其实成本也不高在飞书开放平台创建一个企业自建应用名字随意。给应用添加“上传文件”和“发送消息”权限。拿到App ID和App Secret通过接口换取tenant_access_token。用token去上传文件并发送。影刀里实现的时候我是在Python代码块里写完整的请求逻辑import requests import json def get_tenant_token(app_id, app_secret): url https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal payload {app_id: app_id, app_secret: app_secret} resp requests.post(url, jsonpayload) return resp.json()[tenant_access_token] def upload_file(token, file_path): url https://open.feishu.cn/open-apis/im/v1/files headers {Authorization: fBearer {token}} with open(file_path, rb) as f: files {file: f} data {file_type: xlsx, file_name: file_path.split(/)[-1]} resp requests.post(url, headersheaders, datadata, filesfiles) return resp.json()[data][file_key] def send_file_message(token, chat_id, file_key): url https://open.feishu.cn/open-apis/im/v1/messages?receive_id_typechat_id headers {Authorization: fBearer {token}, Content-Type: application/json} payload { receive_id: chat_id, msg_type: file, content: json.dumps({file_key: file_key}) } resp requests.post(url, headersheaders, jsonpayload) return resp.json()这个流程有个细节chat_id不是你群里看到的ID需要调用“获取群信息”接口来查。我当时查这个参数费了点时间建议在配置阶段先写一个小脚本把指定群的chat_id打印出来免得每次从日志里翻。实际上日常使用中我更推荐的替代方案是把Excel文件上传到飞书云文档上传后直接变成飞书表格然后往群里发一个链接。这样成员在线预览不用下载文件也省去了chat_id查询和复杂权限配置。具体实现可以用飞书开放平台的导入云文档接口影刀通过Webhook发链接消息即可。4. 定时触发与稳定性保障让脚本在无人值守下更可靠4.1 影刀的定时触发策略影刀RPA提供了多种触发方式在流程的“设置”里可以配置定时触发。支持按固定间隔比如每5分钟、按固定时间点比如每天9点、按周/月周期等模式。对于报表推送场景我优先用“固定时间点”精确到时分秒。我这里用的是三套触发策略的组合第一套每天9点整触发主流程执行“登录系统 → 抓取日报数据 → 处理汇总 → 推送到飞书群”。第二套每天9点5分再触发一次兜底检查流程查询飞书群里是否已经有今天的报表消息。如果没查到就重新执行一次主流程。第三套每个周一9点额外执行周报汇总流程生成周维度的报表数据并推送。第二套兜底策略是我后来加的。因为自动化跑得再稳也架不住网络抖动、系统维护、页面改版这些不可控因素。定时复查一次相当于给自己的自动化上了个保险。4.2 影刀断点续跑与会话保持RPA脚本在长时间无人值守情况下最怕的是运行过程中弹出意外窗口、会话超时、或者电脑锁屏导致页面卡死。针对这些情况我有几个实操建议关闭系统休眠和屏幕自动锁定。定时任务跑着跑着如果电脑休眠了影刀流程直接中断。在运行机器上把电源计划设为“始终开启”锁屏也关掉。影刀设置里开启“断点续跑”或“异常重试”。当某个步骤失败时可以指定重试次数和重试间隔。我一般设为失败后等60秒重试一次最多重试3次。关键步骤写日志。影刀流程中的每一个核心节点我都通过“记录日志”指令输出一条运行日志包含时间、步骤名、数据量。这样即使没赶上运行过程回看日志也能准确定位是哪一步出的问题。关于锁屏这个问题我再多说一句。如果公司电脑策略不允许关锁屏还有一种方法是让影刀在锁屏状态下仍然可以运行但前提是浏览器页面已经预先打开且Cookie不过期。实操下来我建议在流程最开始加一个“解锁屏幕”步骤如果检测到锁屏就自动解锁代码块里可以用Windows API发送解锁命令。不过这块各公司环境差异大建议先在自己电脑上把前两种方法做好。4.3 飞书消息频率限制与重试机制飞书自定义机器人对单条Webhook的发送频率有一定限制正常情况下发报表根本不会触发但当消息内容很长、或者同一时间并发多条消息时还是可能收到“请求过于频繁”的返回码一般是19021。我在影刀流程里给所有发送请求都加了重试机制当响应码为19021时等待10秒后重新发送最多重试5次。这个处理逻辑放在Python代码块里实现非常方便。def send_with_retry(payload, max_retry5): for i in range(max_retry): resp requests.post(webhook, headersheaders, jsonpayload) data resp.json() if data.get(code) 0: return True if data.get(code) 19021: time.sleep(10) continue else: print(f发送失败: {data}) return False return False另外一个容易踩的坑是发送消息时payload里如果有非ASCII字符比如中文字段名一定要用json.dumps指定ensure_asciiFalse否则飞书端显示出来的中文会变成\uXXXX乱码。这个细节很隐蔽我之前排查了好久才定位到。5. 常见问题与排查技巧我踩过的那些坑5.1 影刀侧遇到的典型问题影刀运行时报错大多数集中在元素找不到、页面加载慢、数据抓取为空这三类。我列一个速查表方便大家遇到问题时直接对照排查。表格问题现象可能原因排查方向元素找不到页面改版选择器失效更新元素选择器改用图片识别定位页面加载慢导致抓取空数据固定延时不足改用“等待元素出现”指令轮询登录态失效Cookie过期或浏览器缓存被清理流程增加重新登录步骤抓取数据量比预期少页面滚动未到底部懒加载未触发在抓取前执行滚动到底部操作Excel读取报错文件被其他进程占用先复制文件到临时目录再读取其中“元素找不到”是最高频的问题。我建议在编写影刀流程时凡是涉及点击和抓取的页面元素不要用绝对坐标定位优先使用文本选择器或CSS选择器。这样后面系统页面微调时脚本还能兼容。5.2 飞书侧经常遇到的问题飞书消息发送失败返回码是最直接的排查依据。除了前面提到的19021频率限制还有几个常见返回码表格返回码含义处理方法19001签名校验失败参数错误检查时间戳和签名算法确认请求头字段名正确19002机器人已停用在群设置里重新启用机器人19003消息内容为空或格式错误检查JSON结构特别是content字段19004群不存在或机器人不在群内确认Webhook是否来源于目标群19020消息推送太频繁降低发送频率或改为合并发送我碰到过一次印象很深的坑同一个Webhook地址在公司的办公网络环境下发送成功换到家里网络就报签名错误。排查半天结果是因为影刀的Python环境里requests库版本和公司环境不一致导致请求头的编码格式有差异。最后我把请求头手动指定为Content-Type: application/json; charsetutf-8问题就消失了。建议大家在发送请求时都显式加上charsetutf-8避免编码差异。5.3 端到端的调试技巧调试整个流程时最忌讳的是等到定时触发才发现问题。我的习惯是写完之后先手动触发一次完整流程并把影刀执行过程中的截图打开观察每一步的实际运行情况。重点观察三个节点登录环节是否稳定通过数据抓取环节是否拿全了数据飞书消息是否在群里正常显示如果这三步都OK再把定时触发打开观察两三天。前两天每天到点后主动看一眼群消息确认无误后再彻底放手。调试过程中还有一个实用技巧影刀可以单独运行流程中的某一个子流程块。这样修复问题时不需要每次都从头把整个流程跑一遍。比如我只是改了数据清洗逻辑就单独运行处理数据那个子流程效率会高很多。6. 进阶扩展让自动化方案更接近真正的“全自动”6.1 飞书多维表格作为数据落地终端如果你觉得“每天推一条报表到群里”还不够想让数据自动汇总到一个表格里不占群消息还能持久化那飞书多维表格是一个很好的落地终端。多维表格本身就是一个轻量数据库支持API写入。影刀在抓取完数据后可以通过飞书开放API把数据一行行插入到多维表格中。这样每天的数据都在同一个表里不断追加月底直接看图表趋势连二次汇总都省了。实现思路并不复杂先在飞书多维表格里建好字段然后通过影刀Python代码块调用飞书多维表格API按行插入数据。关键是API的鉴权方式和发消息不同需要获取应用凭证用tenant_access_token去请求。这是我的延伸扩展方向目前已经在部分项目中应用日常跑批效果很好。6.2 飞书H5免登录和网页自动化结合热搜词里出现了“vue 飞书h5免登录授权”这其实是另一个场景通过飞书账号体系免登录访问Web应用。如果公司内部的报表系统支持飞书免登那么影刀登录环节会进一步简化。原理是飞书开放平台提供免登授权服务Web应用前端通过JavaScript SDK获取授权码后端再换取用户身份。影刀在启动浏览器之后可以跳转到免登链接自动完成授权然后进入报表页面抓数。这样就不用维护独立的账号密码安全性更高也不用担心密码验证码变动导致脚本失效。不过要落地这个方案需要你们公司Web应用的开发配合在系统里接入飞书登录逻辑。如果系统本身有研发团队这个改造并不大。改造完之后影刀的登录步骤就可以从“输入账号密码”简化为“等待免登跳转”稳定性提升非常明显。6.3 影刀代码迁移和跨团队复用最后说一个很现实的问题很多公司的RPA脚本最初是个人业余时间搭的后面要交给团队或者迁移到统一管理环境里。热词里也有“影刀脚本迁移到另外一个公司上怎么操作”说明大家确实遇到了这类需求。影刀本身提供了导出和导入流程的功能导出的文件可以在另一台安装了影刀的机器上直接导入运行。但在迁移时有几个地方要格外注意流程中引用的文件路径、Excel路径都是绝对路径换机器后需要重新调整。网页登录的Cookie不会一起迁移新环境第一次运行需要手动登录一次。如果目标机器屏幕分辨率不同可能会影响部分基于坐标定位的元素建议统一用元素定位方式。如果要用飞书消息推送要把Webhook和密钥这些敏感配置单独抽出来放到环境变量或配置文件中便于不同环境切换。影刀也有代码迁移工具在较新版本里已经支持一键导出项目配置。建议迁移后在小范围先跑一周的观察期每天核对数据准确性没问题再正式全量替代。7. 这套自动化方案稳定运行的核心经验说完具体的实现步骤我把几个月实操下来最核心的经验做一次浓缩总结。第一日志是最便宜的保险。我在整个流程里几乎每个关键节点都埋了日志包括开始时间、数据抓取量、汇总条数、文件大小、发送结果。不要嫌麻烦等到出了问题这些日志就是你唯一的排查线索。第二主动加一个“自动发不出来就报警”的机制。除了前面提到的第二套兜底流程我还在影刀里配置了一个单独的条件分支如果主流程里的发送请求连续失败3次就直接调用一个独立的Webhook发一条带“失败”关键词的告警消息给运维群。这样领导那边的日常群不会收到失败的报错但负责的人一定能看到问题。第三数据准确性验证不能只看“有没有发”。自动化最重要的不只是“流程跑了”而是“结果对不对”。我的做法是在影刀汇总数据时顺带每次把总行数、总金额这些关键指标和昨日的做一次对比如果偏离超过阈值比如50%则在消息里附加一条“异常波动提醒”提醒人工复核。这一步虽然简单但能避免很多“发了错误数据”的尴尬场景。第四所有外部接口调用都应该有超时和重试而不是永远挂死。影刀的代码块里requests请求加上timeout参数连接失败时走重试逻辑。宁可多等一分钟重试也不要卡住整个流程。这个方案上线以来我最大的体会是自动化并不是把活推给工具就完事了它需要你持续地观察、调优、加固。但一旦稳定下来那种“每天到点自动完成人只需要看结果”的状态确实非常舒适。现在每天早上到工位我习惯性先看一眼飞书群数据已经在群里整整齐齐躺着这就是RPA加飞书组合给我带来的最直接的改变。如果你也在被各种重复性的报表推送困扰不妨按这套流程先搭一个最小可用版本跑通之后再逐步丰富细节。自动化这种东西启动永远比追求完美更重要。