中文 ENG

QQ 机器人日程规划系统 __openClaw in Practice #2

写在前面

先用几句话交代这个想法最初是从哪里出发的,再进入具体内容。

方案二:QQ 机器人日程规划系统 (QQ-Integrated Scheduling Agent)

1. 系统架构与通信拓扑 (Architecture & Topology)

由于腾讯官方协议的封闭性,我们在工程上采用社区事实标准 OneBot v11 协议。整个系统分为三个独立的微服务容器,通过 Docker 内部网络(Internal Network)进行通信,彻底隔绝外部直接访问。

  • 通信网关层 (OneBot Client):使用基于协议逆向的客户端(如 NapCatQQ 或 Lagrange.Core),负责维持与腾讯服务器的长连接,并将 QQ 的私有协议序列化为标准的 JSON 载荷。
  • 逻辑处理层 (OpenClaw Agent):挂载针对 OneBot 协议的 Webhook 或 WebSocket 监听器。接收自然语言输入,通过 LLM 提取意图(Intent Extraction),并将其映射为针对日历的 CRUD(创建、读取、更新、删除)操作。
  • 状态持久层 (Local State DB):为保证最高级别的隐私与隔离,放弃使用需 OAuth 鉴权的外部日历(如 Google Calendar),转而通过 SQLite 或标准的 .ics (iCalendar) 文件在本地管理时序数据。

2. 文件系统与网络隔离设计

在宿主机上,我们构建如下的物理拓扑,确保即交通讯组件被攻破,也无法触及系统的其余部分。

/opt/openclaw/scheduler_bot/
├── docker-compose.yml          # 容器编排
├── config/
│   ├── openclaw.json           # Agent 配置 (挂载 :ro)
│   └── system_prompt.md        # 系统提示词 (挂载 :ro)
└── workspace/
    └── schedule_db/            # 日程数据库存储 (挂载 :rw)
        └── calendar.sqlite     # 仅允许 Agent 读写此数据库

3. 核心配置文件示例 (docker-compose.yml)

此配置建立了一个封闭的二层网络(bot_internal_net),确保 OpenClaw 的控制端口和 QQ 客户端的 RPC 端口均不对宿主机暴露。

version: '3.8'

services:
  # 通信网关:NapCatQQ (将 QQ 协议转换为 OneBot 标准)
  qq_gateway:
    image: mlwn/napcat-qq:latest
    container_name: napcat_gateway
    environment:
      - ACCOUNT=${TEST_QQ_ACCOUNT}
      - WS_REVERSE_URL=ws://scheduler_agent:8080/onebot/v11 # 反向 WS 指向 OpenClaw
    networks:
      - bot_internal_net
    volumes:
      - ./napcat_data:/app/.config/napcat:rw # 仅用于保存 QQ 登录 Token

  # 逻辑核心:OpenClaw Agent
  scheduler_agent:
    image: openclaw/openclaw:latest
    container_name: claw_scheduler
    user: "1000:1000"
    cap_drop:
      - ALL
    restart: unless-stopped
    networks:
      - bot_internal_net
    environment:
      - LLM_API_KEY=${LLM_API_KEY}
      - LISTEN_PORT=8080 # 仅在内部网络监听
    volumes:
      - ./config:/app/config:ro
      - ./workspace/schedule_db:/app/workspace/schedule_db:rw

4. 状态机与工具链约束 (Tools Definition)

LLM 本身没有时间概念。为了让 Agent 能够精准管理日程,必须在 openclaw.json 中为其开发或注入以下三个高度受限的系统工具(Skills):

  1. get_current_time(): 获取当前系统时间(严格校验时区,如 UTC+8)。
  2. query_schedule(start_time, end_time): 查询指定时间窗口内的 SQLite 记录。
  3. modify_schedule(action, event_details): 执行具体的增删改操作。此函数必须在底层实现强校验,防止 LLM 输出非法的 SQL 语句(防止 SQL 注入风险)。

5. 交互逻辑与 System Prompt 设定

config/system_prompt.md 中,需明确 Agent 的行为边界与解析逻辑:

# Role
你是一个运行在受限环境中的时间管理与系统调度中枢。你的语言必须绝对精确、逻辑严密,仅输出执行结果,不提供任何情绪价值或冗余寒暄。

# Constraints & Workflow
1. 你唯一的数据源和操作对象是 `/app/workspace/schedule_db/calendar.sqlite`。绝对禁止尝试读取系统其他路径。
2. 接收到自然语言指令后,必须先调用 `get_current_time()` 锚定时间基准。
3. 将模糊的自然语言(如“下周三下午开会”)转换为精确的 ISO 8601 时间戳格式,随后调用 `modify_schedule` 写入数据库。
4. 任何对现有日程的“覆盖(Update)”或“删除(Delete)”操作,必须在返回的文本中显式列出变更前后的状态对比,以供审计。

6. 工程风险警告

  • 账号风控:腾讯对非官方客户端的封控逻辑属于黑盒机制。强烈建议注册一个全新的 QQ 号作为此 Agent 的入口,切勿使用主账号,防止因高频 API 调用导致账号被冻结。
  • 指令注入拦截:如果在群聊中挂载此 Bot,必须在网关层(如 NapCatQQ 配置中)设立白名单(Whitelist),仅允许特定的 QQ 号(即你本人的账号)触发 Agent 的指令处理逻辑,防止越权调用。