@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tencent-connect/openclaw-qqbot",
3
- "version": "1.6.5-alpha.7",
3
+ "version": "1.6.5",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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
- # ── 恢复 channels.qqbot 配置 ──
487
- # 安装完成(无论成功或失败),把之前暂存的 channels.qqbot 写回 openclaw.json
488
- if [ -n "$_QQBOT_CHANNEL_STASH" ] && [ -n "$_STASH_CFG" ] && [ -f "$_STASH_CFG" ]; then
489
- node -e "
490
- const fs = require('fs');
491
- const cfg = JSON.parse(fs.readFileSync('$_STASH_CFG', 'utf8'));
492
- if (!cfg.channels) cfg.channels = {};
493
- cfg.channels.qqbot = $_QQBOT_CHANNEL_STASH;
494
- fs.writeFileSync('$_STASH_CFG', JSON.stringify(cfg, null, 4) + '\n');
495
- " 2>/dev/null && echo " 已恢复 channels.qqbot 配置" || echo " ⚠️ 恢复 channels.qqbot 配置失败"
496
- fi
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(兼容多 key)
503
+ # 读取当前 qqbot token(从暂存或配置文件)
504
+ # 注意:channels.qqbot 已被暂存移除,所以从 _QQBOT_CHANNEL_STASH 读取
503
505
  CURRENT_QQBOT_TOKEN=""
504
- for _app in openclaw clawdbot moltbot; do
505
- _cfg="$HOME/.$_app/$_app.json"
506
- if [ -f "$_cfg" ]; then
507
- CURRENT_QQBOT_TOKEN=$(node -e "
508
- const cfg = JSON.parse(require('fs').readFileSync('$_cfg', 'utf8'));
509
- const keys = ['qqbot', 'openclaw-qqbot', 'openclaw-qq'];
510
- for (const key of keys) {
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 "配置机器人通道: qqbot"
535
- echo "目标Token: ${DESIRED_QQBOT_TOKEN:0:10}..."
536
- if [ "$CURRENT_QQBOT_TOKEN" = "$DESIRED_QQBOT_TOKEN" ]; then
537
- echo "✅ 当前配置已是目标值,跳过写入(避免配置覆盖提示)"
538
- _config_changed=0
539
- elif ! openclaw channels add --channel qqbot --token "$DESIRED_QQBOT_TOKEN" 2>&1; then
540
- echo "⚠️ 警告: 机器人通道配置失败,继续使用已有配置"
541
- _config_changed=0
542
- else
543
- echo "✅ 机器人通道配置成功"
544
- _config_changed=1
545
- # channels 配置变更在 reload plan 中匹配为 hot reload(非 restart),
546
- # channel 插件热重载处理,通常 <1 秒完成,无需长时间等待。
547
- sleep 1
548
- fi
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
- # 未提供任何可用 token 时,检查是否已有可用配置
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. 配置 markdown 选项(仅在明确指定时才配置)
547
+ # 5. 确定 markdown 选项
576
548
  echo ""
577
- echo "[5/6] 配置 markdown 选项..."
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 "启用 markdown 消息格式..."
555
+ echo "将启用 markdown 消息格式"
584
556
  else
585
557
  MARKDOWN_VALUE="false"
586
- echo "禁用 markdown 消息格式(使用纯文本)..."
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
- # 端口就绪后:检查 qqbot 连接 + 跟踪日志
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 " openclaw gateway restart # 重启后台服务"
781
- echo " openclaw logs --follow # 跟踪日志"
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 执行后台重启"