最近在玩飞书的开放能力,发现了一个很有意思的组合:
飞书卡片搭建工具 + n8n = 零代码搭交互应用
飞书卡片就是个可视化设计器,拖拽组件就能做出很好看的卡片。更牛的是,还能用 AI 一键生成。
配合 n8n,基本不用写代码(或者只写一点点),就能做出各种自动化工具。

今天这篇文章,我会用两个实战案例来展示这套技术栈的能力:
- 入群欢迎系统:单向通知场景
- 天气查询助手:双向交互场景
掌握这两个模式,你就能快速复制到其他场景:查快递、查工单、CRM 查询……
用到的东西:
飞书开放平台(卡片工具 + 长连接)、n8n、第三方 API(高德地图)
看起来很简单?确实如此。但在开始之前,我们需要做一些准备工作。
我会用 10 分钟带你完成:
- 飞书侧:创建应用 + 配置长连接
- n8n 侧:安装插件 + 创建凭证
准备好后,我们就能开始搭建第一个系统了。
一、准备工作
正式开始之前,得先把飞书和 n8n 连起来。
说实话,这部分最烦,但必须做。
不过好消息是:
- 只需要做一次,后面所有自动化都能复用
- 我会说清楚为什么要这么做,而不是让你盲目照做
- 我踩过的坑,你都不用再踩一遍
预计 10 分钟,泡杯咖啡慢慢来。☕
一)第一关:在飞书创建一个"应用"
1、为什么要创建应用?
你可能纳闷:我不是有飞书账号吗?为啥还要创建应用?
因为飞书把用和开发分开了。
你的飞书账号是拿来聊天、看文档的。
但要调 API、接收事件、做自动化?那得有个应用身份。
两者身份不同,能力也不同。
2、怎么创建?
1)进入飞书开放平台
访问 https://open.feishu.cn/,使用你的飞书账号登录。点击创建企业自建应用。

2)起个名字
应用名称:比如n8n+飞书的那些玩法(可以随便起)
应用描述:随便写点,比如n8n 自动化工作流
应用图标:上传一个图标

点击创建,应用创建成功。
3)复制两个关键信息
创建完成后,进入应用详情页,你会看到:
- App ID:格式类似 cli_a1b2c3d4e5f6g7h8
- App Secret:格式类似 xxxxxxxxxxxxxxxxxxxx
把这两个复制到记事本,待会要用。

💡
小提示:App Secret 就像密码,不要泄露给别人
二)第二关:启用机器人功能
1、机器人能干啥?
飞书的机器人能力,就是让你的应用能:
- 向用户或群组自动发送消息
- 响应用户的消息
- 进行群组管理
2、怎么启用?
1)找到机器人功能
在应用详情页,左侧菜单添加应用能力→ 点击机器人。

2)点击添加
看到说明后,点击添加即可。

启用后,你的应用就有了对话能力,可以进入下一关配置权限了。
三)第三关:给应用"开门禁卡"(权限配置)
1、为什么需要配置权限?
你刚创建的应用,就像一个刚入职的新员工,什么都做不了。
你需要给它开门禁卡,告诉飞书:这个应用可以读消息、发消息、加入群聊……
2、怎么配置?
1) 进入权限管理
点击左侧菜单「权限管理」

2)快捷导入权限
不用一个个勾选,直接用批量导入: 点击右上角批量导入,粘贴下面这段 JSON:
{
"scopes": {
"tenant": [
"im:message:send_as_bot",
"im:message.group_at_msg:readonly",
"im:chat.members:read"
]
}
}

点击确认新增权限。
3) 申请权限
导入后,点击页面上的申请开通。

如果你是管理员,会立即通过;如果不是,需要等管理员审批!
四)第四关:配置长连接(先了解,稍后配置)
1、为什么需要长连接?
这是整个准备工作里最关键的一步。
问题是这样的:n8n 需要监听飞书的事件(比如有人进群、有人发消息),才能触发自动化。
我们可以看到飞书提供两种方式让应用接收事件通知:
- 1.长连接:n8n 和飞书建立持久连接,实时接收事件
- 2.Webhook:飞书推送事件到你的服务器(需要公网 IP)

