飞书机器人接入 OpenClaw:内网 AI 对话系统实现方案
背景
最近OpenClaw火得不行,我也跟风体验了一把。它有一个特别吸引我的点:能接入各种通讯平台,就像随身带了个AI秘书,所有数据只跟OpenClaw交互,私密性很有保障。
不过逛了一圈后发现,它支持的大多是国外平台,国内的基本没见着。用国外平台免不了要“搭梯子”,但我又不想让数据漂洋过海。于是灵机一动:不如用飞书机器人搭个“桥”,把对话对接到本地的OpenClaw——这样响应在本地处理,数据不出国,安全感满满。
如果连OpenClaw也部署在本地,那所有数据就完全掌握在自己手里了,由于它带有记忆功能,想想是不是可以实现一个自己的”贾维斯“。最关键的是,这个方案搭建起来简单、成本不高,还挺适合像我这样既想尝鲜又注重隐私的用户。
献丑一下
飞书机器人配置
1、进入飞书开发者后台:open.feishu.cn/app?lang=zh…
2、创建企业自建应用
3、进入控制台,应用能力选择添加机器人。
4、在事件与回调中添加事件配置。
5、再添加接受消息
6、在权限管理添加如下权限
系统架构
系统采用云中转架构,由两部分组成:
┌─────────────┐
│ 飞书用户 │
└──────┬──────┘
│ HTTP/HTTPS
↓
┌─────────────────────────────────────┐
│ 公网服务器 (feishu-listerner) │
└──────┬──────────────────────────────┘
│ HTTP API
↓
┌─────────────────────────────────────┐
│ 本地服务 (feishu-resp-server) │
└──────┬──────────────────────────────┘
│ HTTP API
↓
┌─────────────────────────────────────┐
│ OpenClaw Gateway + Agent │
│ - OpenAI 兼容 API │
│ - 智能对话处理 │
└─────────────────────────────────────┘
核心功能实现
1. 消息接收与存储
公网服务通过飞书事件订阅接收消息,提取关键信息并存储到 SQLite 数据库:
# 从飞书回调中提取发送者ID
sender_data = sender_info.get('sender_id', {})
sender_id = sender_data.get('open_id', '') or sender_data.get('union_id', '')
关键点:使用 open_id 或 union_id 作为发送者ID,而不是 chat_id。这是发送消息时的关键。
2. 双线程消息处理
本地服务采用双线程架构:
线程1 - 消息获取线程
def fetch_from_remote(self):
while self.running:
# 从公网服务获取未处理消息
remote_messages = self.get_unprocessed_messages()
# 保存到本地数据库
self.save_incoming_message(msg)
# 标记远程消息为已处理
self.mark_message_as_processed(server_id)
线程2 - 消息处理线程
def process_local_messages(self):
while self.running:
# 从本地数据库获取未处理消息
local_messages = self.get_local_unprocessed_messages()
# 调用 OpenClaw Agent 生成回复
result = self.process_single_message(msg)
# 直接发送回复到飞书
self.send_reply_to_server(sender_id, result)
3. OpenClaw 集成
通过 OpenAI 兼容 API 与 OpenClaw Gateway 交互:
def chat(self, message: str, user_id: str = None) -> str:
data = {
'model': f'openclaw:{self.agent_id}',
'messages': [{'role': 'user', 'content': message}],
'stream': False
}
if user_id:
data['user'] = user_id # 保持会话上下文
4. 直接消息发送
本地服务直接调用飞书 API 发送回复:
def send_message(self, recipient_id: str, content: str, receive_id_type: str = 'open_id'):
params = {"receive_id_type": receive_id_type}
data = {
"receive_id": recipient_id,
"msg_type": "text",
"content": json.dumps({"text": content})
}
关键点:receive_id_type 必须与 receive_id 的实际类型匹配。
部署说明
快速启动
# 1. 部署公网服务
cd feishu-listerner-server
cp .env.example .env
vim .env # 配置飞书验证令牌和内部验证码
pip3 install -r requirements.txt
./start.sh
# 2. 部署本地服务
cd feishu-resp-server
./setup.sh
vim .env # 配置公网服务地址和 OpenClaw 参数
./start.sh
配置要点
公网服务配置:
FEISHU_VERIFICATION_TOKEN=your_token_here
VERIFICATION_CODE=your_code_here
PORT=3000
本地服务配置:
FEISHU_LISTENER_URL=http://your-public-ip:3000
VERIFICATION_CODE=your_code_here
OPENCLAW_GATEWAY_URL=http://127.0.0.1:18789
OPENCLAW_AGENT_ID=secretary-agent
总结
通过云中转架构,我们成功实现了飞书机器人与内网 OpenClaw Agent 的智能对话集成。方案的核心优势:
- 解决内网访问问题:通过公网服务器中转,实现内外网通信
- 双线程高效处理:消息获取和处理并行,提高响应速度
- 直接回复机制:本地服务直接调用飞书 API,减少延迟
- 完整的会话管理:支持多用户并发对话,保持上下文
本文介绍了系统的核心架构和实现思路。完整的代码和详细的部署文档已经上传到 GitHub 仓库:github.com/jjzBruce/ta…
如果您在实施过程中遇到问题,欢迎在仓库中提 Issue 或留言讨论。