@tencent-connect/openclaw-qqbot 1.5.6 → 1.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -146
- package/README.zh.md +46 -146
- package/bin/qqbot-cli.js +6 -6
- package/dist/AI/345/210/233/346/226/260/345/272/224/347/224/250/345/245/226_/347/224/263/346/212/245/344/271/246.md +211 -0
- package/dist/src/gateway.js +109 -92
- package/dist/src/slash-commands.d.ts +48 -0
- package/dist/src/slash-commands.js +212 -0
- package/dist/src/utils/audio-convert.d.ts +0 -6
- package/dist/src/utils/audio-convert.js +0 -89
- package/package.json +1 -1
- package/scripts/{upgrade.sh → cleanup-legacy-plugins.sh} +3 -3
- package/scripts/set-markdown.sh +20 -20
- package/scripts/upgrade-via-npm.sh +204 -0
- package/scripts/{upgrade-and-run.sh → upgrade-via-source.sh} +60 -44
- package/src/api.ts +104 -24
- package/src/channel.ts +2 -1
- package/src/gateway.ts +229 -33
- package/src/image-server.ts +5 -2
- package/src/outbound.ts +32 -26
- package/src/ref-index-store.ts +358 -0
- package/src/types.ts +6 -0
- package/src/utils/platform.ts +16 -2
- package/scripts/draw_arch.py +0 -174
- package/scripts/npm-upgrade.sh +0 -120
- package/scripts/pull-latest.sh +0 -316
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# qqbot 通过 npm 包升级
|
|
4
|
+
#
|
|
5
|
+
# 用法:
|
|
6
|
+
# upgrade-via-npm.sh # 升级到 latest(默认)
|
|
7
|
+
# upgrade-via-npm.sh --version <version> # 升级到指定版本
|
|
8
|
+
# upgrade-via-npm.sh --self-version # 升级到当前仓库 package.json 版本
|
|
9
|
+
|
|
10
|
+
set -eo pipefail
|
|
11
|
+
|
|
12
|
+
PKG_NAME="@tencent-connect/openclaw-qqbot"
|
|
13
|
+
INSTALL_SRC=""
|
|
14
|
+
APPID=""
|
|
15
|
+
SECRET=""
|
|
16
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
17
|
+
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
18
|
+
|
|
19
|
+
LOCAL_VERSION="$(node -e "
|
|
20
|
+
try {
|
|
21
|
+
const fs = require('fs');
|
|
22
|
+
const path = require('path');
|
|
23
|
+
const p = path.join('$PROJECT_DIR', 'package.json');
|
|
24
|
+
const v = JSON.parse(fs.readFileSync(p, 'utf8')).version;
|
|
25
|
+
if (v) process.stdout.write(String(v));
|
|
26
|
+
} catch {}
|
|
27
|
+
" 2>/dev/null || true)"
|
|
28
|
+
|
|
29
|
+
print_usage() {
|
|
30
|
+
echo "用法:"
|
|
31
|
+
echo " upgrade-via-npm.sh # 升级到 latest(默认)"
|
|
32
|
+
echo " upgrade-via-npm.sh --version <版本号> # 升级到指定版本"
|
|
33
|
+
echo " upgrade-via-npm.sh --appid <appid> --secret <secret> # 配置通道并启动"
|
|
34
|
+
if [ -n "$LOCAL_VERSION" ]; then
|
|
35
|
+
echo " upgrade-via-npm.sh --self-version # 升级到当前仓库版本($LOCAL_VERSION)"
|
|
36
|
+
else
|
|
37
|
+
echo " upgrade-via-npm.sh --self-version # 升级到当前仓库版本"
|
|
38
|
+
fi
|
|
39
|
+
echo ""
|
|
40
|
+
echo "也可以通过环境变量设置:"
|
|
41
|
+
echo " QQBOT_APPID QQ机器人 appid"
|
|
42
|
+
echo " QQBOT_SECRET QQ机器人 secret"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
while [[ $# -gt 0 ]]; do
|
|
46
|
+
case "$1" in
|
|
47
|
+
--tag)
|
|
48
|
+
[ -z "$2" ] && echo "❌ --tag 需要参数" && exit 1
|
|
49
|
+
INSTALL_SRC="${PKG_NAME}@$2"
|
|
50
|
+
shift 2
|
|
51
|
+
;;
|
|
52
|
+
--version)
|
|
53
|
+
[ -z "$2" ] && echo "❌ --version 需要参数" && exit 1
|
|
54
|
+
INSTALL_SRC="${PKG_NAME}@$2"
|
|
55
|
+
shift 2
|
|
56
|
+
;;
|
|
57
|
+
--self-version)
|
|
58
|
+
[ -z "$LOCAL_VERSION" ] && echo "❌ 无法从 package.json 读取版本" && exit 1
|
|
59
|
+
INSTALL_SRC="${PKG_NAME}@${LOCAL_VERSION}"
|
|
60
|
+
shift 1
|
|
61
|
+
;;
|
|
62
|
+
--appid)
|
|
63
|
+
[ -z "$2" ] && echo "❌ --appid 需要参数" && exit 1
|
|
64
|
+
APPID="$2"
|
|
65
|
+
shift 2
|
|
66
|
+
;;
|
|
67
|
+
--secret)
|
|
68
|
+
[ -z "$2" ] && echo "❌ --secret 需要参数" && exit 1
|
|
69
|
+
SECRET="$2"
|
|
70
|
+
shift 2
|
|
71
|
+
;;
|
|
72
|
+
-h|--help)
|
|
73
|
+
print_usage
|
|
74
|
+
exit 0
|
|
75
|
+
;;
|
|
76
|
+
*) echo "未知选项: $1"; print_usage; exit 1 ;;
|
|
77
|
+
esac
|
|
78
|
+
done
|
|
79
|
+
INSTALL_SRC="${INSTALL_SRC:-${PKG_NAME}@latest}"
|
|
80
|
+
|
|
81
|
+
# 使用命令行参数或环境变量
|
|
82
|
+
APPID="${APPID:-$QQBOT_APPID}"
|
|
83
|
+
SECRET="${SECRET:-$QQBOT_SECRET}"
|
|
84
|
+
|
|
85
|
+
# 检测 CLI
|
|
86
|
+
CMD=""
|
|
87
|
+
for name in openclaw clawdbot moltbot; do
|
|
88
|
+
command -v "$name" &>/dev/null && CMD="$name" && break
|
|
89
|
+
done
|
|
90
|
+
[ -z "$CMD" ] && echo "❌ 未找到 openclaw / clawdbot / moltbot" && exit 1
|
|
91
|
+
|
|
92
|
+
APP_CONFIG="$HOME/.$CMD/$CMD.json"
|
|
93
|
+
EXTENSIONS_DIR="$HOME/.$CMD/extensions"
|
|
94
|
+
|
|
95
|
+
echo "==========================================="
|
|
96
|
+
echo " qqbot npm 升级: $INSTALL_SRC"
|
|
97
|
+
echo "==========================================="
|
|
98
|
+
echo ""
|
|
99
|
+
|
|
100
|
+
# [1/4] 备份并临时移除通道配置(避免 plugins install 因 unknown channel 拒绝执行)
|
|
101
|
+
echo "[1/4] 备份通道配置..."
|
|
102
|
+
if [ -f "$APP_CONFIG" ]; then
|
|
103
|
+
node -e "
|
|
104
|
+
const fs = require('fs');
|
|
105
|
+
const cfg = JSON.parse(fs.readFileSync('$APP_CONFIG', 'utf8'));
|
|
106
|
+
const keys = ['qqbot', 'openclaw-qqbot', 'openclaw-qq'];
|
|
107
|
+
let saved = null;
|
|
108
|
+
for (const key of keys) {
|
|
109
|
+
const ch = cfg.channels && cfg.channels[key];
|
|
110
|
+
if (ch) { saved = ch; delete cfg.channels[key]; break; }
|
|
111
|
+
}
|
|
112
|
+
// 清理 plugins.entries 中的旧记录(避免 stale config entry 告警)
|
|
113
|
+
if (cfg.plugins && cfg.plugins.entries) {
|
|
114
|
+
delete cfg.plugins.entries['openclaw-qqbot'];
|
|
115
|
+
}
|
|
116
|
+
if (saved) {
|
|
117
|
+
fs.writeFileSync('$APP_CONFIG.qqbot-backup.json', JSON.stringify(saved, null, 2));
|
|
118
|
+
fs.writeFileSync('$APP_CONFIG', JSON.stringify(cfg, null, 4) + '\n');
|
|
119
|
+
console.log(' ✅ 已备份并临时移除 channels.qqbot');
|
|
120
|
+
} else {
|
|
121
|
+
console.log(' ℹ️ 无已有通道配置');
|
|
122
|
+
}
|
|
123
|
+
" 2>/dev/null || echo " ⚠️ 备份失败"
|
|
124
|
+
else
|
|
125
|
+
echo " ℹ️ 无配置文件"
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
# [2/4] 清理旧插件目录
|
|
129
|
+
echo ""
|
|
130
|
+
echo "[2/4] 清理旧插件..."
|
|
131
|
+
for old_plugin in openclaw-qqbot qqbot openclaw-qq @sliverp/qqbot @tencent-connect/qqbot @tencent-connect/openclaw-qq @tencent-connect/openclaw-qqbot; do
|
|
132
|
+
$CMD plugins uninstall "$old_plugin" 2>/dev/null && echo " 已卸载: $old_plugin" || true
|
|
133
|
+
done
|
|
134
|
+
for dir_name in openclaw-qqbot qqbot openclaw-qq; do
|
|
135
|
+
if [ -d "$EXTENSIONS_DIR/$dir_name" ]; then
|
|
136
|
+
rm -rf "$EXTENSIONS_DIR/$dir_name"
|
|
137
|
+
echo " 已清理残留目录: $dir_name"
|
|
138
|
+
fi
|
|
139
|
+
done
|
|
140
|
+
|
|
141
|
+
# [3/4] 安装新版本
|
|
142
|
+
echo ""
|
|
143
|
+
echo "[3/4] 安装新版本..."
|
|
144
|
+
$CMD plugins install "$INSTALL_SRC" 2>&1
|
|
145
|
+
|
|
146
|
+
# 恢复通道配置
|
|
147
|
+
BACKUP_FILE="$APP_CONFIG.qqbot-backup.json"
|
|
148
|
+
if [ -f "$BACKUP_FILE" ] && [ -f "$APP_CONFIG" ]; then
|
|
149
|
+
node -e "
|
|
150
|
+
const fs = require('fs');
|
|
151
|
+
const cfg = JSON.parse(fs.readFileSync('$APP_CONFIG', 'utf8'));
|
|
152
|
+
const saved = JSON.parse(fs.readFileSync('$BACKUP_FILE', 'utf8'));
|
|
153
|
+
cfg.channels = cfg.channels || {};
|
|
154
|
+
cfg.channels.qqbot = saved;
|
|
155
|
+
fs.writeFileSync('$APP_CONFIG', JSON.stringify(cfg, null, 4) + '\n');
|
|
156
|
+
fs.unlinkSync('$BACKUP_FILE');
|
|
157
|
+
console.log(' ✅ 通道配置已恢复');
|
|
158
|
+
" 2>/dev/null || echo " ⚠️ 通道配置恢复失败,请手动检查: $APP_CONFIG"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# 配置通道(如果提供了 appid 和 secret)
|
|
162
|
+
if [ -n "$APPID" ] && [ -n "$SECRET" ]; then
|
|
163
|
+
echo ""
|
|
164
|
+
echo "配置机器人通道..."
|
|
165
|
+
DESIRED_TOKEN="${APPID}:${SECRET}"
|
|
166
|
+
|
|
167
|
+
# 读取当前配置中的 token
|
|
168
|
+
CURRENT_TOKEN=""
|
|
169
|
+
if [ -f "$APP_CONFIG" ]; then
|
|
170
|
+
CURRENT_TOKEN=$(node -e "
|
|
171
|
+
const cfg = JSON.parse(require('fs').readFileSync('$APP_CONFIG', 'utf8'));
|
|
172
|
+
const keys = ['qqbot', 'openclaw-qqbot', 'openclaw-qq'];
|
|
173
|
+
for (const key of keys) {
|
|
174
|
+
const ch = cfg.channels && cfg.channels[key];
|
|
175
|
+
if (!ch) continue;
|
|
176
|
+
if (ch.token) { process.stdout.write(ch.token); process.exit(0); }
|
|
177
|
+
if (ch.appId && ch.clientSecret) { process.stdout.write(ch.appId + ':' + ch.clientSecret); process.exit(0); }
|
|
178
|
+
}
|
|
179
|
+
" 2>/dev/null || true)
|
|
180
|
+
fi
|
|
181
|
+
|
|
182
|
+
if [ "$CURRENT_TOKEN" = "$DESIRED_TOKEN" ]; then
|
|
183
|
+
echo " ✅ 当前配置已是目标值,跳过写入"
|
|
184
|
+
elif $CMD channels add --channel qqbot --token "$DESIRED_TOKEN" 2>&1; then
|
|
185
|
+
echo " ✅ 机器人通道配置成功"
|
|
186
|
+
else
|
|
187
|
+
echo " ⚠️ 通道配置失败,请手动执行: $CMD channels add --channel qqbot --token \"$DESIRED_TOKEN\""
|
|
188
|
+
fi
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
# [4/4] 重启网关
|
|
192
|
+
echo ""
|
|
193
|
+
echo "[4/4] 重启网关..."
|
|
194
|
+
$CMD gateway restart 2>&1 || true
|
|
195
|
+
|
|
196
|
+
echo ""
|
|
197
|
+
echo "==========================================="
|
|
198
|
+
echo " ✅ 升级完成"
|
|
199
|
+
echo "==========================================="
|
|
200
|
+
echo ""
|
|
201
|
+
echo "常用命令:"
|
|
202
|
+
echo " $CMD logs --follow # 跟踪日志"
|
|
203
|
+
echo " $CMD gateway restart # 重启服务"
|
|
204
|
+
echo " $CMD plugins list # 查看插件列表"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# qqbot 一键更新并启动脚本
|
|
4
4
|
# 版本: 2.0 (增强错误处理版)
|
|
5
5
|
#
|
|
6
6
|
# 主要改进:
|
|
@@ -44,20 +44,20 @@ while [[ $# -gt 0 ]]; do
|
|
|
44
44
|
echo "用法: $0 [选项]"
|
|
45
45
|
echo ""
|
|
46
46
|
echo "选项:"
|
|
47
|
-
echo " --appid <appid> QQ机器人
|
|
48
|
-
echo " --secret <secret> QQ机器人
|
|
49
|
-
echo " --markdown <yes|no> 是否启用
|
|
47
|
+
echo " --appid <appid> QQ机器人 appid"
|
|
48
|
+
echo " --secret <secret> QQ机器人 secret"
|
|
49
|
+
echo " --markdown <yes|no> 是否启用 markdown 消息格式(默认: no)"
|
|
50
50
|
echo " -h, --help 显示帮助信息"
|
|
51
51
|
echo ""
|
|
52
52
|
echo "也可以通过环境变量设置:"
|
|
53
|
-
echo " QQBOT_APPID QQ机器人
|
|
54
|
-
echo " QQBOT_SECRET QQ机器人
|
|
55
|
-
echo " QQBOT_TOKEN QQ机器人
|
|
56
|
-
echo " QQBOT_MARKDOWN 是否启用
|
|
53
|
+
echo " QQBOT_APPID QQ机器人 appid"
|
|
54
|
+
echo " QQBOT_SECRET QQ机器人 secret"
|
|
55
|
+
echo " QQBOT_TOKEN QQ机器人 token (appid:secret)"
|
|
56
|
+
echo " QQBOT_MARKDOWN 是否启用 markdown(yes/no)"
|
|
57
57
|
echo ""
|
|
58
58
|
echo "不带参数时,将使用已有配置直接启动。"
|
|
59
59
|
echo ""
|
|
60
|
-
echo "⚠️ 注意: 启用
|
|
60
|
+
echo "⚠️ 注意: 启用 markdown 需要在 QQ 开放平台申请 markdown 消息权限"
|
|
61
61
|
exit 0
|
|
62
62
|
;;
|
|
63
63
|
*)
|
|
@@ -74,7 +74,7 @@ SECRET="${SECRET:-$QQBOT_SECRET}"
|
|
|
74
74
|
MARKDOWN="${MARKDOWN:-$QQBOT_MARKDOWN}"
|
|
75
75
|
|
|
76
76
|
echo "========================================="
|
|
77
|
-
echo "
|
|
77
|
+
echo " qqbot 一键更新启动脚本"
|
|
78
78
|
echo "========================================="
|
|
79
79
|
|
|
80
80
|
# 1. 备份已有 qqbot 通道配置,防止升级过程丢失
|
|
@@ -134,19 +134,34 @@ fi
|
|
|
134
134
|
# 2. 移除老版本
|
|
135
135
|
echo ""
|
|
136
136
|
echo "[2/6] 移除老版本..."
|
|
137
|
-
if [ -f "$PROJ_DIR/scripts/
|
|
138
|
-
bash "$PROJ_DIR/scripts/
|
|
137
|
+
if [ -f "$PROJ_DIR/scripts/cleanup-legacy-plugins.sh" ]; then
|
|
138
|
+
bash "$PROJ_DIR/scripts/cleanup-legacy-plugins.sh"
|
|
139
139
|
else
|
|
140
|
-
echo "警告:
|
|
140
|
+
echo "警告: cleanup-legacy-plugins.sh 不存在,跳过移除步骤"
|
|
141
141
|
fi
|
|
142
142
|
|
|
143
143
|
# 3. 安装当前版本
|
|
144
144
|
echo ""
|
|
145
|
-
echo "[3/6]
|
|
145
|
+
echo "[3/6] 安装当前版本(源码安装)..."
|
|
146
146
|
|
|
147
147
|
echo "检查当前目录: $(pwd)"
|
|
148
148
|
echo "检查openclaw版本: $(openclaw --version 2>/dev/null || echo 'openclaw not found')"
|
|
149
149
|
|
|
150
|
+
LOCAL_PACKAGE_VERSION=$(node -e "
|
|
151
|
+
try {
|
|
152
|
+
const fs = require('fs');
|
|
153
|
+
const path = require('path');
|
|
154
|
+
const p = path.join('$PROJ_DIR', 'package.json');
|
|
155
|
+
const v = JSON.parse(fs.readFileSync(p, 'utf8')).version;
|
|
156
|
+
if (v) process.stdout.write(String(v));
|
|
157
|
+
} catch {}
|
|
158
|
+
" 2>/dev/null || true)
|
|
159
|
+
if [ -n "$LOCAL_PACKAGE_VERSION" ]; then
|
|
160
|
+
echo "即将安装本地源码版本: $LOCAL_PACKAGE_VERSION"
|
|
161
|
+
else
|
|
162
|
+
echo "即将安装本地源码版本: unknown(未读取到 package.json version)"
|
|
163
|
+
fi
|
|
164
|
+
|
|
150
165
|
# 记录更新前的 qqbot 插件版本
|
|
151
166
|
OLD_QQBOT_VERSION=$(node -e '
|
|
152
167
|
try {
|
|
@@ -165,6 +180,7 @@ OLD_QQBOT_VERSION=$(node -e '
|
|
|
165
180
|
' 2>/dev/null || echo "not_installed")
|
|
166
181
|
|
|
167
182
|
echo "开始安装插件..."
|
|
183
|
+
echo "安装来源: 当前仓库源码(openclaw plugins install .)"
|
|
168
184
|
INSTALL_LOG="/tmp/openclaw-install-$(date +%s).log"
|
|
169
185
|
|
|
170
186
|
echo "安装日志文件: $INSTALL_LOG"
|
|
@@ -281,13 +297,13 @@ done
|
|
|
281
297
|
DESIRED_QQBOT_TOKEN=""
|
|
282
298
|
if [ -n "$APPID" ] && [ -n "$SECRET" ]; then
|
|
283
299
|
DESIRED_QQBOT_TOKEN="${APPID}:${SECRET}"
|
|
284
|
-
echo "使用提供的
|
|
300
|
+
echo "使用提供的 appid 和 secret 配置..."
|
|
285
301
|
elif [ -n "$QQBOT_TOKEN" ]; then
|
|
286
302
|
DESIRED_QQBOT_TOKEN="$QQBOT_TOKEN"
|
|
287
303
|
echo "使用环境变量 QQBOT_TOKEN 配置..."
|
|
288
304
|
elif [ -n "$SAVED_QQBOT_TOKEN" ]; then
|
|
289
305
|
DESIRED_QQBOT_TOKEN="$SAVED_QQBOT_TOKEN"
|
|
290
|
-
echo "未提供
|
|
306
|
+
echo "未提供 appid/secret,使用备份 token 恢复配置..."
|
|
291
307
|
fi
|
|
292
308
|
|
|
293
309
|
if [ -n "$DESIRED_QQBOT_TOKEN" ]; then
|
|
@@ -318,33 +334,33 @@ else
|
|
|
318
334
|
echo ""
|
|
319
335
|
echo "❌ 未检测到 qqbot 通道配置!"
|
|
320
336
|
echo ""
|
|
321
|
-
echo "首次运行请提供
|
|
337
|
+
echo "首次运行请提供 appid 和 appsecret:"
|
|
322
338
|
echo ""
|
|
323
|
-
echo " bash $0 --appid <你的
|
|
339
|
+
echo " bash $0 --appid <你的appid> --secret <你的appsecret>"
|
|
324
340
|
echo ""
|
|
325
341
|
echo "也可以通过环境变量:"
|
|
326
342
|
echo ""
|
|
327
|
-
echo " QQBOT_APPID=<
|
|
343
|
+
echo " QQBOT_APPID=<appid> QQBOT_SECRET=<appsecret> bash $0"
|
|
328
344
|
echo ""
|
|
329
|
-
echo "
|
|
345
|
+
echo "appid 和 appsecret 可在 QQ 开放平台 (https://q.qq.com) 获取。"
|
|
330
346
|
exit 1
|
|
331
347
|
else
|
|
332
348
|
echo "使用已有配置"
|
|
333
349
|
fi
|
|
334
350
|
fi
|
|
335
351
|
|
|
336
|
-
# 5. 配置
|
|
352
|
+
# 5. 配置 markdown 选项(仅在明确指定时才配置)
|
|
337
353
|
echo ""
|
|
338
|
-
echo "[5/6] 配置
|
|
354
|
+
echo "[5/6] 配置 markdown 选项..."
|
|
339
355
|
|
|
340
356
|
if [ -n "$MARKDOWN" ]; then
|
|
341
357
|
# 设置 markdown 配置
|
|
342
358
|
if [ "$MARKDOWN" = "yes" ] || [ "$MARKDOWN" = "y" ] || [ "$MARKDOWN" = "true" ]; then
|
|
343
359
|
MARKDOWN_VALUE="true"
|
|
344
|
-
echo "启用
|
|
360
|
+
echo "启用 markdown 消息格式..."
|
|
345
361
|
else
|
|
346
362
|
MARKDOWN_VALUE="false"
|
|
347
|
-
echo "禁用
|
|
363
|
+
echo "禁用 markdown 消息格式(使用纯文本)..."
|
|
348
364
|
fi
|
|
349
365
|
|
|
350
366
|
CURRENT_MARKDOWN_VALUE=$(node -e "
|
|
@@ -367,9 +383,9 @@ if [ -n "$MARKDOWN" ]; then
|
|
|
367
383
|
" 2>/dev/null || true)
|
|
368
384
|
|
|
369
385
|
if [ "$CURRENT_MARKDOWN_VALUE" = "$MARKDOWN_VALUE" ]; then
|
|
370
|
-
echo "✅
|
|
386
|
+
echo "✅ markdown 配置已是目标值,跳过写入(避免配置覆盖提示)"
|
|
371
387
|
elif openclaw config set channels.qqbot.markdownSupport "$MARKDOWN_VALUE" 2>&1; then
|
|
372
|
-
echo "✅
|
|
388
|
+
echo "✅ markdown配置成功"
|
|
373
389
|
_config_changed=1
|
|
374
390
|
else
|
|
375
391
|
echo "⚠️ openclaw config set 失败,尝试直接编辑配置文件..."
|
|
@@ -384,14 +400,14 @@ if [ -n "$MARKDOWN" ]; then
|
|
|
384
400
|
cfg.channels.qqbot.markdownSupport = target;
|
|
385
401
|
fs.writeFileSync('$OPENCLAW_CONFIG', JSON.stringify(cfg, null, 4) + '\n');
|
|
386
402
|
" 2>&1; then
|
|
387
|
-
echo "✅
|
|
403
|
+
echo "✅ markdown配置成功(直接编辑配置文件)"
|
|
388
404
|
_config_changed=1
|
|
389
405
|
else
|
|
390
|
-
echo "⚠️
|
|
406
|
+
echo "⚠️ markdown配置设置失败,不影响后续运行"
|
|
391
407
|
fi
|
|
392
408
|
fi
|
|
393
409
|
else
|
|
394
|
-
echo "未指定
|
|
410
|
+
echo "未指定 markdown 选项,使用已有配置"
|
|
395
411
|
fi
|
|
396
412
|
|
|
397
413
|
# 6. 启动 openclaw
|
|
@@ -404,26 +420,26 @@ if ! command -v openclaw &> /dev/null; then
|
|
|
404
420
|
echo "❌ 错误: openclaw 命令未找到!"
|
|
405
421
|
echo ""
|
|
406
422
|
echo "可能的原因:"
|
|
407
|
-
echo "1.
|
|
423
|
+
echo "1. openclaw未安装或安装失败"
|
|
408
424
|
echo "2. PATH环境变量未包含openclaw路径"
|
|
409
425
|
echo "3. 需要重新登录或重启终端"
|
|
410
426
|
echo ""
|
|
411
427
|
exit 1
|
|
412
428
|
fi
|
|
413
429
|
|
|
414
|
-
echo "
|
|
430
|
+
echo "openclaw版本: $(openclaw --version 2>/dev/null || echo '未知')"
|
|
415
431
|
|
|
416
432
|
# 显示 qqbot 插件更新信息
|
|
417
433
|
NEW_QQBOT_VERSION="${NEW_QQBOT_VERSION:-unknown}"
|
|
418
434
|
if [ "$OLD_QQBOT_VERSION" = "$NEW_QQBOT_VERSION" ]; then
|
|
419
|
-
echo "
|
|
435
|
+
echo "qqbot 插件版本: $NEW_QQBOT_VERSION (未变化)"
|
|
420
436
|
elif [ "$OLD_QQBOT_VERSION" = "not_installed" ]; then
|
|
421
|
-
echo "
|
|
437
|
+
echo "qqbot 插件版本: $NEW_QQBOT_VERSION (新安装)"
|
|
422
438
|
else
|
|
423
|
-
echo "
|
|
439
|
+
echo "qqbot 插件版本: $OLD_QQBOT_VERSION -> $NEW_QQBOT_VERSION"
|
|
424
440
|
fi
|
|
425
441
|
echo ""
|
|
426
|
-
read -t 120 -p "是否后台重启
|
|
442
|
+
read -t 120 -p "是否后台重启 openclaw 网关服务?[Y/n] " start_choice || start_choice="y"
|
|
427
443
|
start_choice="${start_choice:-y}"
|
|
428
444
|
start_choice=$(printf '%s' "$start_choice" | tr '[:upper:]' '[:lower:]')
|
|
429
445
|
|
|
@@ -432,14 +448,14 @@ case "$start_choice" in
|
|
|
432
448
|
echo ""
|
|
433
449
|
# 不论配置是否变更,都显式 restart 一次,确保插件正确加载
|
|
434
450
|
# (plugins install 触发的自动重启链已在第 3 步等待完成)
|
|
435
|
-
echo "正在后台重启
|
|
451
|
+
echo "正在后台重启 openclaw 网关服务..."
|
|
436
452
|
if ! openclaw gateway restart 2>&1; then
|
|
437
453
|
echo ""
|
|
438
454
|
echo "⚠️ 后台重启失败,可能服务未安装"
|
|
439
455
|
echo "尝试: openclaw gateway install && openclaw gateway start"
|
|
440
456
|
fi
|
|
441
457
|
echo ""
|
|
442
|
-
echo "✅
|
|
458
|
+
echo "✅ openclaw 网关已在后台重启"
|
|
443
459
|
echo ""
|
|
444
460
|
# 等待 gateway 端口就绪(插件安装+自动重启可能需要 30-60 秒)
|
|
445
461
|
echo "等待 gateway 就绪(插件安装中,可能需要 30-60 秒)..."
|
|
@@ -462,8 +478,8 @@ case "$start_choice" in
|
|
|
462
478
|
else
|
|
463
479
|
echo "✅ Gateway 端口已就绪"
|
|
464
480
|
echo ""
|
|
465
|
-
# 检查
|
|
466
|
-
echo "检查
|
|
481
|
+
# 检查 qqbot WS 是否连接成功(最多等 30 秒)
|
|
482
|
+
echo "检查 qqbot 插件连接状态..."
|
|
467
483
|
_LOG_FILE="/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log"
|
|
468
484
|
_qqbot_ready=0
|
|
469
485
|
for _j in $(seq 1 15); do
|
|
@@ -473,17 +489,17 @@ case "$start_choice" in
|
|
|
473
489
|
_qqbot_ready=1
|
|
474
490
|
break
|
|
475
491
|
fi
|
|
476
|
-
printf "\r 等待
|
|
492
|
+
printf "\r 等待 qqbot WS 连接... (%d/15)" "$_j"
|
|
477
493
|
sleep 2
|
|
478
494
|
done
|
|
479
495
|
echo ""
|
|
480
496
|
|
|
481
497
|
if [ "$_qqbot_ready" -eq 0 ]; then
|
|
482
|
-
echo "⚠️
|
|
498
|
+
echo "⚠️ qqbot 插件可能未正确加载,尝试再次重启..."
|
|
483
499
|
openclaw gateway restart 2>&1 || true
|
|
484
500
|
sleep 10
|
|
485
501
|
else
|
|
486
|
-
echo "✅
|
|
502
|
+
echo "✅ qqbot 插件已连接"
|
|
487
503
|
fi
|
|
488
504
|
echo ""
|
|
489
505
|
echo "正在跟踪日志输出(按 Ctrl+C 停止查看,不影响后台服务)..."
|
|
@@ -513,12 +529,12 @@ case "$start_choice" in
|
|
|
513
529
|
*)
|
|
514
530
|
echo "无效选择,按默认值 y 执行后台重启"
|
|
515
531
|
echo ""
|
|
516
|
-
echo "正在后台重启
|
|
532
|
+
echo "正在后台重启 openclaw 网关服务..."
|
|
517
533
|
if ! openclaw gateway restart 2>&1; then
|
|
518
534
|
echo "⚠️ 后台重启失败,可能服务未安装"
|
|
519
535
|
echo "尝试: openclaw gateway install && openclaw gateway start"
|
|
520
536
|
fi
|
|
521
|
-
echo "✅
|
|
537
|
+
echo "✅ openclaw 网关已在后台重启"
|
|
522
538
|
;;
|
|
523
539
|
esac
|
|
524
540
|
|