任务完成确认 — #135 B端IM接入:飞书Webhook
执行人:Atlas🐻 | 完成日期:2026-03-07 | 状态:已完成
交付清单
新建文件(2个)
/09-虚拟办公区系统/feishu_bp.py(~490行)
- 飞书 Webhook 端点:
POST /webhook/feishu
- Challenge URL 验证(V1/V2 双格式兼容)
- X-Lark-Signature 签名验证(HMAC-SHA256)
- AES-256-CBC 消息体解密(需 pycryptodome,可选)
- im.message.receive_v1 事件解析
- @Agent 路由逻辑(花名册匹配 + Coco 兜底)
- 即时确认回复(先回"处理中",再回结果)
- AgentExecutor.execute_task() 调用 + 60秒轮询等待
- 飞书 Tenant Access Token 缓存管理
- 飞书 API 回复接口:
reply_message() / reply_card()
- 健康检查:
GET /webhook/feishu/health
- 消息日志:
GET /webhook/feishu/messages
- 主动发送:
POST /webhook/feishu/send
-
完整钉钉适配架构注释(未来扩展预留)
-
/09-虚拟办公区系统/config/feishu_config.yaml
- William 5步配置指南(注释完整)
- app_id / app_secret / verification_token / encrypt_key 配置模板
- 钉钉配置预留(注释形式)
修改文件(1个)
/09-虚拟办公区系统/app.py(3处修改)
- 第 74 行:
from feishu_bp import feishu_bp, init_feishu(import)
- 第 668 行:
init_feishu(executor=agent_executor)(初始化注入)
- 第 771 行:
app.register_blueprint(feishu_bp)(Blueprint 注册)
关键设计决策
- 异步处理:Webhook 立即返回 200,消息路由在独立线程执行,符合飞书 5 秒响应要求
- 两段式回复:先发"处理中"确认,再发最终结果,用户体验更好
- AgentExecutor 不改动:严格遵守接口约定,只调用
execute_task() 和 get_task_status()
- 降级策略:AgentExecutor 不可用时返回友好提示,不崩溃
- 配置热更新:YAML 配置 60 秒缓存,修改后无需重启 Flask
William 下一步操作
- 配置
config/feishu_config.yaml(填入飞书应用凭证)
- 启动 ngrok:
ngrok http 8082
- 将 ngrok URL +
/webhook/feishu 填入飞书开放平台事件订阅
- 重启 Flask:
cd 09-虚拟办公区系统 && bash start_all.sh
- 健康检查验证:
curl http://localhost:8082/webhook/feishu/health
Atlas🐻 完成 | 2026-03-07