影刀RPA新手教程飞书机器人Webhook完全指南——消息推送格式、卡片消息与群通知自动化作者林焱 | 真实案例驱动每篇覆盖12大核心模块禁止空话。案例背景我把运营群的消息推送搞成了全自动去年双11运营团队每天要在3个飞书群里手动推送数据日报早上9点一次、下午6点一次。那个人休了三天假群里连续三天没数据老板直接在群里问人呢。我接手后用影刀RPA 飞书机器人Webhook把这套推送做到了完全无人值守。今天这篇文章就是把整套方案拆透从零到上线每一步都有代码。一、安装与准备工作打开影刀客户端新建一个应用取名飞书消息推送机器人。我当时犯的第一个错直接在本地跑没考虑服务器环境。正确做法先在影刀控制台创建一个应用发布到云端再用云调度触发。安装影刀就不赘述了官网下载一路下一步。重点说环境配置影刀版本建议 2.6 以上低版本HTTP指令有bugPython环境勾选嵌入Python后面要用到 requests 库编码设置应用设置里把编码改成 UTF-8否则中文会乱码我当时踩过这个坑本地跑得好好的发到云端就乱码。原因是本地Windows默认GBK云端是UTF-8HTTP请求没指定编码就翻车了。二、元素定位获取飞书Webhook地址飞书机器人的Webhook地址是固定的不需要元素定位去抓取。但很多新手不知道Webhook入口在哪这里说清楚打开飞书群 → 设置 → 群机器人 → 添加机器人 → 自定义机器人。勾选自定义消息类型复制 Webhook URL。URL格式是这样的https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx重要不要把完整的URL当秘密飞书机器人的安全机制是靠URL本身泄露就等于把群权限交出去了。我当时把URL写进了代码注释里提交到Git仓库后来不得不把机器人删了重建。正确做法把Webhook URL存到影刀的应用参数里运行时动态读取代码里永远不硬编码。三、变量与数据类型消息体的正确组装方式飞书消息推送的核心是往Webhook地址发一个HTTP POST请求Body是JSON格式。在影刀里先创建一个字符串变量webhook_url值是你的Webhook地址。再创建一个字典变量msg_body用来组装消息体。最简单的文本消息格式{msg_type:text,content:{text:测试消息}}在影刀里用配置参数指令来组装这个JSON变量名msg_body变量类型字典键值对msg_type→textcontent→ 另一个字典这里有个细节影刀的字典类型嵌套字典要用配置参数里的添加子项来操作。直接写JSON字符串再转字典也行但我更推荐用影刀原生的字典操作调试时能在变量面板直接看到结构。我当时踩过这个坑用Python的json.dumps()转出来的字符串再传给HTTP指令Content-Type没设为application/json飞书一直返回invalid body。四、流程控制按条件发送不同消息真实场景里消息内容是根据数据动态变化的。比如销售额达标就发绿色卡片不达标就发红色告警。用影刀的如果…否则指令来实现店群矩阵自动化突破运营极限如果 销售额 目标值 消息类型 成功卡片 否则 消息类型 告警文本 结束如果更复杂一点可以嵌套判断如果 销售额 目标值 * 1.2 发送超额完成卡片 否则如果 销售额 目标值 发送达标卡片 否则 发送未达标告警 所有人 结束如果循环指令用在批量推送场景。比如要给5个群各发一条消息把Webhook地址存到列表里用遍历循环逐个发送。当时我第一次写循环把HTTP请求放在循环里没加等待飞书限频第3条开始全部失败。正确做法每次发送后加睡眠指令等待1-2秒避开限频。五、网页自动化从后台抓取推送数据消息内容不能写死要从实际业务系统里抓。以电商后台为例用影刀的启动新浏览器指令打开后台页面。元素定位四合一策略先试XPath最稳//div[classsales-number]/spanXPath找不到再试CSS选择器div.sales-number span动态ID的情况用正则表达式匹配idsales_\d实在定位不到的用获取元素XPath指令先录一遍再手工优化。我当时踩过这个坑页面用了Shadow DOM影刀直接定位不到。解决方法是先用执行JavaScript指令在页面里用ShadowRoot.querySelector()拿到元素再把内容通过return传出来。六、数据处理把原始数据变成消息内容从页面抓到的数据通常是字符串需要处理成合适的格式。用影刀的文本处理指令做字符串拼接今日销售额 销售额 \n目标完成率 完成率 %多行文本用\n换行飞书的文本消息支持换行显示。如果是数字要做格式化完成率 round(销售额 / 目标值 * 100, 2)数据里有空值的情况用如果…否则做默认值处理如果 销售额 或 销售额 null 销售额 0 结束如果我当时遇到过一个坑页面加载不完全抓到的是空字符串直接做除法算完成率流程直接报错停了。后来在所有数据抓取后面都加了尝试捕获指令抓不到就用上一次缓存的值。七、鼠标键盘图像截图插入消息飞书机器人支持发送图片先把图表截图转成Base64再塞进消息体。用影刀的截取网页元素截图指令把销售趋势图截下来保存到本地路径。然后用Python把图片转成Base64importbase64withopen(C:/temp/sales_chart.png,rb)asf:img_base64base64.b64encode(f.read()).decode(utf-8)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2cb317897e884b308cf15b1c5f89a387.png#pic_center)print(img_base64)把Python的输出存到影刀变量img_base64里。飞书图片消息的格式{msg_type:image,content:{image_key:img_xxxxxxxx}}注意飞书发送图片不能直接贴Base64要先用上传图片接口拿到image_key再用image_key发消息。我当时在这里卡了半天一直往Webhook直接POST图片数据返回的都是unsupported msg type。八、进阶技能卡片消息的高级玩法文本消息能干的事太有限真实生产环境都用卡片消息。飞书卡片消息的JSON结构比较复杂用影刀的配置参数指令一层层组装{msg_type:interactive,card:{config:{wide_screen_mode:true},header:{title:{tag:plain_text,content:今日数据日报},template:green},elements:[{tag:div,text:{tag:lark_md,content:**销售额**¥120,000\n**完成率**120%}}]}}卡片颜色template可选值blue、green、orange、red、purple、grey。用变量动态控制颜色让卡片状态一眼可见如果 完成率 100 template green 否则如果 完成率 80 template orange 否则 template red 结束如果卡片里还能加按钮点击后触发另一个Webhook实现简单的交互。我当时做的方案卡片底部加一个查看详情按钮点击后跳转到数据看板页面。九、平台实战在影刀控制台配置定时触发写完流程要在影刀控制台配置定时调度才能做到每天自动推送。打开影刀控制台 → 任务中心 → 新建任务。任务类型选定时触发时间设成每天上午9点和下午6点。Cron表达式写法0 9,18 * * *意思是每天9:00和18:00各触发一次。触发器配置里把飞书Webhook地址作为参数传入这样换群只需要改参数不用改流程。我当时踩过这个坑流程里硬编码了Webhook地址后来运营新建了一个群要改地址只能改流程重新发版。正确做法所有外部配置Webhook地址、阈值、收件人列表全部通过应用参数传入。十、系统联动和邮件、短信形成多重告警飞书消息有可能漏看关键告警要多重通知。在影刀流程里飞书消息发送成功后再调一个邮件发送指令。邮件收件人列表存到影刀的列表变量里遍历发送。如果飞书消息发送失败HTTP返回码不是200立即发邮件告警内容是错误详情。用尝试捕获指令包住HTTP请求尝试 HTTP请求 POST webhook_url 如果 返回码 ! 200 发送邮件 飞书推送失败 返回消息 结束如果 捕获异常 发送邮件 流程异常 异常信息 结束尝试我当时有一次飞书Webhook被人改了权限所有推送全部失败又因为没加异常捕获失败了也没人知道。从那以后所有对外的HTTP请求我都会包一层状态检查和异常告警。十一、工程化规范让机器人不负责任上线的机器人要遵守几个规范否则跑着跑着就没人维护了。命名规范机器人名字要能看出用途比如数据日报推送机器人不要叫test、“机器人1”。日志规范每次推送在影刀流程里写一条日志记录推送时间、目标群、消息摘要。日志格式统一[飞书推送] 2024-11-11 09:00:02 | 运营群 | 销售额120000 | 成功异常处理规范所有HTTP调用都必须有超时设置和重试机制。飞书Webhook推荐重试3次每次间隔2秒temu店群自动化报活动案例循环 3次 尝试 HTTP请求 如果 返回码 200 跳出循环 结束如果 捕获异常 睡眠 2秒 继续 结束尝试 结束循环我当时没加热重试网络抖动导致每天总有那么一两条丢消息运营来问的时候才发现问题。十二、速查表与常见报错报错1HTTP 400 invalid body原因Content-Type没设为application/json或者JSON格式有语法错误。解决在HTTP请求指令里Header手动加一条Content-Type: application/json。报错2HTTP 9499 msg timeout原因Webhook地址失效或者机器人被删除了。解决去飞书群里重新添加一个机器人更新Webhook地址。报错3卡片消息显示不支持的消息类型原因卡片JSON结构写错了或者msg_type写成了text而不是interactive。解决对照飞书开放平台的卡片消息文档检查JSON结构。报错4发送成功但群里看不到消息原因机器人被移出了群或者群设置了仅群主可所有人。解决检查机器人在群里的状态调整群权限设置。飞书卡片颜色速查场景template值成功/达标green进行中/普通blue警告/接近阈值orange失败/严重告警red信息提示grey完整案例代码参考以下是主流程的核心代码片段可直接参考使用。HTTP请求配置Python实现在影刀执行Python代码指令里调用importrequestsimportjsondefsend_feishu_message(webhook_url,msg_body):headers{Content-Type:application/json,charset:utf-8}resprequests.post(webhook_url,datajson.dumps(msg_body,ensure_asciiFalse).encode(utf-8),headersheaders,timeout10)returnresp.status_code,resp.text# 卡片消息组装示例card_msg{msg_type:interactive,card:{config:{wide_screen_mode:True},header:{title:{tag:plain_text,content:销售日报},template:green},elements:[{tag:div,text:{tag:lark_md,content:**今日销售额**¥{}\n**完成率**{}%.format(sales,rate)}}]}}status,resultsend_feishu_message(webhook_url,card_msg)print(status,result)XPath元素定位参考以电商后台为例# 销售额元素 //div[contains(class,sales)]//span[classvalue] # 完成率元素 //div[iddashboard]//div[classrate]/text() # 动态ID处理 //div[contains(id,sales_)]/spanCSS选择器备选方案/* 销售额 */div.sales span.value/* 完成率 */#dashboard div.rate/* 包含特定文本的元素 */div:contains(销售额)我当时踩过这个坑三个最深刻的教训教训一Webhook地址硬编码在代码里。有次我把包含Webhook地址的代码截图发到技术群里问问题虽然马赛克了大部分但有人还是通过上下文猜到了完整地址。半小时后那个群开始收到垃圾消息。从那以后所有密钥、Webhook地址一律不进代码全部走参数。教训二没做发送频率限制。早期版本里数据异常触发告警1分钟内发了60多条消息到群里。群成员直接把机器人移出了群。现在所有推送都加频率限制同一个内容5分钟内只推一次告警类消息加提醒普通消息不加。教训三卡片消息的JSON手写没有校验。有一次手抖少写了一个引号JSON格式错误卡片消息一直发不出去。现在卡片JSON先用在线JSON校验工具检查再贴到影刀里或者用Python的json.dumps()来生成避免手写错误。延伸home.linyan.cloud 上的更多资源这篇文章的完整示例代码和飞书卡片消息模板我都整理到了 home.linyan.cloud包含10种不同场景的卡片JSON模板直接复制就能用。如果你在配置Webhook时遇到这篇文章没覆盖到的问题也可以去那里留言我看到会回复。#影刀RPA #RPA教程 #飞书机器人 #Webhook #消息推送 #自动化 #林焱作者林焱