Files
assist/docs/FEISHU_LONGCONN.md
Jeason 7151070c99 refactor: 第二轮架构缺陷修复 (1/2/3/4/9/10)
1. 内存泄漏修复:RealtimeChatManager 添加会话自动清理机制
   - 每10次操作检查超时会话(1小时无活动自动清理)
   - 最大活跃会话数限制500,超限清理最旧会话

2. 数据库索引补全:
   - Conversation: session_id, work_order_id 添加索引
   - WorkOrder: status 添加索引
   - ChatSession: user_id 添加索引
   - KnowledgeEntry: category, is_active, is_verified 添加索引

3. ServiceManager 线程安全:
   - 添加 threading.Lock 双重检查锁
   - 防止多线程并发初始化同一服务

4. API 响应格式统一:
   - 新增 api_response() 标准响应函数
   - 统一格式: {success, message, data} / {success, error}

9. asyncio 误用修复:
   - knowledge.py 文件上传改用安全的 asyncio 调用方式
   - 兼容已有事件循环和无事件循环两种场景

10. 请求限流:
    - 新增 rate_limit 装饰器(按 IP 限流)
    - chat/message 限制 20次/分钟
    - workorder/ai-suggestion 限制 5次/分钟
2026-04-02 22:37:44 +08:00

396 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 飞书长连接模式使用指南
> **已验证可用** - 2026-02-11
>
> 本文档介绍如何使用飞书官方 SDK 的长连接模式,无需公网域名即可接入飞书机器人。
## 🎯 什么是长连接模式?
飞书官方 SDK 提供了**事件订阅 2.0(长连接模式)**,相比传统的 webhook 模式有以下优势:
| 特性 | Webhook 模式(旧) | 长连接模式(新) |
|------|-------------------|-------------------|
| 公网域名 | 必需 | 不需要 |
| SSL 证书 | 必需 | 不需要 |
| 回调配置 | 需要配置 | 不需要 |
| 内网部署 | 不支持 | 支持 |
| 实时性 | 中等HTTP 轮询) | 高WebSocket |
| 稳定性 | 中等 | 高(自动重连) |
---
## 📦 安装步骤
### 1. 安装依赖
```bash
cd /Users/macos/Desktop/tsp-assist/assist
pip install -r requirements.txt
```
**核心依赖:**
- `lark-oapi==1.3.5` - 飞书官方 Python SDK
### 2. 配置环境变量
编辑 `.env` 文件:
```bash
# 飞书配置(必需)
FEISHU_APP_ID=cli_xxxxxxxxxxxxx # 你的飞书应用 ID
FEISHU_APP_SECRET=xxxxxxxxxxxxx # 你的飞书应用密钥
# 数据库配置
DATABASE_URL=sqlite:///./data/tsp_assistant.db
# LLM 配置
LLM_PROVIDER=qwen
LLM_API_KEY=sk-xxxxxxxxxxxxx
LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
LLM_MODEL=qwen-plus-latest
```
### 3. 初始化数据库
```bash
python init_database.py
```
### 4. 在飞书开放平台配置应用权限
访问 [飞书开放平台](https://open.feishu.cn/app),为您的应用添加以下权限:
**必需权限:**
- `im:message` - 获取与发送单聊、群组消息
- `im:message:send_as_bot` - 以应用的身份发消息
- `im:chat` - 获取群组信息
**可选权限(用于工单同步):**
- `bitable:app` - 查看、评论、编辑和管理多维表格
**注意:** 添加权限后需要重新发布应用版本。
---
## 🚀 启动服务
### 方式 1: 使用启动脚本(推荐)
```bash
python start_feishu_bot.py
```
启动后会看到:
```
================================================================================
🚀 TSP Assistant - 飞书长连接客户端
================================================================================
📋 配置信息:
- App ID: cli_xxxxxxxxxxxxx
- 数据库: sqlite:///./data/tsp_assistant.db
- LLM: qwen/qwen-plus-latest
- 日志级别: INFO
🔌 启动模式: 事件订阅 2.0(长连接)
优势:
- 无需公网域名
- 无需配置 webhook
- 自动重连
- 实时接收消息
💡 提示: 按 Ctrl+C 停止服务
================================================================================
🚀 启动飞书长连接客户端...
- App ID: cli_xxxxxxxxxxxxx
- 模式: 事件订阅 2.0(长连接)
- 无需公网域名和 webhook 配置
飞书长连接服务初始化成功
```
### 方式 2: 在代码中集成
如果您想将长连接服务集成到现有的 Flask 应用中:
```python
import threading
from src.integrations.feishu_longconn_service import get_feishu_longconn_service
# 在后台线程中启动长连接服务
def start_feishu_in_background():
service = get_feishu_longconn_service()
service.start()
# 启动
feishu_thread = threading.Thread(target=start_feishu_in_background, daemon=True)
feishu_thread.start()
# 然后启动 Flask 应用
app.run(...)
```
---
## 🧪 测试
### 1. 在飞书群聊中测试
**场景 1单个用户对话**
```
用户 A: @TSP助手 车辆无法连接网络怎么办?
机器人: [基于工单知识库的智能回复]
用户 A: 还有其他解决方法吗?
机器人: [基于上下文的多轮对话回复]
```
**场景 2多用户群聊隔离**
```
群聊 1:
用户 A: @TSP助手 我的车有问题
机器人: [针对用户 A 的回复]
用户 B: @TSP助手 我的车有问题
机器人: [针对用户 B 的独立回复,不受用户 A 影响]
群聊 2:
用户 A: @TSP助手 我的车有问题
机器人: [全新对话,不受群聊 1 影响]
```
### 2. 查看日志
服务运行时会实时输出日志:
```
[Feishu LongConn] 收到消息
- 消息ID: om_xxxxxxxxxxxxx
- 群聊ID: oc_xxxxxxxxxxxxx
- 发送者: ou_xxxxxxxxxxxxx
- 消息类型: text
- 原始内容: @TSP助手 车辆无法连接网络
- 清理后内容: 车辆无法连接网络
会话用户标识: feishu_oc_xxxxxxxxxxxxx_ou_xxxxxxxxxxxxx
为用户 ou_xxxxxxxxxxxxx 在群聊 oc_xxxxxxxxxxxxx 创建新会话: session_xxxxxxxxxxxxx
🤖 调用 TSP Assistant 处理消息...
准备发送回复 (长度: 156)
成功回复消息: om_xxxxxxxxxxxxx
```
---
## 🔧 与旧模式的对比
### 旧模式Webhook- 已废弃
**文件:** `src/web/blueprints/feishu_bot.py`
**工作流程:**
```
飞书 → 公网域名 → Webhook → Flask → 处理消息
```
**缺点:**
- 需要公网域名
- 需要配置 SSL
- 内网无法部署
- 需要在飞书后台配置回调地址
### 新模式(长连接)- 推荐
**文件:** `src/integrations/feishu_longconn_service.py`
**工作流程:**
```
飞书 ← WebSocket 长连接 ← SDK 客户端 ← 处理消息
```
**优点:**
- 无需公网域名
- 无需 SSL 证书
- 内网可部署
- 无需配置回调地址
- 自动重连
- 更稳定
---
## 架构说明
```
┌─────────────────────────────────────────────────────────────┐
│ 飞书服务器 │
│ (open.feishu.cn) │
└───────────────────────┬─────────────────────────────────────┘
│ WebSocket 长连接
│ (事件订阅 2.0)
┌─────────────────────────────────────────────────────────────┐
│ TSP Assistant (内网部署) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ feishu_longconn_service.py │ │
│ │ - 飞书 SDK 长连接客户端 │ │
│ │ - 自动接收消息事件 │ │
│ │ - 群聊隔离 (feishu_群ID_用户ID) │ │
│ └──────────────┬─────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ RealtimeChatManager │ │
│ │ - 会话管理 │ │
│ │ - 多轮对话 │ │
│ └──────────────┬─────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ TSP Assistant 智能引擎 │ │
│ │ - LLM 调用 │ │
│ │ - 工单知识库匹配 │ │
│ │ - AI 分析和建议 │ │
│ └────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
---
## ⚙️ 高级配置
### 1. 调整日志级别
编辑 `.env`
```bash
LOG_LEVEL=DEBUG # 查看详细日志
LOG_LEVEL=INFO # 默认(推荐)
LOG_LEVEL=WARNING # 仅警告和错误
```
### 2. 同时运行 Web 管理后台和长连接服务
**方式 1使用两个终端**
```bash
# 终端 1 - Web 管理后台
python start_dashboard.py
# 终端 2 - 飞书长连接服务
python start_feishu_bot.py
```
**方式 2使用进程管理器推荐生产环境**
创建 `supervisord.conf`
```ini
[program:tsp-web]
command=python start_dashboard.py
directory=/Users/macos/Desktop/tsp-assist/assist
autostart=true
autorestart=true
[program:tsp-feishu]
command=python start_feishu_bot.py
directory=/Users/macos/Desktop/tsp-assist/assist
autostart=true
autorestart=true
```
启动:
```bash
supervisord -c supervisord.conf
```
---
## ❓ 常见问题
### Q1: SSL 证书验证失败怎么办?
**错误信息:**
```
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain
```
**解决方案macOS**
1. **运行 Python 证书安装脚本**(推荐):
```bash
open "/Applications/Python 3.10/Install Certificates.command"
```
或者手动运行:
```bash
/Applications/Python\ 3.10/Install\ Certificates.command
```
2. **升级 certifi 包**
```bash
python3 -m pip install --upgrade certifi
```
3. **验证修复**
```bash
python3 -c "import urllib.request; urllib.request.urlopen('https://open.feishu.cn', timeout=5); print(' SSL 验证成功')"
```
**解决方案Linux/Windows**
```bash
pip3 install --upgrade certifi
```
### Q2: 启动后没有收到消息?
**检查清单:**
1. 确认飞书应用权限已配置(`im:message`
2. 确认应用已发布最新版本
3. 确认机器人已添加到群聊
4. 查看日志是否有连接成功的提示
5. 确认没有 SSL 证书错误(见 Q1
### Q3: 提示"权限不足"
**解决方案:**
1. 登录飞书开放平台
2. 进入应用管理 → 权限管理
3. 添加所需权限
4. 创建新版本并发布
5. 重启长连接服务
### Q4: 如何停止服务?
`Ctrl+C` 即可优雅停止。
### Q5: 可以在多台服务器上运行吗?
**不建议**。同一个飞书应用只应运行一个长连接客户端实例,否则会导致消息重复处理。
### Q6: 如何迁移旧的 Webhook 模式?
**建议:**
1. 保留旧代码(`feishu_bot.py`)作为备份
2. 使用新的长连接模式(`start_feishu_bot.py`
3. 测试无误后,可以移除 webhook 端点
---
## 🎉 总结
现在您的 TSP Assistant 已经支持**飞书官方 SDK 的长连接模式**
**核心优势:**
- 无需公网域名
- 无需 webhook 配置
- 内网可部署
- 自动重连
- 群聊隔离
- 完整的工单管理和 AI 分析功能
**使用方式:**
```bash
python start_feishu_bot.py
```
就这么简单!🚀