@tencent-connect/openclaw-qqbot 1.6.5-alpha.7 → 1.6.5
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/package.json +1 -1
- package/scripts/upgrade-via-npm.sh +4 -0
- package/scripts/upgrade-via-source.sh +128 -122
package/package.json
CHANGED
|
@@ -117,8 +117,12 @@ done
|
|
|
117
117
|
|
|
118
118
|
EXTENSIONS_DIR="$HOME/.$CMD/extensions"
|
|
119
119
|
|
|
120
|
+
# 检测 openclaw 版本
|
|
121
|
+
OPENCLAW_VERSION="$($CMD --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -1 || true)"
|
|
122
|
+
|
|
120
123
|
echo "==========================================="
|
|
121
124
|
echo " qqbot 升级: $INSTALL_SRC"
|
|
125
|
+
echo " openclaw 版本: ${OPENCLAW_VERSION:-unknown}"
|
|
122
126
|
echo "==========================================="
|
|
123
127
|
echo ""
|
|
124
128
|
|
|
@@ -483,40 +483,33 @@ else
|
|
|
483
483
|
' 2>/dev/null || echo "unknown")
|
|
484
484
|
fi
|
|
485
485
|
|
|
486
|
-
# ──
|
|
487
|
-
#
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
486
|
+
# ── 暂不恢复 channels.qqbot 配置 ──
|
|
487
|
+
# openclaw 3.23+ 启动时在插件加载前就校验 channels,
|
|
488
|
+
# 如果此时恢复 channels.qqbot,gateway 会因 "unknown channel id: qqbot" 拒绝启动。
|
|
489
|
+
# 延迟到 gateway 启动、插件加载完成后再恢复(见 Step 6)。
|
|
490
|
+
echo " [兼容] channels.qqbot 将在 gateway 启动后恢复(避免启动校验失败)"
|
|
491
|
+
|
|
492
|
+
# ── Step 4/5:不在此时写入 channels.qqbot 配置 ──
|
|
493
|
+
# openclaw 3.23+ 在插件加载前校验 channels,此时写入 channels.qqbot 会导致
|
|
494
|
+
# "unknown channel id: qqbot" 错误。所有 channels.qqbot 相关配置延迟到
|
|
495
|
+
# gateway 启动、插件加载完成后统一写入(见 Step 6 末尾)。
|
|
496
|
+
#
|
|
497
|
+
# 这里只计算出 DESIRED_QQBOT_TOKEN 和 MARKDOWN_VALUE,不实际写入。
|
|
497
498
|
|
|
498
|
-
# 4.
|
|
499
|
+
# 4. 确定机器人通道配置
|
|
499
500
|
echo ""
|
|
500
|
-
echo "[4/6]
|
|
501
|
+
echo "[4/6] 准备机器人通道配置..."
|
|
501
502
|
|
|
502
|
-
# 读取当前 qqbot token
|
|
503
|
+
# 读取当前 qqbot token(从暂存或配置文件)
|
|
504
|
+
# 注意:channels.qqbot 已被暂存移除,所以从 _QQBOT_CHANNEL_STASH 读取
|
|
503
505
|
CURRENT_QQBOT_TOKEN=""
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
const ch = cfg.channels && cfg.channels[key];
|
|
512
|
-
if (!ch) continue;
|
|
513
|
-
if (ch.token) { process.stdout.write(ch.token); process.exit(0); }
|
|
514
|
-
if (ch.appId && ch.clientSecret) { process.stdout.write(ch.appId + ':' + ch.clientSecret); process.exit(0); }
|
|
515
|
-
}
|
|
516
|
-
" 2>/dev/null || true)
|
|
517
|
-
[ -n "$CURRENT_QQBOT_TOKEN" ] && break
|
|
518
|
-
fi
|
|
519
|
-
done
|
|
506
|
+
if [ -n "$_QQBOT_CHANNEL_STASH" ]; then
|
|
507
|
+
CURRENT_QQBOT_TOKEN=$(node -e "
|
|
508
|
+
const ch = $_QQBOT_CHANNEL_STASH;
|
|
509
|
+
if (ch.token) { process.stdout.write(ch.token); }
|
|
510
|
+
else if (ch.appId && ch.clientSecret) { process.stdout.write(ch.appId + ':' + ch.clientSecret); }
|
|
511
|
+
" 2>/dev/null || true)
|
|
512
|
+
fi
|
|
520
513
|
|
|
521
514
|
DESIRED_QQBOT_TOKEN=""
|
|
522
515
|
if [ -n "$APPID" ] && [ -n "$SECRET" ]; then
|
|
@@ -531,104 +524,40 @@ elif [ -n "$SAVED_QQBOT_TOKEN" ]; then
|
|
|
531
524
|
fi
|
|
532
525
|
|
|
533
526
|
if [ -n "$DESIRED_QQBOT_TOKEN" ]; then
|
|
534
|
-
echo "
|
|
535
|
-
echo "
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
527
|
+
echo "目标 Token: ${DESIRED_QQBOT_TOKEN:0:10}..."
|
|
528
|
+
echo " [兼容] 将在 gateway 启动后写入 channels.qqbot"
|
|
529
|
+
elif [ -z "$CURRENT_QQBOT_TOKEN" ] && [ -z "$_QQBOT_CHANNEL_STASH" ]; then
|
|
530
|
+
echo ""
|
|
531
|
+
echo "❌ 未检测到 qqbot 通道配置!"
|
|
532
|
+
echo ""
|
|
533
|
+
echo "首次运行请提供 appid 和 appsecret:"
|
|
534
|
+
echo ""
|
|
535
|
+
echo " bash $0 --appid <你的appid> --secret <你的appsecret>"
|
|
536
|
+
echo ""
|
|
537
|
+
echo "也可以通过环境变量:"
|
|
538
|
+
echo ""
|
|
539
|
+
echo " QQBOT_APPID=<appid> QQBOT_SECRET=<appsecret> bash $0"
|
|
540
|
+
echo ""
|
|
541
|
+
echo "appid 和 appsecret 可在 QQ 开放平台 (https://q.qq.com) 获取。"
|
|
542
|
+
exit 1
|
|
549
543
|
else
|
|
550
|
-
|
|
551
|
-
_has_channel=0
|
|
552
|
-
if [ -n "$CURRENT_QQBOT_TOKEN" ]; then
|
|
553
|
-
_has_channel=1
|
|
554
|
-
fi
|
|
555
|
-
|
|
556
|
-
if [ "$_has_channel" -eq 0 ]; then
|
|
557
|
-
echo ""
|
|
558
|
-
echo "❌ 未检测到 qqbot 通道配置!"
|
|
559
|
-
echo ""
|
|
560
|
-
echo "首次运行请提供 appid 和 appsecret:"
|
|
561
|
-
echo ""
|
|
562
|
-
echo " bash $0 --appid <你的appid> --secret <你的appsecret>"
|
|
563
|
-
echo ""
|
|
564
|
-
echo "也可以通过环境变量:"
|
|
565
|
-
echo ""
|
|
566
|
-
echo " QQBOT_APPID=<appid> QQBOT_SECRET=<appsecret> bash $0"
|
|
567
|
-
echo ""
|
|
568
|
-
echo "appid 和 appsecret 可在 QQ 开放平台 (https://q.qq.com) 获取。"
|
|
569
|
-
exit 1
|
|
570
|
-
else
|
|
571
|
-
echo "使用已有配置"
|
|
572
|
-
fi
|
|
544
|
+
echo "使用已有配置(暂存中)"
|
|
573
545
|
fi
|
|
574
546
|
|
|
575
|
-
# 5.
|
|
547
|
+
# 5. 确定 markdown 选项
|
|
576
548
|
echo ""
|
|
577
|
-
echo "[5/6]
|
|
549
|
+
echo "[5/6] 准备 markdown 配置..."
|
|
578
550
|
|
|
551
|
+
MARKDOWN_VALUE=""
|
|
579
552
|
if [ -n "$MARKDOWN" ]; then
|
|
580
|
-
# 设置 markdown 配置
|
|
581
553
|
if [ "$MARKDOWN" = "yes" ] || [ "$MARKDOWN" = "y" ] || [ "$MARKDOWN" = "true" ]; then
|
|
582
554
|
MARKDOWN_VALUE="true"
|
|
583
|
-
echo "
|
|
555
|
+
echo "将启用 markdown 消息格式"
|
|
584
556
|
else
|
|
585
557
|
MARKDOWN_VALUE="false"
|
|
586
|
-
echo "
|
|
587
|
-
fi
|
|
588
|
-
|
|
589
|
-
CURRENT_MARKDOWN_VALUE=$(node -e "
|
|
590
|
-
const fs = require('fs');
|
|
591
|
-
const path = require('path');
|
|
592
|
-
const home = process.env.HOME;
|
|
593
|
-
for (const app of ['openclaw', 'clawdbot', 'moltbot']) {
|
|
594
|
-
const f = path.join(home, '.' + app, app + '.json');
|
|
595
|
-
if (!fs.existsSync(f)) continue;
|
|
596
|
-
try {
|
|
597
|
-
const cfg = JSON.parse(fs.readFileSync(f, 'utf8'));
|
|
598
|
-
const keys = ['qqbot', 'openclaw-qqbot', 'openclaw-qq'];
|
|
599
|
-
for (const key of keys) {
|
|
600
|
-
const ch = cfg.channels && cfg.channels[key];
|
|
601
|
-
if (!ch) continue;
|
|
602
|
-
if (typeof ch.markdownSupport === 'boolean') { process.stdout.write(String(ch.markdownSupport)); process.exit(0); }
|
|
603
|
-
}
|
|
604
|
-
} catch {}
|
|
605
|
-
}
|
|
606
|
-
" 2>/dev/null || true)
|
|
607
|
-
|
|
608
|
-
if [ "$CURRENT_MARKDOWN_VALUE" = "$MARKDOWN_VALUE" ]; then
|
|
609
|
-
echo "✅ markdown 配置已是目标值,跳过写入(避免配置覆盖提示)"
|
|
610
|
-
elif openclaw config set channels.qqbot.markdownSupport "$MARKDOWN_VALUE" 2>&1; then
|
|
611
|
-
echo "✅ markdown配置成功"
|
|
612
|
-
_config_changed=1
|
|
613
|
-
else
|
|
614
|
-
echo "⚠️ openclaw config set 失败,尝试直接编辑配置文件..."
|
|
615
|
-
OPENCLAW_CONFIG="$HOME/.openclaw/openclaw.json"
|
|
616
|
-
if [ -f "$OPENCLAW_CONFIG" ] && node -e "
|
|
617
|
-
const fs = require('fs');
|
|
618
|
-
const cfg = JSON.parse(fs.readFileSync('$OPENCLAW_CONFIG', 'utf-8'));
|
|
619
|
-
if (!cfg.channels) cfg.channels = {};
|
|
620
|
-
if (!cfg.channels.qqbot) cfg.channels.qqbot = {};
|
|
621
|
-
const target = $MARKDOWN_VALUE;
|
|
622
|
-
if (cfg.channels.qqbot.markdownSupport === target) process.exit(0);
|
|
623
|
-
cfg.channels.qqbot.markdownSupport = target;
|
|
624
|
-
fs.writeFileSync('$OPENCLAW_CONFIG', JSON.stringify(cfg, null, 4) + '\n');
|
|
625
|
-
" 2>&1; then
|
|
626
|
-
echo "✅ markdown配置成功(直接编辑配置文件)"
|
|
627
|
-
_config_changed=1
|
|
628
|
-
else
|
|
629
|
-
echo "⚠️ markdown配置设置失败,不影响后续运行"
|
|
630
|
-
fi
|
|
558
|
+
echo "将禁用 markdown 消息格式(使用纯文本)"
|
|
631
559
|
fi
|
|
560
|
+
echo " [兼容] 将在 gateway 启动后写入配置"
|
|
632
561
|
else
|
|
633
562
|
echo "未指定 markdown 选项,使用已有配置"
|
|
634
563
|
fi
|
|
@@ -727,10 +656,70 @@ case "$start_choice" in
|
|
|
727
656
|
fi
|
|
728
657
|
fi
|
|
729
658
|
|
|
730
|
-
#
|
|
659
|
+
# 端口就绪后:恢复 channels.qqbot 配置 + 检查连接 + 跟踪日志
|
|
731
660
|
if [ "$_port_ready" -eq 1 ]; then
|
|
732
|
-
echo "✅ Gateway
|
|
661
|
+
echo "✅ Gateway 端口已就绪(插件已加载)"
|
|
733
662
|
echo ""
|
|
663
|
+
|
|
664
|
+
# ── 恢复 channels.qqbot 配置 ──
|
|
665
|
+
# gateway 已启动、插件已注册 qqbot channel,现在可以安全写回配置
|
|
666
|
+
_need_reload=0
|
|
667
|
+
_target_cfg=""
|
|
668
|
+
for _app in openclaw clawdbot moltbot; do
|
|
669
|
+
_cfg="$HOME/.$_app/$_app.json"
|
|
670
|
+
if [ -f "$_cfg" ]; then
|
|
671
|
+
_target_cfg="$_cfg"
|
|
672
|
+
break
|
|
673
|
+
fi
|
|
674
|
+
done
|
|
675
|
+
|
|
676
|
+
if [ -n "$_target_cfg" ]; then
|
|
677
|
+
# 构建完整的 channels.qqbot 对象(合并暂存配置 + 新 token + markdown)
|
|
678
|
+
node -e "
|
|
679
|
+
const fs = require('fs');
|
|
680
|
+
const cfg = JSON.parse(fs.readFileSync('$_target_cfg', 'utf8'));
|
|
681
|
+
if (!cfg.channels) cfg.channels = {};
|
|
682
|
+
|
|
683
|
+
// 从暂存恢复基础配置
|
|
684
|
+
const stash = '$_QQBOT_CHANNEL_STASH';
|
|
685
|
+
if (stash) {
|
|
686
|
+
try { cfg.channels.qqbot = JSON.parse(stash); } catch {}
|
|
687
|
+
}
|
|
688
|
+
if (!cfg.channels.qqbot) cfg.channels.qqbot = {};
|
|
689
|
+
|
|
690
|
+
// 覆盖 token(如果有新值)
|
|
691
|
+
const desired = '$DESIRED_QQBOT_TOKEN';
|
|
692
|
+
if (desired && desired.includes(':')) {
|
|
693
|
+
const [appId, ...rest] = desired.split(':');
|
|
694
|
+
cfg.channels.qqbot.appId = appId;
|
|
695
|
+
cfg.channels.qqbot.clientSecret = rest.join(':');
|
|
696
|
+
delete cfg.channels.qqbot.token;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// 覆盖 markdown(如果有指定)
|
|
700
|
+
const md = '$MARKDOWN_VALUE';
|
|
701
|
+
if (md === 'true') cfg.channels.qqbot.markdownSupport = true;
|
|
702
|
+
else if (md === 'false') cfg.channels.qqbot.markdownSupport = false;
|
|
703
|
+
|
|
704
|
+
fs.writeFileSync('$_target_cfg', JSON.stringify(cfg, null, 4) + '\n');
|
|
705
|
+
" 2>/dev/null || true
|
|
706
|
+
echo " ✅ 已恢复 channels.qqbot 配置(含 token/markdown)"
|
|
707
|
+
_need_reload=1
|
|
708
|
+
fi
|
|
709
|
+
|
|
710
|
+
# 配置写回后 reload gateway 使其生效
|
|
711
|
+
if [ "$_need_reload" -eq 1 ]; then
|
|
712
|
+
echo " 重载配置..."
|
|
713
|
+
sleep 1
|
|
714
|
+
openclaw gateway restart 2>/dev/null || true
|
|
715
|
+
# 等待重启后端口重新就绪
|
|
716
|
+
for _k in $(seq 1 15); do
|
|
717
|
+
if lsof -i :18789 -sTCP:LISTEN >/dev/null 2>&1; then
|
|
718
|
+
break
|
|
719
|
+
fi
|
|
720
|
+
sleep 2
|
|
721
|
+
done
|
|
722
|
+
fi
|
|
734
723
|
# 检查 qqbot WS 是否连接成功(最多等 20 秒)
|
|
735
724
|
echo "检查 qqbot 插件连接状态..."
|
|
736
725
|
_LOG_FILE="/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log"
|
|
@@ -775,10 +764,27 @@ case "$start_choice" in
|
|
|
775
764
|
n|no)
|
|
776
765
|
echo ""
|
|
777
766
|
echo "✅ 插件更新完毕,未启动服务"
|
|
767
|
+
# 不启动时也需要恢复 channels.qqbot,否则配置丢失
|
|
768
|
+
# 注意:下次 gateway 启动可能因 "unknown channel id" 失败,
|
|
769
|
+
# 需要用户手动 stop → 移除 channels.qqbot → start → 恢复
|
|
770
|
+
if [ -n "$_QQBOT_CHANNEL_STASH" ] && [ -n "$_STASH_CFG" ] && [ -f "$_STASH_CFG" ]; then
|
|
771
|
+
node -e "
|
|
772
|
+
const fs = require('fs');
|
|
773
|
+
const cfg = JSON.parse(fs.readFileSync('$_STASH_CFG', 'utf8'));
|
|
774
|
+
if (!cfg.channels) cfg.channels = {};
|
|
775
|
+
cfg.channels.qqbot = $_QQBOT_CHANNEL_STASH;
|
|
776
|
+
fs.writeFileSync('$_STASH_CFG', JSON.stringify(cfg, null, 4) + '\n');
|
|
777
|
+
" 2>/dev/null || true
|
|
778
|
+
echo " 已恢复 channels.qqbot 配置"
|
|
779
|
+
fi
|
|
778
780
|
echo ""
|
|
779
|
-
echo "
|
|
780
|
-
echo "
|
|
781
|
-
echo "
|
|
781
|
+
echo "后续启动方法(兼容 openclaw 3.23+):"
|
|
782
|
+
echo " 1. 先临时移除 channels.qqbot 再启动:"
|
|
783
|
+
echo " openclaw gateway restart"
|
|
784
|
+
echo " 2. 或使用本脚本自动处理:"
|
|
785
|
+
echo " bash $0"
|
|
786
|
+
echo " 3. 跟踪日志:"
|
|
787
|
+
echo " openclaw logs --follow"
|
|
782
788
|
;;
|
|
783
789
|
*)
|
|
784
790
|
echo "无效选择,按默认值 y 执行后台重启"
|