使用 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