npm package: @hmjbill/openclaw-onebot
Description: OneBot v11 protocol channel plugin for OpenClaw (LTS fork, QQ/Lagrange.Core/go-cqhttp)
Author: hmjBill
Latest version: 1.2.0
Deprecated: [Deprecated] 该包已过时，请迁移到 @hmjbill/bbot

<div align="center">

# openclaw-onebot

[OpenClaw](https://openclaw.ai)  的 **OneBot v11 协议**（QQ/Lagrange.Core、go-cqhttp 等）渠道插件

> 本仓库为长期分叉版本（LTS Fork），包含多账号路由与兼容性维护。版本规则见 `VERSIONING.md`。

简体中文 | [English](README.en.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | [Español](README.es.md)

[![npm version](https://img.shields.io/npm/v/@hmjbill/openclaw-onebot?style=flat-square)](https://www.npmjs.com/package/@hmjbill/openclaw-onebot)
[![GitHub stars](https://img.shields.io/github/stars/hmjBill/openclaw-onebot?style=flat-square)](https://github.com/hmjBill/openclaw-onebot)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE)
[![Node.js](https://img.shields.io/badge/node-%3E%3D22-brightgreen?style=flat-square)](https://nodejs.org)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.4-blue?style=flat-square)](https://www.typescriptlang.org/)
[![OpenClaw](https://img.shields.io/badge/OpenClaw-Plugin-9cf?style=flat-square)](https://openclaw.ai)

</div>

---

## 安装

### 方式 A（推荐，和上游一致的 npm 安装）

```bash
openclaw plugins install @hmjbill/openclaw-onebot
openclaw onebot setup
```

### 方式 B（本地源码安装，适合开发调试）

```bash
git clone https://github.com/hmjBill/openclaw-onebot.git
cd openclaw-onebot
npm install
npm run build
openclaw plugins install /绝对路径/openclaw-onebot
openclaw onebot setup
```

> 说明：方式 A 依赖 npm 上已发布 `@hmjbill/openclaw-onebot`；若还未发布，请先使用方式 B，或先执行 `npm publish --access public` 发布你的包。

## 一键更新（保留配置）

仓库内置了无损更新脚本：会自动备份 `~/.openclaw/openclaw.json`，清理旧插件目录并安装新版本。

更新到最新版本（`latest`）：

```bash
curl -fsSL https://raw.githubusercontent.com/hmjBill/openclaw-onebot/main/scripts/update-plugin.sh | bash
```

更新到指定版本（例如 `1.1.6`）：

```bash
curl -fsSL https://raw.githubusercontent.com/hmjBill/openclaw-onebot/main/scripts/update-plugin.sh | bash -s -- 1.1.6
```

Windows PowerShell（最新版本）：

```powershell
irm https://raw.githubusercontent.com/hmjBill/openclaw-onebot/main/scripts/update-plugin.ps1 | iex
```

Windows PowerShell（指定版本，例如 `1.1.7`）：

```powershell
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/hmjBill/openclaw-onebot/main/scripts/update-plugin.ps1))) -Version 1.1.7
```

## 卸载

Windows 上建议先停网关再卸载，避免运行中的进程占用插件文件导致删除失败：

```bash
openclaw gateway stop
openclaw onebot cleanup-config
openclaw plugins uninstall @hmjbill/openclaw-onebot
openclaw gateway start
```

如果你之前是“本地路径安装”，再执行一次：

```bash
openclaw plugins uninstall openclaw-onebot
```

若仍有残留，可检查 `~/.openclaw/openclaw.json` 的 `plugins.allow`、`plugins.entries`、`plugins.installs`，删除 `openclaw-onebot` 或 `@hmjbill/openclaw-onebot` 对应项后重启网关。

## 教程

- Fork 仓库（本项目）：<https://github.com/hmjBill/openclaw-onebot>
- 上游教程（思路可参考）：[让 QQ 接入 openclaw！让你的助手掌管千人大群](https://kirigaya.cn/blog/article?seq=368)




## 功能

- ✅ 私聊：所有消息 AI 都会回复
- ✅ 触发：支持 @触发 和基于关键字的触发
- ✅ 自动获取上下文
- ✅ 自定义新成员入群欢迎触发器
- ✅ 自动合并转发长消息：超过阈值可渲染为图片发送或者合并发送
- ✅ 支持文件，图像读取/发送
- ✅ 支持黑白名单系统
- ✅ 支持 OneBot 群管理动作（可按 agent + 动作细粒度授权）

## 安装 onebot 服务端

你需要安装 onebot 服务端，QQ 目前比较常用的是 onebot 服务端是 NapCat，可以查看 [官网](https://napneko.github.io/) 了解安装方法


### 连接类型

| 类型 | 说明 |
|------|------|
| `forward-websocket` | 插件主动连接 OneBot（go-cqhttp、Lagrange.Core 正向 WS/WSS） |
| `backward-websocket` | 插件作为服务端，OneBot 连接过来 |

> 💡 **提示**：`host` 请填写纯主机名/IP（例如 `127.0.0.1` 或 `napcat.local`），不要带 `ws://` 或 `wss://` 前缀。  
> 插件会根据端口自动选择协议：`443 -> wss`，其他端口默认 `ws`。
> 若配置了 `accessToken`，`backward-websocket` 连接将强制鉴权（支持 `Authorization: Bearer <token>` 或 URL 查询参数 `access_token`）。

### 环境变量

可替代配置文件，适用于 Lagrange 等：

| 变量 | 说明 |
|------|------|
| `ONEBOT_WS_TYPE` | forward-websocket / backward-websocket |
| `ONEBOT_WS_HOST` | 主机地址 |
| `ONEBOT_WS_PORT` | 端口 |
| `ONEBOT_WS_PATH` | WS 路径（默认 `/onebot/v11/ws`） |
| `ONEBOT_WS_ACCESS_TOKEN` | 访问令牌 |

### 多账号配置（推荐）

当你接入多个 OneBot 账号时，建议显式配置 `defaultAccount`，并为每个账号单独配置连接参数。

```json
{
  "channels": {
    "onebot": {
      "defaultAccount": "xiaob",
      "accounts": {
        "xiaob": {
          "type": "forward-websocket",
          "host": "127.0.0.1",
          "port": 3001,
          "accessToken": "abc123",
          "enabled": true
        },
        "xiaoxiaob": {
          "type": "forward-websocket",
          "host": "127.0.0.1",
          "port": 3011,
          "accessToken": "abc123",
          "enabled": true
        }
      }
    }
  }
}
```

> 建议在多账号场景下始终设置 `defaultAccount`，避免在未显式指定账号的场景（如部分 CLI/回退路径）触发默认路由告警。

代理绑定推荐两种方式（二选一）：

1. 使用全局 `bindings`（推荐，与 OpenClaw 路由体系一致）  
2. 在 `accounts.<id>.agentId` 上直接指定代理（插件内优先匹配）

`bindings` 示例：

```json
{
  "bindings": [
    {
      "agentId": "minecraft",
      "match": { "channel": "onebot", "accountId": "xiaob" }
    },
    {
      "agentId": "xiaoxiaob",
      "match": { "channel": "onebot", "accountId": "xiaoxiaob" }
    }
  ]
}
```

## 使用

1. 安装并配置
2. 运行 `openclaw onebot setup` 时，按提示填写 `accountId`；多账号建议分别执行 setup 并设置 `defaultAccount`
3. 可选：在 setup 中填写 `agentId` 直连代理；不填则按 `bindings` 自动路由
4. 重启 Gateway：`openclaw gateway restart`
5. 在 QQ 私聊或群聊中发消息（群聊需 @ 机器人，或配置关键字触发）

## 关键字触发回复

除了 @ 机器人外，还可以配置关键字检测，当群消息中包含指定关键字时自动触发回复（无需 @）。

```json
{
  "channels": {
    "onebot": {
      "requireMention": false,
      "triggerKeywords": ["AI", "助手", "帮我问"],
      "triggerMode": "contains"
    }
  }
}
```

| 配置项 | 说明 |
|--------|------|
| `requireMention` | 设为 `false` 时允许不 @ 触发 |
| `triggerKeywords` | 关键字列表，命中任一关键字即触发 |
| `triggerMode` | 匹配模式：`prefix`（前缀）/ `contains`（包含） |

## 长消息处理与 OG 图片渲染

当单次回复超过**长消息阈值**（默认 300 字）时，可选用三种模式（`openclaw onebot setup` 中配置）：

| 模式 | 说明 |
|------|------|
| `normal` | 准流式分段发送：边生成边聚合，按时间窗口或长度阈值增量发送 |
| `og_image` | 将 Markdown 转为 HTML 再生成图片发送（需可用的 `puppeteer-core` + 系统 Chromium/Chrome） |
| `forward` | 合并转发（发给自己后打包转发） |

`normal` 模式默认会开启块流式接收，并在插件侧做短时间聚合，默认规则：

- `normalModeFlushIntervalMs`: `1200`
- `normalModeFlushChars`: `160`

也就是回复不会逐 token 刷屏，而是大约每 1.2 秒或累计到 160 字左右就发送一段。可在 `openclaw.json` 中手动调整：

```json
{
  "channels": {
    "onebot": {
      "longMessageMode": "normal",
      "normalModeFlushIntervalMs": 1200,
      "normalModeFlushChars": 160
    }
  }
}
```

选择 **生成图片发送（og_image）** 时，会额外询问**渲染主题**：

| 选项 | 说明 |
|------|------|
| **default** | 无额外样式，默认白底黑字 |
| **dust** | 内置主题：暖色、旧纸质感 |
| **custom** | 自定义：在 `ogImageRenderThemePath` 中填写 CSS 文件绝对路径 |

配置项（枚举 + 可选路径）：

- `ogImageRenderTheme`：`"default"` | `"dust"` | `"custom"`
- `ogImageRenderThemePath`：当为 `custom` 时必填，CSS 文件绝对路径

示例（`openclaw.json`）：

```json
{
  "channels": {
    "onebot": {
      "longMessageMode": "og_image",
      "longMessageThreshold": 300,
      "ogImageRenderTheme": "dust"
    }
  }
}
```

自定义主题示例：

```json
{
  "channels": {
    "onebot": {
      "longMessageMode": "og_image",
      "ogImageRenderTheme": "custom",
      "ogImageRenderThemePath": "C:/path/to/your-theme.css"
    }
  }
}
```

## 主动发送消息

通过 `openclaw message send` CLI（无需 Agent 工具）：

```bash
# 发送文本
openclaw message send --channel onebot --target user:123456789 --message "你好"

# 发送图片
openclaw message send --channel onebot --target group:987654321 --media "file:///path/to/image.png"
```

`--target` 格式：`user:QQ号` 或 `group:群号`。回复场景由 deliver 自动投递，Agent 输出 text/mediaUrl 即会送达。

## 新成员入群欢迎（自定义图片）

当有新成员加入群时，可根据其 ID 信息生成欢迎图片并发送。详见 [receive.md](skills/onebot-ops/receive.md#新成员入群欢迎)。

1. 在 `openclaw.json` 中配置：

```json
{
  "channels": {
    "onebot": {
      "groupIncrease": {
        "enabled": true,
        "message": "欢迎 {name} 加入 {groupName}（{groupId}）"
      }
    }
  }
}
```

2. 当前版本为兼容 OpenClaw 新安全策略，`groupIncrease.command/cwd` 已禁用，请使用 `message` 模板欢迎语。

3. 测试：`npm run test:group-increase-handler`

## 回复白名单

默认为空回复所有人的消息。如果设置的话，那么机器人就只会回复设置的数组里的用户的消息。
支持两级配置：

- 全局：`channels.onebot.whitelistUserIds`
- 账号级：`channels.onebot.accounts.<accountId>.whitelistUserIds`（优先级更高）

```json
{
  "channels": {
    "onebot": {
      "whitelistUserIds": [1193466151]
    }
  }
}
```

按账号单独配置示例：

```json
{
  "channels": {
    "onebot": {
      "accounts": {
        "xiaob": {
          "whitelistUserIds": [1193466151]
        },
        "xiaoxiaob": {
          "whitelistUserIds": [2233445566]
        }
      }
    }
  }
}
```

## 黑名单

在群里有时候有些人需要被屏蔽，不管他怎么 @ 还是怎么，都屏蔽他的消息不触发。
同样支持两级配置：

- 全局：`channels.onebot.blacklistUserIds`
- 账号级：`channels.onebot.accounts.<accountId>.blacklistUserIds`（优先级更高）

```json
{
  "channels": {
    "onebot": {
      "blacklistUserIds": [123456789]
    }
  }
}
```

**注意**：

- 白名单优先级高于黑名单。如果同时设置了白名单和黑名单，只有白名单内的用户才能触发，且黑名单内的白名单用户也会被屏蔽。
- 账号级名单优先级高于全局名单；账号级未配置时回退到全局配置。

## 群聊拟人化定时汇总回复

可以让机器人以“间隔查看群聊”的方式工作：按随机时间区间读取最近窗口消息，生成总结性回复后发送到群里。

全局配置路径：

- `channels.onebot.humanizeDigest`

账号级覆盖路径（优先级更高）：

- `channels.onebot.accounts.<accountId>.humanizeDigest`

示例：

```json
{
  "channels": {
    "onebot": {
      "humanizeDigest": {
        "enabled": true,
        "replyMode": "llm",
        "intervalSecMin": 180,
        "intervalSecMax": 420,
        "windowMinutes": 6,
        "minNewMessages": 6,
        "cooldownSec": 120,
        "targetGroups": [1046693162],
        "maxMessages": 120,
        "maxSummaryMessages": 12,
        "maxReplyChars": 220,
        "llmMaxReplyChars": 140,
        "replyProbability": 0.35,
        "questionBoost": 0.3,
        "mentionBoost": 0.25,
        "atUserProbability": 0.25,
        "quoteReplyProbability": 0.2,
        "imageChimeEnabled": true,
        "imageChimeProbability": 0.28,
        "imageChimeMaxImages": 3,
        "imageChimeMaxContextMessages": 12,
        "imageChimePrompt": "你看到了群里的图片，请像真人群友一样接一句梗。只输出一句中文，不超过80字；若不适合回复，输出 NO_REPLY。",
        "maxFocusChars": 50,
        "botNicknames": ["小B", "xiaob"],
        "selectiveReplyTemplate": "{at}我先接一句：{focus}。这条我先跟一下，你们继续补充。",
        "replyTemplate": "我刚看了一下最近{windowMinutes}分钟群里的讨论（{messageCount}条）：\n{summary}\n如果要我展开某个点，直接@我。"
      },
      "mentionImageAnalyze": {
        "enabled": true,
        "windowMessages": 3,
        "maxImageUrlsPerMessage": 3
      },
      "accounts": {
        "xiaob": {
          "humanizeDigest": {
            "enabled": true,
            "targetGroups": [123456789]
          },
          "mentionImageAnalyze": {
            "enabled": true,
            "windowMessages": 5
          }
        }
      }
    }
  }
}
```

字段说明：

- `intervalSecMin` / `intervalSecMax`：随机轮询区间（秒）
- `windowMinutes`：每次汇总查看的时间窗（分钟）
- `minNewMessages`：新消息少于该值时仅“已读”不回复
- `cooldownSec`：同一群自动回复冷却时间（秒）
- `targetGroups`：启用自动汇总回复的群号列表（必填）
- `replyMode`：`llm`（模型决策拟人化）、`selective`（规则拟人化）或 `summary`（传统汇总）
- `replyProbability`：`selective` 模式的基础回复概率（0-1）
- `questionBoost` / `mentionBoost`：命中问句、被点名时的概率增益
- `atUserProbability`：回复时概率 @ 焦点用户
- `quoteReplyProbability`：回复时概率使用“引用消息”发送（0-1，且与 @ 严格互斥）
- `maxFocusChars`：拟人化模式引用焦点消息的最大长度
- `botNicknames`：识别“在叫机器人”的昵称关键词
- `selectiveReplyTemplate`：拟人化模板，支持 `{at}`、`{focus}`、`{speaker}`、`{messageCount}`、`{windowMinutes}`
- `llmMaxReplyChars`：`llm` 模式下单条回复最大字符数
- `suppressAfterInteractionSec`：群里刚有互动（含正常@触发回复）后的抑制秒数，防止 digest 二次回复
- `replyTemplate`：`summary` 模式模板，支持 `{summary}`、`{messageCount}`、`{windowMinutes}`
- `imageChimeEnabled`：是否启用“看图接梗”（在 digest 周期内从最近图片中挑选并回复）
- `imageChimeProbability`：看图接梗触发概率（0-1）
- `imageChimeMaxImages`：单次看图接梗最多参考图片数
- `imageChimeMaxContextMessages`：看图接梗使用的最大上下文消息数
- `imageChimePrompt`：看图接梗提示词（输出 NO_REPLY 则跳过发送）

行为说明（当前版本）：

- `llm` 模式下，插件会对模型输出中的 `@123456` / `@昵称` 做归一化，尽量转成 OneBot 可识别的 `[CQ:at,qq=...]`
- `@` 与“引用回复”严格互斥：
  - 命中 `@` 时不会触发引用回复
  - 命中引用回复时会移除 `@` 段
- 引用目标使用“智能选择”策略：优先问题句、被后续接话的句子、且更近期的消息，减少引用偏题
- 已融合“看图接梗”链路：digest 可从最近群图片中择优触发拟人化短句回复

## 被 @ 后 N 条消息图片分析窗口

用于“先 @ 一次，后续几条图消息自动分析”的场景。

全局配置路径：

- `channels.onebot.mentionImageAnalyze`

账号级覆盖路径（优先）：

- `channels.onebot.accounts.<accountId>.mentionImageAnalyze`

示例：

```json
{
  "channels": {
    "onebot": {
      "mentionImageAnalyze": {
        "enabled": true,
        "windowMessages": 3,
        "maxImageUrlsPerMessage": 3
      }
    }
  }
}
```

字段说明：

- `enabled`：是否启用窗口分析
- `windowMessages`：被 @ 后，后续生效的消息条数 N
- `maxImageUrlsPerMessage`：单条消息最多附带给模型的图片 URL 数量

## humanizeDigest 热更新与配置校验

`channels.onebot` 下 `humanizeDigest` 相关配置支持热更新（无需重启网关）：

- 检测配置变化后会自动重载 digest 定时器
- 日志会输出：`[onebot] humanizeDigest reloaded by config change`

同时会做运行期配置校验并输出 warning（不阻断运行），例如：

- `intervalSecMin > intervalSecMax`
- `targetGroups` 为空
- `minNewMessages > maxMessages`
- 概率参数异常（过低/过高）
- `llmMaxReplyChars > maxReplyChars`

## 表情包目录索引与概率发送

支持从本地目录索引 GIF/大图表情包，并在回复后按概率追加发送（普通回复与 `humanizeDigest` 可分别控制）。

全局配置路径：

- `channels.onebot.stickerPack`

账号级覆盖路径（优先）：

- `channels.onebot.accounts.<accountId>.stickerPack`

示例：

```json
{
  "channels": {
    "onebot": {
      "stickerPack": {
        "enabled": true,
        "directories": [
          "/data/stickers/common",
          "/data/stickers/xiaob"
        ],
        "includeHumanizeDigest": false,
        "replyProbability": 0.18,
        "digestReplyProbability": 0.06,
        "maxCandidates": 6,
        "maxFileMB": 8
      },
      "accounts": {
        "xiaob": {
          "stickerPack": {
            "enabled": true,
            "directories": ["/data/stickers/xiaob-only"],
            "includeHumanizeDigest": true,
            "replyProbability": 0.22
          }
        }
      }
    }
  }
}
```

字段说明：

- `directories`：表情包目录列表（递归索引，支持 `gif/png/jpg/jpeg/webp`）
- `replyProbability`：普通会话回复后发送表情包概率（0-1）
- `includeHumanizeDigest`：是否参与 `humanizeDigest` 场景
- `digestReplyProbability`：`humanizeDigest` 场景概率（0-1）
- `maxCandidates`：按语义匹配后的候选上限（会在候选内随机）
- `maxFileMB`：单文件大小上限（超过会跳过）

## 消息表情回应（emoji like）概率发送

支持在回复后按概率调用 `set_msg_emoji_like` 对目标消息添加 QQ 表情回应（如赞、爱心等）。

全局配置路径：

- `channels.onebot.emojiLike`

账号级覆盖路径（优先）：

- `channels.onebot.accounts.<accountId>.emojiLike`

示例：

```json
{
  "channels": {
    "onebot": {
      "emojiLike": {
        "enabled": true,
        "includeHumanizeDigest": true,
        "replyProbability": 0.2,
        "digestReplyProbability": 0.12,
        "emojiIds": [1, 60, 66]
      }
    }
  }
}
```

字段说明：

- `emojiIds`：可用的 `emoji_id` 列表，命中概率后随机选一个
- `replyProbability`：普通回复场景概率（0-1）
- `includeHumanizeDigest`：是否在 `humanizeDigest` 场景启用
- `digestReplyProbability`：`humanizeDigest` 场景概率（0-1）

行为约束：

- 与 `stickerPack` 严格互斥：同一轮发送中若已发送大表情，则不会再发送 `emojiLike`
- 必须具备管理权限动作 `set_msg_emoji_like`（按 `managementPermissions` ACL 校验）
- 即使 `emojiLike.enabled=true`，若当前 agent 在 ACL 中未授权，功能也不会执行

## OneBot 管理 API（含 ACL 细粒度授权）

当前已封装并可供 Agent 调用的管理工具：

- `onebot_upload_file`（会按目标自动映射到 `upload_group_file` 或 `upload_private_file` 权限动作）
- `onebot_delete_msg`
- `onebot_set_msg_emoji_like`
- `onebot_set_group_ban`
- `onebot_set_group_whole_ban`
- `onebot_set_group_kick`
- `onebot_set_group_admin`
- `onebot_set_group_card`
- `onebot_set_group_name`
- `onebot_set_group_special_title`
- `onebot_set_group_leave`
- `onebot_set_group_add_request`
- `onebot_set_friend_add_request`

### 管理权限配置（按 agent + 动作）

配置路径：`channels.onebot.managementPermissions`

账号级覆盖路径（优先于全局）：`channels.onebot.accounts.<accountId>.managementPermissions`

```json
{
  "channels": {
    "onebot": {
      "managementPermissions": {
        "defaultPolicy": "deny",
        "allowAgents": ["sharkagent"],
        "denyAgents": ["xiaob"],
        "actions": {
          "set_group_ban": { "allowAgents": ["sharkagent"] },
          "set_group_kick": { "allowAgents": ["sharkagent"] },
          "upload_group_file": { "allowAgents": ["sharkagent", "xiaob-memory"] },
          "upload_private_file": { "denyAgents": ["xiaob"] },
          "set_group_card": { "allowAgents": ["xiaob-memory"] },
          "set_group_name": { "denyAgents": ["xiaob"] }
        }
      }
    }
  }
}
```

优先级：

- `actions.<action>.denyAgents`
- `actions.<action>.allowAgents`
- `denyAgents`
- `allowAgents`
- `defaultPolicy`

说明：

- 默认建议 `defaultPolicy: "deny"`（未授权即拒绝）
- 调用方无法识别 `agentId` 时，管理动作会被拒绝（安全优先）
- 管理工具支持可选 `account_id` 参数（多账号场景），用于按账号选择连接与权限策略

## 新人入群触发器

如果有人入群之后，可以通过这个来实现触发器。

```json
{
  "channels": {
    "onebot": {
      "groupIncrease": {
        "enabled": true,
        "message": "欢迎 {name} 入群"
      }
    }
  }
}
```

## 测试

### 测试连接

项目内提供测试脚本（需 `.env` 或环境变量）：

```bash
cd openclaw-onebot
npm run test:connect
```

### 测试 OG 图片渲染效果

用于预览「Markdown 转图片」在不同主题下的渲染效果（需可用的系统 Chromium/Chrome）：

```bash
cd openclaw-onebot
# 无额外样式
npm run test:render-og-image -- default
# 内置 dust 主题
npm run test:render-og-image -- dust
# 自定义 CSS 文件（绝对路径）
npm run test:render-og-image -- "C:/path/to/your-theme.css"
```

生成图片保存在 `test/output-render-<主题>.png`，可直接打开查看。

## 参考

- [OneBot 11](https://github.com/botuniverse/onebot-11)
- [go-cqhttp](https://docs.go-cqhttp.org/)
- [Lagrange.Core](https://github.com/LSTM-Kirigaya/Lagrange.Core)
- [NapCat](https://github.com/NapNeko/NapCatQQ)

## 维护者

- Upstream Author: [LSTM-Kirigaya](https://github.com/LSTM-Kirigaya)
- Fork Maintainer: [hmjBill](https://github.com/hmjBill)

## 联系

- Fork 问题反馈：<https://github.com/hmjBill/openclaw-onebot/issues>
- Upstream 作者邮箱：zhelonghuang@qq.com
- Upstream QQ 群：782833642

## License

MIT © [LSTM-Kirigaya](https://github.com/LSTM-Kirigaya) and [hmjBill](https://github.com/hmjBill)