n8n 集成飞书机器人:Webhook 签名与 Crypto 节点配置实战
在自动化流程中,向飞书推送消息时,开启签名校验是保障安全的关键。很多开发者在 n8n 中直接使用标准的 HMAC 逻辑会失败,因为飞书的签名算法比较特殊。本文将拆解如何在 n8n 中正确配置 Crypto 节点来完成签名,并实现稳定的消息推送。
飞书侧准备
首先需要在飞书群聊中添加自定义机器人。进入群组设置 -> 群机器人 -> 添加自定义机器人。获取 Webhook 地址后,务必开启'签名校验'功能,复制生成的密钥。
注意:自定义机器人仅限当前群聊使用,频率限制为单租户单机器人 100 次/分钟。发送请求体大小不能超过 20 KB。
n8n 核心配置
1. 生成时间戳
飞书要求签名中的时间戳必须是当前 Unix 时间戳(秒级)。我们使用 Edit Fields 节点来生成。
{{ Math.round(new Date().getTime() / 1000) }}
2. 计算签名(关键步骤)
这是最容易出错的地方。飞书的签名算法并非标准的 hmac(key, message),而是将 timestamp 和 secret 拼接作为 Key,空字符串作为 Message。
在 Crypto 节点中配置如下:
- Action: hmac
- Type: SHA256
- Value: (留空)
- Secret:
={{ $json.timestamp + '\n' + '你的飞书密钥' }} - Encoding: base64
这里利用了 n8n 的表达式引擎,动态拼接了时间戳和换行符。标准 HMAC 用法通常是 key=secret, msg=data,但飞书文档示例显示第一个参数 key 变成了 timestamp 和 secret 的拼接(用换行符),第二个参数 msg 为空。
3. 发送请求
最后通过 HTTP Request 节点调用 Webhook。Payload 需要包含 timestamp 和 sign 字段。
{
"timestamp": "{{ $json.timestamp }}",
"sign": "{{ $json.sign }}",
"msg_type": "text",
"content": {
"text": "测试消息"
}
}
消息类型支持
除了文本消息,飞书还支持富文本(Post)和卡片(Interactive)。
- 文本消息:适合简单通知,支持
<at>标签 @用户。 - 富文本消息:支持超链接和 @用户,结构较复杂,需嵌套 JSON。
- 卡片消息:可交互性强,但需注意仅支持 URL 跳转,不支持回调。
常见问题排查
- 签名校验失败:检查服务器时间与标准时间是否偏差过大,确保时间戳在 1 小时内。错误码通常为 19021。
- 关键词校验失败:如果开启了关键词过滤,请确保消息内容包含指定词。错误码通常为 19024。
- IP 白名单:若启用了 IP 白名单,请确认 n8n 运行环境的出口 IP 已加入。错误码通常为 19022。
通过以上配置,即可在 n8n 中安全、稳定地对接飞书机器人。

