企業 IM 裡直接調 AI Agent:4 步搞定飛書/釘釘/企微接入

不用改網路、不用買伺服器,30 分鐘把 AI Agent 接進企業微信/飛書/釘釘,支援 Stream 模式即時推送

2026-08-24 · Leo · 教學 · 8 分鐘閱讀
TL;DR — 企業 IM(飛書/釘釘/企微)接入 AI Agent 只要 4 步:① 選 Webhook 回調模式(免公網 IP)→ ② 配平台機器人的 Outgoing 回調地址 → ③ 寫 Flask 接收服務(10 行 Python)→ ④ 設定 Mule Agent 的 IM 接入渠道。Stream 模式實現打字機式即時推送,體驗比傳統輪詢好 10 倍。

一、先搞清兩種接入模式的差異

接入企業 IM 有兩條路徑,選錯了要多走很多彎路:

模式原理是否需要公網 IP適合場景
長連線(Agent→IM)AI Agent 主動推訊息到 IM✅ 需要有固定出口伺服器
Webhook 回調(IM→Agent)IM 把訊息 POST 到你的服務❌ 不需要內網/無伺服器/不想暴露連接埠
混合模式Webhook 接收 + Agent 回調推送✅ Agent 側需要需要雙向即時對話

對大多數企業來說,Webhook 回調模式是最佳起點:不需要改防火牆、不需要買雲端伺服器,Mule Agent 提供了穩定的回調接收端,使用者發訊息到 IM,IM 自動轉發給 Agent,Agent 處理完再推回 IM。

二、步驟 1:在 Mule Agent 設定 IM 接入渠道(約 5 分鐘)

Step 1:登入 Mule Agent 管理後台
進入「渠道管理」→「新增渠道」,選擇你要接入的平台: 設定完成後,系統會產生一個 Webhook 回調地址,格式類似:
https://your-agent-domain.com/webhook/feishu
這個位址就是你要填入 IM 平台設定裡的 Outgoing 回調 URL。

三、步驟 2:在各 IM 平台設定 Outgoing 回調(約 10 分鐘)

飛書設定

Step 2a:飛書企業自建應用設定
  1. 進入 飛書開放平台 → 找到你的自建應用
  2. 「新增應用能力」→「機器人」,啟用機器人能力
  3. 「事件訂閱」→ 勾選「接收訊息 (im.message.receive_v1)」
  4. 「請求位址設定」→ 填入 Mule Agent 產生的回調 URL(需要 HTTPS)
  5. 發布應用版本,等待企業管理員審批
⚠️ 飛書要求回調位址必須是 HTTPS 且網域已備案。如果你的網域還沒有 HTTPS,用 Let's Encrypt 免費憑證(見下方踩坑 1)。

釘釘設定

Step 2b:釘釘企業內部開發應用設定
  1. 進入 釘釘開放平台 → 企業內部開發 → 找到你的應用
  2. 「訊息推送」→「機器人」→ 啟用自訂機器人
  3. 「訊息接收」→ 設定回調 URL,Token 和 EncodingAESKey 由 Mule Agent 自動產生
  4. 訂閱訊息事件:im.message.receive(接收訊息)
  5. 儲存後,釘釘會推送測試訊息驗證連通性

企業微信設定

Step 2c:企業微信自建應用設定
  1. 進入企業微信管理後台 → 「應用管理」→ 找到你的自建應用
  2. 「企業可信 IP」→ 新增 Mule Agent 伺服器 IP(如果 Agent 在內網,這步可跳過)
  3. 「接收訊息」→ 設定回調 URL(需要 HTTPS)
  4. 開啟「應用訊息」權限,儲存

四、步驟 3:撰寫訊息接收服務(約 10 分鐘)

Step 3:Flask 接收 + 轉發給 Mule Agent(完整程式碼)

以下是一個最小可用的 Flask 服務,監聽 IM 平台回調並轉發給 Mule Agent 處理:

import os
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

# Mule Agent Webhook Token(從管理後台取得)
MULE_AGENT_TOKEN = os.environ.get("MULE_AGENT_TOKEN", "your-agent-token")
MULE_AGENT_API = "https://your-agent-domain.com/api/chat"

@app.route("/webhook/feishu", methods=["POST"])
def feishu_webhook():
    # 飛書簽章驗證(生產環境必須驗證)
    body = request.json
    user_msg = body.get("text", {}).get("content", "")
    resp = requests.post(
        MULE_AGENT_API,
        headers={"Authorization": f"Bearer {MULE_AGENT_TOKEN}"},
        json={"message": user_msg},
        timeout=30
    )
    agent_reply = resp.json().get("reply", "")
    return jsonify({"msg_type": "text", "content": {"text": agent_reply}})

