从创建企业自建应用到收到第一条 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 个人同时 @ 机器人问问题,瞬间超出。
下一步(按重要性排):