從建立企業自建應用到收到第一條 AI 訊息(含 4 個報錯修法)
open.feishu.cn → 用企業管理員掃碼登入App ID、App Secret(關頁面後再看不到)im:message(收發訊息)、im:message.group_at_msg(群 @ 機器人)、im:message.p2p_msg(私聊)im.message.receive_v1(使用者發訊息觸發)先跑通 Webhook 連通性驗證,再接 AI:
from flask import Flask, request, jsonify
import lark_oapi as lark
app = Flask(__name__)
@app.route("/webhook", methods=["POST"])
def webhook():
# 1) 驗證 URL(首次會帶 challenge 欄位,原樣返回)
data = request.json
if data.get("type") == "url_verification":
return jsonify({"challenge": data["challenge"]})
# 2) 處理訊息事件
event = data.get("header", {}).get("event_type")
if event == "im.message.receive_v1":
msg = data["event"]["message"]
sender = msg["sender"]["sender_id"]["open_id"]
text = msg["content"]["text"]
# 這裡先 echo,正式版本替換為 AI 呼叫
reply_text = f"你剛說了:{text}"
send_message(sender, reply_text)
return jsonify({"code": 0})
def send_message(receive_id, text):
# 調 lark SDK 發訊息(省略,你有自己的實現即可)
pass
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
ngrok http 8080https://xxx.ngrok.io 類似 URL,填到飛書"事件訂閱 → 請求網址"{"code": 0} 即通替換 webhook() 函式里的 echo 邏輯:
import requests
def ask_ai(prompt):
"""呼叫自部署 AI 服務(你的服務地址)"""
resp = requests.post(
"https://your-ai-service/api/chat",
json={"message": prompt, "max_tokens": 1000},
timeout=30
)
return resp.json()["reply"]
# 在 webhook() 裡:
reply_text = ask_ai(text)
第一次跑通後,再加:
Webhook 驗證時飛書會發 {type: "url_verification", challenge: "..."},必須 原樣返回 challenge 欄位。漏掉就失敗,且沒有任何錯誤提示。
type == "url_verification" 分支,再處理業務邏輯。
飛書的 tenant_access_token 透過 App ID + App Secret 換取。App Secret 輸錯 → 230001 報錯。但頁面只顯示"呼叫失敗",看不出具體原因。
最常見:發的 receive_id_type 錯了。飛書區分 open_id / user_id / email / chat_id 四種 ID 型別,混用就"成功但收不到"。
sender_id 物件裡有各種 ID,按傳送目標選對型別。私聊用 open_id,群用 chat_id。
飛書按租戶限頻 100 QPS。客服群裡 20 個人同時 @ 機器人問問題,瞬間超出。
下一步(按重要性排):