n8n 集成飞书机器人实战与踩坑记录
记录了在 Docker 环境下使用 n8n 集成飞书机器人的实战过程。主要解决了 Webhook 模式下的系统 Bug,建议改用 WebSocket 长连接;解决了社区包安装及飞书应用事件订阅配置问题;修正了用户 ID(open_id)获取、JSON 数据路径、消息回复目标及内容格式等常见错误。通过详细日志和数据结构验证,确保集成稳定运行。

记录了在 Docker 环境下使用 n8n 集成飞书机器人的实战过程。主要解决了 Webhook 模式下的系统 Bug,建议改用 WebSocket 长连接;解决了社区包安装及飞书应用事件订阅配置问题;修正了用户 ID(open_id)获取、JSON 数据路径、消息回复目标及内容格式等常见错误。通过详细日志和数据结构验证,确保集成稳定运行。

我们的目标是将一个 n8n 销售助手工作流集成到飞书聊天中,实现:
飞书客户端 → 飞书开放平台 → WebSocket → n8n → PostgreSQL ↓ OpenAI API
背景: 项目初期,我们已有一个基于 Webhook 的销售助手工作流,自然想法是复用现有架构,通过简单配置飞书的 Webhook 回调来集成。
初始想法:
飞书消息 → 飞书平台事件推送 → n8n Webhook → 现有工作流
尝试 1:Response Mode 配置
Response Immediately尝试 2:手动修改配置文件
// 期望配置{"responseMode":"responseNode"}
// 但导出的实际配置{"responseMode":"onReceived"}
尝试 3:各种 Webhook 组合方案
关键发现: 经过反复测试和配置文件对比,发现这是 n8n 系统的严重 Bug:
Response Immediately// 前端显示的配置"Response Mode":"Response Immediately"
// 实际导出的 JSON 配置{"parameters":{"responseMode":"onReceived",}}
// 期望的正确配置{"parameters":{"responseMode":"responseNode",}}
尝试的方案列表:
觉醒时刻: 当意识到这可能是 n8n 系统级 Bug,且短期无法修复时,果断决定:
放弃 Webhook 方式,改用 WebSocket 方式
新技术路线:
飞书消息 → WebSocket 长连接 → LarkTrigger 节点 → 工作流
关键优势:
架构选择建议:
问题描述:
初期尝试通过 Dockerfile 安装 n8n-nodes-feishu-lark 包,但各种安装方式都失败:
# ❌ 这些方法都不行
RUN npm install -g n8n-nodes-feishu-lark
RUN cd /usr/local/lib/node_modules/n8n && npm install n8n-nodes-feishu-lark
错误现象:
✅ 正确解决方案: 使用 n8n 官方推荐的社区包安装方式(即使是第三方开发者的包): 注: n8n-nodes-feishu-lark 这个包功能比较全,但是是基于 n8n-nodes-feishu-lite 改进的
environment:
- N8N_COMMUNITY_PACKAGES_ENABLED=true
n8n-nodes-feishu-lark经验总结:
N8N_COMMUNITY_PACKAGES_ENABLED=true问题描述: WebSocket 连接成功,但收不到任何消息事件。
错误日志:
[ws] ws client ready [ws] ping success # 但是没有任何消息事件
问题根因: 飞书应用后台缺少事件订阅配置!
✅ 正确解决方案:
权限配置: 确保以下权限已开启:
✅ im:message ✅ im:message:send_as_bot ✅ im:message.group_at_msg:readonly ✅ im:message.group_msg ✅ im:message.p2p_msg:readonly
添加订阅事件:im.message.receive_v1
经验总结:
问题描述: SQL 查询报错 'there is no parameter $1'
错误配置:
// ❌ user_id 为 null
{{ $json.event.sender.sender_id.user_id }}
实际数据结构:
{"sender":{"sender_id":{"open_id":"ou_3ae54706fba3112ee8202a5564b00b45","union_id":"on_1b7e150a1f712b75ef4d7329594703bd","user_id":null}}}
✅ 正确解决方案:
使用 open_id 作为用户唯一标识:
// ✅ 正确的用户ID
{{ $json.sender.sender_id.open_id }}
SQL 参数配置:
// Query Parameters 中使用数组格式
={{[$json.sender.sender_id.open_id]}}
经验总结:
open_id 是飞书中最稳定的用户标识问题描述: LarkTrigger 接收到的数据结构与预期不符。
错误假设:
// ❌ 以为有 event 层级
$json.event.sender.sender_id.open_id
$json.event.message.content
实际数据结构:
{"sender":{...},"message":{...}}
✅ 正确路径:
// ✅ 正确的数据路径
$json.sender.sender_id.open_id
$json.message.content
经验总结:
问题描述: 群聊消息却发送到个人私聊。
错误配置:
// ❌ 发送给个人
receive_id:{{ $json.sender.sender_id.open_id }}
问题分析: 群聊消息应该回复到群聊,而不是私信给发送者。
✅ 正确解决方案:
// ✅ 回复到群聊
receive_id:{{ $json.message.chat_id }}
判断逻辑:
{"message":{"chat_id":"oc_19a51bd462e6c1d7e99eb90bd398b55f","chat_type":"group"}}
经验总结:
chat_id,私聊消息用 open_idchat_type 字段判断消息类型此外要注意,对于回复群聊的时候,需要在 n8n 的节点上将 Receiver ID Type 对应设置为 Chat ID
问题描述: 发送消息时报错 'Parameter 'content' could not be parsed'
错误格式:
// ❌ 直接传字符串
content:"{{ $json.response }}"
✅ 正确格式: 飞书文本消息需要特定的 JSON 格式:
{"text":"{{ $json.response }}"}
完整的飞书消息格式:
{"msg_type":"text","content":{"text":"实际消息内容"}}
经验总结:
services:
n8n:
image: docker.n8n.io/n8nio/n8n:stable
environment:
- N8N_COMMUNITY_PACKAGES_ENABLED=true
- N8N_LOG_LEVEL=debug
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
{
"type":"n8n-nodes-feishu-lark.larkTrigger",
"parameters":{
"events":["im.message.receive_v1"]
},
"credentials":{
"larkApi":{
"name":"Lark Tenant Token account"
}
}
}
SELECT library FROM sales_agent.user_weapons WHERE"userId"= $1 LIMIT1;
Query Parameters:
={{[$json.sender.sender_id.open_id]}}
// Receiver ID
{{ $json.message.chat_id }}
// Message Content
{"text":"{{ $json.response }}"}
environment:
- N8N_LOG_LEVEL=debug
- DEBUG=*
# 查看所有日志
docker logs -f n8n-001
# 过滤关键信息
docker logs -f n8n-001 | grep -E "(message|event|error|ws)"
在 n8n 界面中:
// 安全的数据访问
{{ $json.sender?.sender_id?.open_id ||'default_value'}}
整个集成过程中最大的坑是飞书应用的事件订阅配置,其次是数据结构的理解偏差。建议:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online