@app.route("/webhook/dingtalk", methods=["POST"])
def dingtalk_webhook():
    body = request.json
    user_msg = body.get("text", {}).get("content", "")
    resp = requests.post(
        MULE_AGENT_API,
        headers={"Authorization": f"Bearer {MULE_AGENT_TOKEN}"},
        json={"message": user_msg},
        timeout=30
    )
    agent_reply = resp.json().get("reply", "")
    return jsonify({"msgtype": "text", "text": {"content": agent_reply}})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=False)

這段程式碼放到一台有公網 IP 的伺服器上(或者用雲端函數/容器服務),即可完成訊息的接收和轉發。生產環境別忘了加:簽章驗證、超時處理、日誌記錄。

五、步驟 4:啟用 Stream 模式,打字機式即時推送(約 5 分鐘)

Step 4:Stream 模式讓 AI 回覆像打字一樣即時

傳統模式是等 Agent 處理完再一次性推訊息,使用者要等 5-30 秒,體驗很差。Stream 模式讓 AI 逐句推送,使用者看到的是「正在輸入」效果:

import os, json
from flask import stream_with_context, Response
import requests

MULE_AGENT_API = "https://your-agent-domain.com/api/chat/stream"
MULE_AGENT_TOKEN = os.environ.get("MULE_AGENT_TOKEN", "your-agent-token")

@app.route("/webhook/feishu/stream", methods=["POST"])
def feishu_stream():
    body = request.json
    user_msg = body.get("text", {}).get("content", "")

    def generate():
        resp = requests.post(
            MULE_AGENT_API,
            headers={
                "Authorization": f"Bearer {MULE_AGENT_TOKEN}",
                "Accept": "text/event-stream"
            },
            json={"message": user_msg},
            stream=True, timeout=60
        )
        for line in resp.iter_lines():
            if line:
                yield f"data: {json.dumps({'msg_type':'text','content':line.decode()})}\n\n"

    return Response(
        stream_with_context(generate()),
        mimetype="text/event-stream"
    )

Stream 模式特別適合長文字生成(報告生成、程式碼編寫、文件總結),使用者在等待過程中就能看到輸出,心理體驗比乾等好得多。

六、踩坑實錄:接入時最容易出問題的 4 個地方

坑 1:回調位址 HTTPS 憑證問題

現象
飛書/企微報錯「簽章驗證失敗」或「連線超時」,但服務明明在線。
根因
回調位址用了自簽署憑證,或者 Let's Encrypt 憑證鏈不完整。飛書要求完整的憑證鏈驗證。
修法:使用 Let's Encrypt 完整憑證鏈(不要只傳 cert.pem,要包含 fullchain.pem);定期續期(Let's Encrypt 憑證 90 天過期,建議用 certbot auto-renew);或直接用雲端厂商的負載平衡器(阿里雲 CLB/騰訊雲 CLB)自動處理憑證。

坑 2:飛書簽章驗證攔截

現象
本地測試 curl 正常,但飛書發訊息沒有回應。
根因
飛書所有請求都帶簽章頭 X-Lark-Signature,服務沒有驗簽,飛書拒絕重試(飛書對無回應端點會逐漸降級推送頻率)。
修法:在生產環境加上簽章驗證邏輯(飛書開放平台有官方驗簽範例);測試階段可以在飛書後台臨時關閉「簽章驗證」開關(僅限測試環境)。

坑 3:訊息體欄位名不一致

現象
飛書能正常收到訊息,釘釘卻收不到,程式碼完全一樣。
根因
三個平台的回調訊息體結構不同:飛書是 {"text": {"content": "..."}},釘釘父層 key 不同,企微又是另一種結構。
修法:每個平台獨立寫一個接收路由,不要復用;先用各平台的「測試訊息」功能確認訊息體結構;日誌輸出完整的 request.json 方便除錯。

坑 4:Stream 模式超時導致 IM 顯示「服務超時」

現象
Stream 模式下 AI 回覆很長,飛書/釘釘顯示「服務暫時不可用」。
根因
企業 IM 平台對單個請求有超時限制(通常 30-60 秒),長回覆超出限制。
修法:Stream 模式下用「打字機效果」分段推送(每 200 字推一次),不要等全部生成完再推;或者對超長回覆截斷,並在末尾加「已截斷,完整內容請訪問...」連結。

七、通用 SOP:30 分鐘從零完成 IM 接入

  1. Step 1(5 分鐘):在 Mule Agent 管理後台「渠道管理」新增目標 IM 平台,產生 Webhook 回調位址。
  2. Step 2(10 分鐘):在對應 IM 平台開放後台設定 Outgoing 回調 URL,開啟機器人能力,訂閱接收訊息事件。
  3. Step 3(10 分鐘):部署 Flask 接收服務(參考上方程式碼),驗證回調位址可連通(curl 本地測試 + IM 後台測試訊息)。
  4. Step 4(5 分鐘):開啟 Stream 模式,體驗即時推送效果;設定定時任務(可選):每天早上 9 點推送日報到群。
🤝 想把 AI Agent 接進你們的飛書/釘釘/企微?Mule Agent 支援三平台接入,郵件 278946228@qq.com 取得接入方案。