💡
我们选择长连接的原因
- 不需要公网 IP(n8n 可以部署在内网)
- 配置简单(不需要处理 Webhook 验证)
- 实时性更好(事件推送延迟更低)
2、先别急着配置!
这里有个先有鸡还是先有蛋的问题:
- 飞书说:你先把 n8n 启动监听,我才让你保存配置
- n8n 说:你先给我个 Workflow,我才能监听
解决方法:我们分两步走,先跳过这一关,等配置好 n8n 后再回来。
你只需要知道:长连接的配置需要 n8n 和飞书同时在线才能成功保存,否则会出现如下情况。

别担心,后面我会带你一步步完成
五)第五关:配置 n8n(装个插件)
1、为什么需要装插件?
技术上来讲,n8n 确实可以直接调用飞书 API,不需要插件。
但那样你需要:
- 自己处理 OAuth 认证
- 手动拼接 HTTP 请求
- 解析复杂的 JSON 响应
- 处理错误重试逻辑
- 管理 Token 刷新...
装个插件,这些全帮你搞定了,效率差太大了。
2、怎么装?
1)打开 n8n 的设置
点击左下角齿轮图标

然后选择社区节点

2)安装插件
点击安装按钮,输入包名: n8n-nodes-feishu-lark

点击安装,等几秒钟。
3)验证安装
安装成功后,在节点列表里搜索 Lark,应该能看到:

六)第六关:告诉 n8n 你的飞书账号
1、为什么需要这步?
n8n 装好插件了,但它还不知道你的飞书应用是哪个。
你需要把之前复制的 App ID 和 App Secret 告诉它。
2、怎么配置?
1)创建凭证
点击右上角「Credentials」

搜索「Lark Tenant」,点击进入

2)填写信息
- Base URL: 选择 https://open.feishu.cn
- App ID:你在飞书开放平台复制的 App ID
- App Secret:你在飞书开放平台复制的 App Secret
点击保存

这个凭证后续所有 Lark 节点都会用到,只需要创建一次。
七)第七关:打通飞书和 n8n(最后一步!)
还记得吗?飞书的长连接配置,需要 n8n 先监听。
现在,n8n 配置好了,我们可以完成这个任务了!
1、在 n8n 中创建测试 Workflow
新建 Workflow
点击New Workflow,命名为飞书连接测试。
拖入 Lark Trigger 节点
从右侧节点列表,拖入Lark Trigger。

配置节点
Credential:选择刚才创建的凭证

点击Execute Workflow按钮

这会让 n8n 进入监听状态。

关键:不要关闭这个页面!保持监听状态!
2、回到飞书保存长连接配置
切换到飞书开放平台
进入你的应用 → 左侧菜单「事件与回调」→「事件配置」。
选择长连接
在订阅方式处,选择长连接。
点击保存。

如果保存成功
- 说明 n8n 和飞书已经连上了!跳到下一步
如果失败,提示"应用未建立长连接"
- 检查 n8n 是否在Execute Workflow状态
- 检查凭证(App ID/Secret)是否正确
- 尝试重新点击 n8n 的Execute Workflow,然后立即保存飞书配置

3、发布应用版本
非常重要的一步:很多人配置完就以为完事了,结果不生效。
原因是:飞书要求发布新版本,配置才会生效。
怎么做:
保存成功后,点击页面上面的创建版本,然后保存。

只有发布后,配置才会真正生效!
4、最后一步:把机器人拉进群
打开飞书
找到你要测试的群聊。
添加机器人
点击群设置 → 群机器人 → 添加机器人 → 搜索你刚创建的应用名称 → 添加。


