diff --git a/.gitignore b/.gitignore index 77ab1cc..ec4c548 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ package-lock.json .idea/ .codebuddy/ .codebuddy.zip -openclaw.json \ No newline at end of file +openclaw.json +*.tgz +*.log diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e9490b..bcfcd3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/). ## [1.5.5] - 2026-03-09 +### Added + +- Add `npm-upgrade.sh` script for npm-based plugin installation and upgrade. + - Supports `--tag` and `--version` options, defaults to `@alpha`. + - Handles channel config backup/restore, old plugin cleanup (including legacy variants like `qqbot`, `@sliverp/qqbot`, `openclaw-qq`), and gateway restart. + - Temporarily removes `channels.qqbot` before install to avoid `unknown channel id` validation error. + ### Fixed - Fix plugin id not matching package name, causing plugin load failure. diff --git a/CHANGELOG.zh.md b/CHANGELOG.zh.md index 0c14081..a5576b6 100644 --- a/CHANGELOG.zh.md +++ b/CHANGELOG.zh.md @@ -6,6 +6,13 @@ ## [1.5.5] - 2026-03-09 +### 新增 + +- 新增 `npm-upgrade.sh` 脚本,支持通过 npm 包安装和升级插件。 + - 支持 `--tag` 和 `--version` 选项,默认安装 `@alpha`。 + - 自动处理通道配置备份/恢复、旧插件清理(包括 `qqbot`、`@sliverp/qqbot`、`openclaw-qq` 等历史版本)、网关重启。 + - 安装前临时移除 `channels.qqbot` 配置,避免 `unknown channel id` 校验错误。 + ### 修复 - 修复插件 ID 与包名不一致导致插件加载失败的问题。 diff --git a/README.md b/README.md index 300c194..269ab84 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ AI sends videos via `path`. Supports local files and URLs. La 2. After scanning, tap **Agree** on your phone — you'll land on the bot configuration page. 3. Click **Create Bot** to create a new QQ bot. -Clipboard_Screenshot_1772980440 +Create Bot 4. Find **AppID** and **AppSecret** on the bot's page, click **Copy** for each, and save them somewhere safe (e.g., a notepad). **AppSecret is not stored in plaintext — if you leave the page without saving it, you'll have to regenerate a new one.** @@ -154,7 +154,13 @@ AI sends videos via `path`. Supports local files and URLs. La ### Step 2 — Install the Plugin -**Option A: One-Click Install & Run (Recommended)** +**Option A: Install via npm (Recommended)** + +```bash +openclaw plugins install @tencent-connect/openclaw-qqbot +``` + +**Option B: One-Click Install & Run** ```bash git clone https://github.com/tencent-connect/openclaw-qqbot.git && cd openclaw-qqbot @@ -163,7 +169,7 @@ bash ./scripts/upgrade-and-run.sh --appid YOUR_APPID --secret YOUR_SECRET The script handles everything: cleanup old plugins → install deps → register plugin → configure channel → start service. Once done, skip to [Step 4](#step-4--start--test). -**Option B: Manual Step-by-Step** +**Option C: Manual Step-by-Step** ```bash git clone https://github.com/tencent-connect/openclaw-qqbot.git && cd openclaw-qqbot @@ -350,6 +356,24 @@ STT supports two-level configuration with priority fallback: ## 🔄 Upgrade +### Option 1: Upgrade via npm (Recommended) + +```bash +bash ./scripts/npm-upgrade.sh +``` + +The script automatically backs up channel config → uninstalls old plugins → installs new version → restores config → restarts gateway. + +```bash +# Specify tag +bash ./scripts/npm-upgrade.sh --tag alpha + +# Specify exact version +bash ./scripts/npm-upgrade.sh --version 1.0.0-alpha.0 +``` + +### Option 2: Upgrade via Source + Run the one-click script to upgrade and restart: ```bash @@ -379,6 +403,69 @@ Environment variables `QQBOT_APPID`, `QQBOT_SECRET`, `QQBOT_TOKEN` (AppID:Secret --- +## 🔀 Migrating from Legacy Plugins + +If you previously installed `qqbot`, `@sliverp/qqbot`, `@tencent-connect/qqbot`, or other related legacy plugins, you need to uninstall the old plugin before installing the new version. + +### Recommended: Use npm-upgrade Script (Automatic) + +```bash +bash ./scripts/npm-upgrade.sh +``` + +The script automatically uninstalls all legacy plugin variants (`qqbot`, `@sliverp/qqbot`, `openclaw-qq`, etc.), cleans up residual directories, and backs up/restores channel config. + +### Manual Migration + +**1. Back up your channel config** + +Save the `channels.qqbot` section from `~/.openclaw/openclaw.json` (including `appId`, `clientSecret`, `allowFrom`, etc.) — you'll need to restore it later. + +**2. Uninstall old plugins** + +Run the appropriate uninstall command(s) based on what you had installed: + +```bash +# Uninstall legacy plugin variants (pick the ones that apply) +openclaw plugins uninstall qqbot +openclaw plugins uninstall @sliverp/qqbot +openclaw plugins uninstall @tencent-connect/qqbot +openclaw plugins uninstall openclaw-qqbot +openclaw plugins uninstall openclaw-qq +``` + +If `plugins uninstall` doesn't fully clean up, manually remove residual directories: + +```bash +rm -rf ~/.openclaw/extensions/qqbot +rm -rf ~/.openclaw/extensions/openclaw-qqbot +rm -rf ~/.openclaw/extensions/openclaw-qq +``` + +**3. Temporarily remove channel config** + +> ⚠️ Important: `openclaw plugins install` validates the config file. If `channels.qqbot` exists but no plugin provides that channel, it will fail with `unknown channel id: qqbot`. + +Before installing, temporarily remove the `channels.qqbot` section from `~/.openclaw/openclaw.json`. + +**4. Install the new version** + +```bash +openclaw plugins install @tencent-connect/openclaw-qqbot +``` + +**5. Restore channel config** + +Write back the previously saved `channels.qqbot` config to `~/.openclaw/openclaw.json`. + +**6. Restart the gateway** + +```bash +openclaw gateway restart +``` + +--- + ## 📚 Documentation & Links - [Command Reference](docs/commands.md) — OpenClaw CLI commands diff --git a/README.zh.md b/README.zh.md index c1d1161..1389808 100644 --- a/README.zh.md +++ b/README.zh.md @@ -139,7 +139,7 @@ AI 通过 `路径` 发送视频,支持本地文件和公网 2. 手机 QQ 扫码后选择**同意**,即完成注册,进入 QQ 机器人配置页。 3. 点击**创建机器人**,即可直接新建一个 QQ 机器人。 -Clipboard_Screenshot_1772980440 +创建机器人 4. 在机器人页面中找到 **AppID** 和 **AppSecret**,分别点击右侧**复制**按钮,保存到记事本或备忘录中。**AppSecret 不支持明文保存,离开页面后再查看会强制重置,请务必妥善保存。** @@ -151,7 +151,13 @@ AI 通过 `路径` 发送视频,支持本地文件和公网 ### 第二步 — 安装插件 -**方式一:一键安装并启动(推荐)** +**方式一:通过 npm 安装(推荐)** + +```bash +openclaw plugins install @tencent-connect/openclaw-qqbot +``` + +**方式二:一键安装并启动** ```bash git clone https://github.com/tencent-connect/openclaw-qqbot.git && cd openclaw-qqbot @@ -160,7 +166,7 @@ bash ./scripts/upgrade-and-run.sh --appid YOUR_APPID --secret YOUR_SECRET 脚本会自动完成:清理旧插件 → 安装依赖 → 注册插件 → 配置通道 → 启动服务。完成后可直接跳到[第四步](#第四步--启动并测试)。 -**方式二:手动分步安装** +**方式三:手动分步安装** ```bash git clone https://github.com/tencent-connect/openclaw-qqbot.git && cd openclaw-qqbot @@ -347,6 +353,24 @@ STT 支持两级配置,按优先级查找: ## 🔄 升级 +### 方式一:通过 npm 升级(推荐) + +```bash +bash ./scripts/npm-upgrade.sh +``` + +脚本会自动备份通道配置 → 卸载旧插件 → 安装新版本 → 恢复配置 → 重启网关。 + +```bash +# 指定 tag +bash ./scripts/npm-upgrade.sh --tag alpha + +# 指定版本号 +bash ./scripts/npm-upgrade.sh --version 1.0.0-alpha.0 +``` + +### 方式二:通过源码升级 + 运行一键脚本即可升级并重启: ```bash @@ -376,6 +400,69 @@ bash ./scripts/upgrade-and-run.sh --appid YOUR_APPID --secret YOUR_SECRET --- +## 🔀 从旧版插件迁移 + +如果你之前安装的是 `qqbot`、`@sliverp/qqbot`、`@tencent-connect/qqbot` 等关联插件,需要先卸载旧插件再安装新版本。 + +### 推荐:使用 npm-upgrade 脚本(自动处理) + +```bash +bash ./scripts/npm-upgrade.sh +``` + +脚本会自动卸载所有历史版本的插件(`qqbot`、`@sliverp/qqbot`、`openclaw-qq` 等)、清理残留目录、备份恢复通道配置。 + +### 手动迁移 + +**1. 备份你的通道配置** + +先记录 `~/.openclaw/openclaw.json` 中 `channels.qqbot` 的内容(`appId`、`clientSecret`、`allowFrom` 等),后续需要恢复。 + +**2. 卸载旧插件** + +根据你之前安装的插件名,执行对应的卸载命令: + +```bash +# 卸载可能存在的旧版插件(按实际情况选择) +openclaw plugins uninstall qqbot +openclaw plugins uninstall @sliverp/qqbot +openclaw plugins uninstall @tencent-connect/qqbot +openclaw plugins uninstall openclaw-qqbot +openclaw plugins uninstall openclaw-qq +``` + +如果 `plugins uninstall` 未能完全清理,手动删除残留目录: + +```bash +rm -rf ~/.openclaw/extensions/qqbot +rm -rf ~/.openclaw/extensions/openclaw-qqbot +rm -rf ~/.openclaw/extensions/openclaw-qq +``` + +**3. 临时移除通道配置** + +> ⚠️ 重要:`openclaw plugins install` 会校验配置文件。如果配置中存在 `channels.qqbot` 但对应插件尚未安装,会报 `unknown channel id: qqbot` 错误并拒绝安装。 + +安装前需要临时从 `~/.openclaw/openclaw.json` 中移除 `channels.qqbot` 配置段。 + +**4. 安装新版本** + +```bash +openclaw plugins install @tencent-connect/openclaw-qqbot +``` + +**5. 恢复通道配置** + +将之前备份的 `channels.qqbot` 配置写回 `~/.openclaw/openclaw.json`。 + +**6. 重启网关** + +```bash +openclaw gateway restart +``` + +--- + ## 📚 文档与链接 - [命令参考](docs/commands.md) — OpenClaw CLI 常用命令 diff --git a/docs/images/create_robot.png b/docs/images/create_robot.png new file mode 100644 index 0000000..f9c0e51 Binary files /dev/null and b/docs/images/create_robot.png differ diff --git a/scripts/npm-upgrade.sh b/scripts/npm-upgrade.sh new file mode 100755 index 0000000..2b3f2e9 --- /dev/null +++ b/scripts/npm-upgrade.sh @@ -0,0 +1,120 @@ +#!/bin/bash + +# QQBot 通过 npm 包升级 +# +# 用法: +# npm-upgrade.sh # 升级到 latest(默认) +# npm-upgrade.sh --tag alpha # 升级到 alpha +# npm-upgrade.sh --version 1.0.0-alpha.0 # 升级到指定版本 + +set -eo pipefail + +PKG_NAME="@tencent-connect/openclaw-qqbot" +INSTALL_SRC="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --tag) INSTALL_SRC="${PKG_NAME}@$2"; shift 2 ;; + --version) INSTALL_SRC="${PKG_NAME}@$2"; shift 2 ;; + -h|--help) + echo "用法:" + echo " npm-upgrade.sh # 升级到 latest(默认)" + echo " npm-upgrade.sh --tag alpha # 升级到 alpha" + echo " npm-upgrade.sh --version 1.0.0-alpha.0 # 升级到指定版本" + exit 0 + ;; + *) echo "未知选项: $1"; exit 1 ;; + esac +done +INSTALL_SRC="${INSTALL_SRC:-${PKG_NAME}@latest}" + +# 检测 CLI +CMD="" +for name in openclaw clawdbot moltbot; do + command -v "$name" &>/dev/null && CMD="$name" && break +done +[ -z "$CMD" ] && echo "❌ 未找到 openclaw / clawdbot / moltbot" && exit 1 + +APP_CONFIG="$HOME/.$CMD/$CMD.json" +EXTENSIONS_DIR="$HOME/.$CMD/extensions" + +echo "===========================================" +echo " QQBot npm 升级: $INSTALL_SRC" +echo "===========================================" +echo "" + +# [1/4] 备份并临时移除通道配置(避免 plugins install 因 unknown channel 拒绝执行) +echo "[1/4] 备份通道配置..." +if [ -f "$APP_CONFIG" ]; then + node -e " + const fs = require('fs'); + const cfg = JSON.parse(fs.readFileSync('$APP_CONFIG', 'utf8')); + const keys = ['qqbot', 'openclaw-qqbot', 'openclaw-qq']; + let saved = null; + for (const key of keys) { + const ch = cfg.channels && cfg.channels[key]; + if (ch) { saved = ch; delete cfg.channels[key]; break; } + } + // 清理 plugins.entries 中的旧记录(避免 stale config entry 告警) + if (cfg.plugins && cfg.plugins.entries) { + delete cfg.plugins.entries['openclaw-qqbot']; + } + if (saved) { + fs.writeFileSync('$APP_CONFIG.qqbot-backup.json', JSON.stringify(saved, null, 2)); + fs.writeFileSync('$APP_CONFIG', JSON.stringify(cfg, null, 4) + '\n'); + console.log(' ✅ 已备份并临时移除 channels.qqbot'); + } else { + console.log(' ℹ️ 无已有通道配置'); + } + " 2>/dev/null || echo " ⚠️ 备份失败" +else + echo " ℹ️ 无配置文件" +fi + +# [2/4] 清理旧插件目录 +echo "" +echo "[2/4] 清理旧插件..." +for old_plugin in openclaw-qqbot qqbot openclaw-qq @sliverp/qqbot @tencent-connect/qqbot @tencent-connect/openclaw-qq @tencent-connect/openclaw-qqbot; do + $CMD plugins uninstall "$old_plugin" 2>/dev/null && echo " 已卸载: $old_plugin" || true +done +for dir_name in openclaw-qqbot qqbot openclaw-qq; do + if [ -d "$EXTENSIONS_DIR/$dir_name" ]; then + rm -rf "$EXTENSIONS_DIR/$dir_name" + echo " 已清理残留目录: $dir_name" + fi +done + +# [3/4] 安装新版本 +echo "" +echo "[3/4] 安装新版本..." +$CMD plugins install "$INSTALL_SRC" 2>&1 + +# 恢复通道配置 +BACKUP_FILE="$APP_CONFIG.qqbot-backup.json" +if [ -f "$BACKUP_FILE" ] && [ -f "$APP_CONFIG" ]; then + node -e " + const fs = require('fs'); + const cfg = JSON.parse(fs.readFileSync('$APP_CONFIG', 'utf8')); + const saved = JSON.parse(fs.readFileSync('$BACKUP_FILE', 'utf8')); + cfg.channels = cfg.channels || {}; + cfg.channels.qqbot = saved; + fs.writeFileSync('$APP_CONFIG', JSON.stringify(cfg, null, 4) + '\n'); + fs.unlinkSync('$BACKUP_FILE'); + console.log(' ✅ 通道配置已恢复'); + " 2>/dev/null || echo " ⚠️ 通道配置恢复失败,请手动检查: $APP_CONFIG" +fi + +# [4/4] 重启网关 +echo "" +echo "[4/4] 重启网关..." +$CMD gateway restart 2>&1 || true + +echo "" +echo "===========================================" +echo " ✅ 升级完成" +echo "===========================================" +echo "" +echo "常用命令:" +echo " $CMD logs --follow # 跟踪日志" +echo " $CMD gateway restart # 重启服务" +echo " $CMD plugins list # 查看插件列表"