使用 Minara客户端与界面消息平台
Lark / Feishu
通过 tenant_access_token 发送 Lark IM 消息,可选 AES-256-CBC 加密 webhook 事件。
🟡 出站就绪,支持入站。同时覆盖中国大陆飞书(
open.feishu.cn)和国际版 Lark(open.larksuite.com)。入站 webhook 支持 Lark 的全部三种安全模式:验证 token、加密和签名 HMAC。
功能概览
- 出站文本消息,通过
POST /open-apis/im/v1/messages?receive_id_type=chat_id发送。tenant access token 缓存 2 小时,并在到期前 5 分钟自动刷新,高频发送不会触及单应用 token 速率限制。 - 入站 webhook 事件,路径为
/webhooks/lark。Lark 允许开发者在三种安全模式中任意组合启用(验证 token、加密密钥、HMAC 签名)。Minara 会自动遵守你在开发者后台启用的模式。 - 域名感知路由。
LARK_DOMAIN决定使用国内飞书还是国际版 Lark,两者 API 结构完全一致。 - 当前仅支持文本消息。富文本卡片、图片和文件将在后续版本支持;tenant token 缓存和签名 webhook 已在本版本落地。
- 30,000 字符上限。超长文本会被截断。
配置步骤
1. 创建应用
- 登录 Lark 开发者后台(国际版请访问 Lark international)
- 创建自建应用,记录 App ID(以
cli_开头)和 App Secret - 在「权限与范围」中授予
im:message:send_as_bot;如需入站消息,还需授予im:message - 在「事件订阅」中,将请求 URL 设置为
https://<your-host>/webhooks/lark,复制 Verification Token 和(可选的)Encrypt Key
2. 获取默认 chat_id
在目标会话(单聊或群聊)中发一条消息,然后通过开发者后台调用 POST /open-apis/im/v1/messages/list,或用 curl 携带 tenant token 查询,提取 chat_id(格式:oc_xxxxxxxxxxxxxxxx),保存为 LARK_DEFAULT_CHAT_ID。
3. 配置 Minara
minara auth messaging add
# 从列表中选择 `lark`,依次填入 app id、app secret、chat id、
# verification token(若启用了加密还需填写 encrypt key)。也可直接写入项目根目录的 .env 文件:
LARK_APP_ID=cli_xxxxxxxxxxxxxxxx
LARK_APP_SECRET=<opaque secret>
LARK_DEFAULT_CHAT_ID=oc_xxxxxxxxxxxxxxxx
LARK_VERIFICATION_TOKEN=<verification token>
LARK_ENCRYPT_KEY=<encrypt key, optional>
LARK_DOMAIN=open.feishu.cn # or open.larksuite.com4. 测试
minara auth messaging test lark入站 webhook
在 Lark 事件订阅中,将请求 URL 配置为:
https://<your-host>/webhooks/lark三种安全模式可叠加使用:
| 模式 | 环境变量 | 作用 |
|---|---|---|
| 验证 token | LARK_VERIFICATION_TOKEN | 解码后的 payload 顶层 token 字段须与此值匹配。适用于明文模式及解密后校验。 |
| 加密 | LARK_ENCRYPT_KEY(可选) | 设置后,请求体为 {encrypt: "<base64>"},使用 AES-256-CBC 解密;密钥为 SHA256(encrypt_key),IV 为密钥前 16 字节。 |
| 签名 | X-Lark-Signature 请求头(始终可选) | 对 timestamp + nonce + encrypt_key + body 取 SHA-256,以十六进制写入请求头。在后台开启后可提供额外完整性校验。 |
URL 验证握手:Lark 发送 {type:"url_verification", challenge:"..."},Minara 校验 verification token 后回复 {challenge}。token 不匹配时返回 403。
限制与注意事项
- Tenant token 速率限制。Lark 每分钟每应用最多允许约 100 次 token 获取请求。2 小时缓存策略远低于此上限。
content必须是 JSON 编码的字符串。这是 Lark API 的特殊要求:文本消息也需以content: JSON.stringify({text: "..."})形式发送。Minara 已自动处理。- 暂不支持卡片交互。互动卡片的按钮点击回调属于不同的 webhook 事件类型,目前不予解析。
故障排查
「测试消息返回 code 99991663」
- tenant access token 刷新失败。请对照开发者后台检查
LARK_APP_ID和LARK_APP_SECRET。
「入站 webhook 返回 401」
- 若在后台启用了加密模式,但未设置
LARK_ENCRYPT_KEY,所有入站 POST 请求都会解密失败。请在后台关闭加密,或补充设置该环境变量。 - 若启用了签名模式,请确认保存的
LARK_ENCRYPT_KEY与后台显示一致(该值同时作为签名输入)。
「content field is required (400)」
- 调用
send_message时text为空字符串。Lark 拒绝空消息体。
参考资料
- 环境变量:
LARK_* - 出站实现:
apps/agent/src/messaging/lark.ts - 入站规范:
apps/agent/src/messaging/inbound/specs/lark.ts - Lark 开放平台:open.feishu.cn
- 加密方案:open.feishu.cn / Encryption case