群里会提示:"XXX 邀请 YYY 加入此群"。
5、测试连接是否成功
回到 n8n
- 1.停止Execute Workflow(点击节点上的按钮)
- 2.将 Workflow 设置为Active状态(右上角开关变绿)
现在,长连接就会持续保持了。
在群里发条消息
随便发什么都行,比如:"测试"。
查看 n8n 执行历史
看 n8n 的执行历史(Executions)是否有新记录。
如果看到有新的执行记录,说明连接成功了!

恭喜!最烦的准备工作做完了。
这些配置只需要做一次,后续所有自动化都能复用。接下来,我们就可以开始搭建具体的自动化系统了!
二、第一个案例:入群欢迎提醒
前面那些准备工作做完了,现在终于能干点有意思的了。
接下来 10 分钟,咱们做第一个真正能用的东西:入群欢迎提醒。
先说说我们要做啥:
新人进群时,自动发张精美卡片:
- @ 新人(他立刻收到通知)
- 显示群名、群规则
- 四个快捷按钮(大礼包、课程动态、往期分享、微信群聊话题分享)
最开始,我用的是纯文本消息。
在 n8n 里写了一大段代码,像这样:
// 获取新加入的用户信息
const newUsers = $input.first().json.users;
const groupName = $input.first().json.name
const chatId = $input.first().json.chat_id;
// 构建欢迎消息
let welcomeMessage = "🎉 欢迎新伙伴加入「${groupName}」群!\n\n";
// 如果有多个新用户
if (newUsers.length > 1) {
const userNames = newUsers.map(user =>`@${user.name}`).join(' ');
welcomeMessage = `🎉 欢迎 ${userNames} 加入群聊!\n\n`;
} else {
const userOpenId = newUsers[0].user_id.open_id
welcomeMessage = `🎉 欢迎 <at user_id="${userOpenId}"></at> 加入「${groupName}」群!\n\n`;
}
welcomeMessage += `这里是我们的 n8n 工作流自动化实战课群聊,你可以:
- 有问题随时在群里交流
- 查看课程资料 & 实战案例 👉 https://dcn0h1uoszk5.feishu.cn/wiki/C0i9wU5S4iPWIJkONKEcbNktnAd?fromScene=spaceOverview
期待与你一起提升工作效率! 🚀`;
// 按照飞书API要求格式化content - 关键修改在这里!
const contentJson = {
text: welcomeMessage
};
// 将JSON对象序列化为字符串,这是飞书API要求的格式
const contentString = JSON.stringify(contentJson);
return {
chatId: chatId,
content: contentString,
messageType: "text"
};
效果确实有。
新人进群,0.5 秒内就能收到欢迎消息,24 小时在线,永不掉线。
但问题也很明显,维护太麻烦了。
有一天,我在飞书开放平台瞎逛,看到了卡片搭建工具。
点进去一看,这不就是我想要的吗!
牛在哪?
拖拽组件就能设计,像做 PPT。有 AI 辅助生成,丢张效果图,AI 自动给你生成卡片。
支持动态变量,能个性化。组件超丰富,按钮、图片、列表、表单...啥都有。
最关键的是:不!用!写!代!码!
我当时试了一下,用 AI 生成了一张卡片,真的只花了 2 分钟。
然后微调了一下,加了两个变量(用户名和群名),加了三个快捷按钮,又花了 3 分钟。
总共 5 分钟,搞定了一张比纯文本方便太多的卡片。
我当时就想,早知道有这个,我还写个屁的代码啊!
下面我就带你们从零做一遍,真的超级简单。
一)第一步:让 AI 帮你生成卡片
1、打开 AI 助手
打开飞书卡片搭建工具:https://open.feishu.cn/cardkit
点击那个AI生成卡片。
这个功能真的是神器,能省你好多时间。

2、跟 AI 说你想要啥
我当时是这样说的:
根据截图,做一个新用户进群的卡片,需要支持 @ 新用户进群
等了大概 10 秒,AI 就给我生成好了。
3、第一眼看到的时候,我真的惊了
AI 生成的卡片,已经有了:
- 标题:"🎉 欢迎加入「XXX」群!"
- 欢迎语:"欢迎 @某某 加入「XXX」群!"
- 群介绍(用列表排好的,很清晰)
基本上 80% 能用了!
我当时心里想:这也太牛逼了吧,我还准备自己拖半天组件呢。

