飞书机器人接入 OpenClaw:内网 AI 对话系统实现方案

6 阅读4分钟

飞书机器人接入 OpenClaw:内网 AI 对话系统实现方案

背景

最近OpenClaw火得不行,我也跟风体验了一把。它有一个特别吸引我的点:能接入各种通讯平台,就像随身带了个AI秘书,所有数据只跟OpenClaw交互,私密性很有保障。

不过逛了一圈后发现,它支持的大多是国外平台,国内的基本没见着。用国外平台免不了要“搭梯子”,但我又不想让数据漂洋过海。于是灵机一动:不如用飞书机器人搭个“桥”,把对话对接到本地的OpenClaw——这样响应在本地处理,数据不出国,安全感满满。

如果连OpenClaw也部署在本地,那所有数据就完全掌握在自己手里了,由于它带有记忆功能,想想是不是可以实现一个自己的”贾维斯“。最关键的是,这个方案搭建起来简单、成本不高,还挺适合像我这样既想尝鲜又注重隐私的用户。

献丑一下

e892fb73c9dfdb6be544a03e47c8ce71.gif

飞书机器人配置

1、进入飞书开发者后台:open.feishu.cn/app?lang=zh… 2、创建企业自建应用 3、进入控制台,应用能力选择添加机器人。 4、在事件与回调中添加事件配置。 5、再添加接受消息 image.png 6、在权限管理添加如下权限

image.png

系统架构

系统采用云中转架构,由两部分组成:

┌─────────────┐
│  飞书用户    │
└──────┬──────┘
       │ 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_idunion_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 的智能对话集成。方案的核心优势:

  1. 解决内网访问问题:通过公网服务器中转,实现内外网通信
  2. 双线程高效处理:消息获取和处理并行,提高响应速度
  3. 直接回复机制:本地服务直接调用飞书 API,减少延迟
  4. 完整的会话管理:支持多用户并发对话,保持上下文

本文介绍了系统的核心架构和实现思路。完整的代码和详细的部署文档已经上传到 GitHub 仓库:github.com/jjzBruce/ta…

如果您在实施过程中遇到问题,欢迎在仓库中提 Issue 或留言讨论。


项目地址:github.com/jjzBruce/ta…