二)第二步:让卡片能"动起来"
AI 生成的卡片有个问题:它是死的。
每次发送,内容都一样。
但我需要:
- @ 的人不一样(每次进群的人不同)
- 群名不一样(我可能用在好几个群)
怎么办?加变量!
这个其实很简单,就是告诉卡片:"这里要填一个动态的东西,别写死"。
1、添加变量
点右上角变量标签。
点 + 添加自定义变量,加两个:

📌
变量 1:
- 变量名:user_id
- 类型:文本
📌
变量 2:
- 变量名:group_name
- 类型:文本
这两个变量,待会儿 n8n 会传过来。
2、在卡片里用上这两个变量
找到欢迎语那个文本框,点进去。
原来写的是:
欢迎 @用户780206 加入「n8n+飞书的那些玩法」群!
改成:

这样一来:
- { {user_id}} 会被替换成真实的用户 ID
- { {group_name}} 会被替换成真实的群名
无论谁进群、进哪个群,都能正确显示。
三)第三步:加三个快捷按钮
卡片已经挺好看了,但我想让它更实用。
我加了四个按钮:
- 领取新人大礼包
- 课程更新动态
- 精彩案例回顾
- 热门讨论话题
新人最想知道:有啥福利、能学啥、咋深度参与。直接把答案放按钮里,省得后面一个个发。
1、怎么加?
拖个按钮组件到卡片底部,内容填上 🎁 领取新人大礼包

然后再创建一个点击事件,动作选择“打开链接”,兜底链接填上 你的资料链接

复制 3 次,改改文字和链接,搞定。
四)第四步:保存模板
点右上角「保存」。
这时候会生成一个模板 ID:
AAqhdhCuYfJNw
复制下来!待会儿在 n8n 里要用!
另外我们还需要做一下发布,同时将这个卡片和我们的应用做绑定。

卡片部分到这里就完了,超简单吧?
五)第五步:在 n8n 里搭工作流
卡片做好了,现在要让它活起来。
其实就是:
- 1.监听有人进群
- 2.拿到新人的ID
- 3.把这些信息传给卡片
- 4.发到群里
在 n8n 里,只需要 4 个节点。

整体结构长这样
[Lark Trigger] 监听事件
↓
[Template Config] 存卡片模板 ID
↓
[Router] 筛出"进群"事件
↓
[Send Message] 发卡片
每个节点都很简单,我一个个说。
1、节点 1:Lark Trigger
为啥选 Any Event?
因为后面会用 Router 过滤,这样更灵活。以后想处理别的事件(比如有人发消息),直接加个分支就行。
2、节点 2:Template Config
在 Lark Trigger 后面,拖个Edit Fields节点。
干啥用?
存卡片模板 ID。
为啥不直接写在 Send Message 里?
因为如果写死了,换卡片模板就得改工作流。存成变量,以后换模板改这一个地方就行。

3、节点 3:Router
在 Template Config 后面,拖个Switch节点。
为啥需要?
因为 Lark Trigger 会接收所有事件:有人进群、有人退群、有人发消息...
我们只关心有人进群,其他的不管。

这样,只有新人加入的事件,才会走到下一个节点。
4、节点 4:Send Message
在 Router 的新人加入分支后,拖个Lark节点。最重要的是关注 Content 数据
{
"type": "template",
"data": {
"template_id": "{
{ $('Card Config').item.json.GroupWelcomeCard }}",
"template_variable": {
"user_id": "{
{ $json.users[0].user_id.open_id }}",
"group_name": "{
{ $json.name }}"
}
}
}
这段 JSON 干了啥?
把卡片模板 ID、新用户 ID、群名,全塞进去。
然后飞书就知道:用哪个卡片模板,@ 谁,显示啥群名。
就这么简单!
六)第六步:测试
保存工作流,点右上角开关,设为Active。
然后邀请个人进群试试。

三、第二个案例:天气查询
和第一个案例不同,这次我们要做一个双向交互系统。
用户不是被动接收,而是主动发起查询,还能填表单。
听起来复杂?其实只是多了3个配置:
1. 开启机器人菜单
2. 配置两个事件监听
3. 准备3张卡片(表单→加载中→结果)
下面我重点讲和第一个案例不一样的地方。
一)核心差异点
1、差异1: 开启机器人菜单
第一个案例,机器人是被动触发(有人进群才发消息)。
这次,我们要让机器人有个入口,用户随时能点。
怎么做?
进入飞书开放平台 → 你的应用 → 左侧菜单机器人→机器人自定义菜单
配置如下:

📌
关键信息:
- 菜单名称:天气查询
- 响应动作:推送事件
- 事件ID:weather_inquiry_request(这个ID 待会儿要在 n8n 的 Router 里用到)
保存后,创建版本发布。
现在,用户点开机器人,就能看到这个天气查询按钮了。
2、差异2: 新增两个事件监听
第一个案例只监听了用户进群事件。
这次,我们需要监听两个新事件:
1)事件配置 → 添加事件
找到并添加:机器人自定义菜单事件 (application.bot.menu_v6)

为什么要加这个?
用于监听用户点击天气查询按钮。点击后,我们发一张表单卡片让用户输入城市。
2)回调配置 → 添加回调
添加:卡片回传交互 (card.action.trigger)

为什么要加这个?
用于监听用户在卡片上的操作:
- 提交表单
- 点击快捷城市按钮
- 点击查询天气按钮
配置完成后,别忘了创建版本发布!
📌
两个事件的区别:
第一个"机器人自定义菜单事件":监听用户点击菜单按钮
第二个"卡片回传交互":监听用户在卡片上的所有交互操作
3、差异3: 三张卡片的设计逻辑
这次不是一张卡片搞定,而是3张卡片无缝切换:
用户点击天气查询
→ 弹出表单卡片(输入城市)

→ 提交后显示"查询中"卡片(用户马上有反馈)

→ 2-3秒后更新为结果卡片(显示天气详情)

为什么要3张卡片?
很多人会问:直接等 API 返回结果,一步到位不是更简单?
问题是用户体验差。
如果调用高德 API + DeepSeek 处理需要 2-5 秒,用户会盯着空白屏幕干等。
中间插入查询中状态,体验提升10倍。
就像外卖App,下单后立刻显示商家接单中,而不是等商家真的接单了才有反应。

二)n8n工作流架构
我们直接看整体架构

工作流分两条线:
【欢迎新人】
【天气查询】:
Router 判断事件类型
→ 如果是点击菜单:发表单卡片
→ 如果是提交表单:
① 立即回复查询中卡片(用户马上有反馈)
② 后台调高德API+DeepSeek生成报告
③ 更新卡片为最终结果
核心节点就3个:
- Weather Agent (调高德地图+AI处理)
- Getting the weather(发"查询中"卡片)
- Send Weather Report(更新为结果卡片)
为什么用 Update Message Card 而不是 Send Message?
因为要在原卡片上更新,而不是发新消息。用户体验更好。
写在最后
说实话,刚开始做自动化的时候,我也担心过。
会不会让社群变得冷冰冰的?会不会少了人情味?
直到有一天,一个学员私信我:你们的社群很有温度。虽然知道有些是自动回复,但感觉每条消息都是为我准备的。
那一刻我突然明白了。
机器人帮我处理90%的重复工作,我就有时间去做那10%最重要的事:
真诚地回答一个深度问题、给焦虑的学员一句鼓励、优化一个让人眼前一亮的细节。
这才是自动化的意义。
如果这篇文章对你有帮助,欢迎转发给更多需要的人。
有问题随时在社群里交流,我每天都会认真看。
我们一起把自动化玩得更溜!