openclaw/start-jarvis-whatsapp.sh
calvin-Yi3Wood 877a9d7c9a feat: 完成贾维斯Bot WhatsApp版本部署配置
## 主要更新

### 安全配置增强
- 添加 api.z.ai 到网络白名单(支持GLM-4.7 API)
- 网络监控改为监控模式(ENFORCE=0)
- 配置单用户授权(+8613219870000)

### 多模型策略实现
- 主模型: GLM-4.7 (文本对话,¥0.015/千tokens)
- 备用模型: Kimi K2.5 (图片识别、视频解析)
- 自动fallback机制

### 文档完善
- 创建完整的 CLAUDE.md 项目文档
- 添加贾维斯使用指南(多模型策略、成本估算)
- 添加快速启动指南和部署摘要

### 自动化脚本
- WhatsApp登录脚本
- 快速启动脚本(start-jarvis-whatsapp.sh)
- 配置验证脚本
- Web UI快捷启动(打开WebUI.bat)

### 配置文件
- env.sh模板(环境变量配置)
- config-template.json(配置模板)
- 响应前缀配置: [🤖贾维斯]

## 测试状态
 WhatsApp连接成功
 API密钥配置完成(GLM + Kimi)
 多模型fallback正常工作
 Web UI可访问(端口18789)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-29 11:02:08 +08:00

308 lines
10 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# 贾维斯 Bot WhatsApp安全启动脚本
#
# 此脚本:
# 1. 检查所有必需的环境变量
# 2. 显示安全配置摘要
# 3. 验证配置文件完整性
# 4. 启动贾维斯 Bot服务WhatsApp通道
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
NC='\033[0m' # No Color
# 打印函数
print_header() {
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}========================================${NC}"
}
print_success() {
echo -e "${GREEN}${NC} $1"
}
print_warning() {
echo -e "${YELLOW}${NC} $1"
}
print_error() {
echo -e "${RED}${NC} $1"
}
print_info() {
echo -e "${CYAN}${NC} $1"
}
# 清屏并显示横幅
clear
echo
echo -e "${MAGENTA}╔════════════════════════════════════════════╗${NC}"
echo -e "${MAGENTA}║ ║${NC}"
echo -e "${MAGENTA}║ 🦞 贾维斯 Bot (Jarvis Bot) ║${NC}"
echo -e "${MAGENTA}║ WhatsApp 安全启动 ║${NC}"
echo -e "${MAGENTA}║ ║${NC}"
echo -e "${MAGENTA}╚════════════════════════════════════════════╝${NC}"
echo
echo -e "${CYAN}基于 Moltbot 安全加固版本${NC}"
echo -e "${CYAN}单用户模式 | 网络白名单 | 审计日志${NC}"
echo
# ============================================
# 步骤1: 加载环境变量
# ============================================
print_header "步骤1: 加载环境变量"
ENV_FILE="$HOME/.clawdbot/env.sh"
if [[ -f "$ENV_FILE" ]]; then
print_success "找到环境变量文件: $ENV_FILE"
source "$ENV_FILE"
else
print_warning "未找到环境变量文件"
print_info "请先运行: ./setup-whatsapp-config.sh"
echo
# 检查是否已经在环境中设置
if [[ -z "$MOLTBOT_HARDENING_ENABLED" ]]; then
print_error "环境变量未配置"
echo
echo "请执行以下步骤之一:"
echo "1. 运行配置向导: ${CYAN}./setup-whatsapp-config.sh${NC}"
echo "2. 手动创建: $ENV_FILE"
echo "3. 导出环境变量: export MOLTBOT_HARDENING_ENABLED=1"
exit 1
else
print_info "使用当前环境中的变量"
fi
fi
echo
# ============================================
# 步骤2: 验证必需的环境变量
# ============================================
print_header "步骤2: 验证环境变量"
MISSING_VARS=0
# 检查安全加固开关
if [[ -z "$MOLTBOT_HARDENING_ENABLED" ]]; then
print_error "MOLTBOT_HARDENING_ENABLED 未设置"
MISSING_VARS=$((MISSING_VARS + 1))
else
print_success "安全加固: 已启用"
fi
# 检查授权用户哈希
if [[ -z "$MOLTBOT_AUTHORIZED_USER_HASH" ]]; then
print_error "MOLTBOT_AUTHORIZED_USER_HASH 未设置"
MISSING_VARS=$((MISSING_VARS + 1))
else
# 验证哈希格式应该是64个十六进制字符
if [[ "$MOLTBOT_AUTHORIZED_USER_HASH" =~ ^[a-f0-9]{64}$ ]]; then
print_success "授权哈希: ${MOLTBOT_AUTHORIZED_USER_HASH:0:16}... (格式正确)"
else
print_warning "授权哈希格式可能不正确应为64位十六进制"
print_info "当前值: ${MOLTBOT_AUTHORIZED_USER_HASH:0:32}..."
fi
fi
# 检查可选的环境变量
if [[ -n "$MOLTBOT_HARDENING_NETWORK_ENFORCE" ]]; then
print_success "网络白名单强制: ${MOLTBOT_HARDENING_NETWORK_ENFORCE}"
else
print_warning "网络白名单强制未设置默认为0"
export MOLTBOT_HARDENING_NETWORK_ENFORCE=1
print_info "已自动设置为强制模式1"
fi
if [[ -n "$MOLTBOT_HARDENING_FS_ENFORCE" ]]; then
print_success "文件系统强制: ${MOLTBOT_HARDENING_FS_ENFORCE}"
else
print_info "文件系统强制未设置默认为0仅审计"
export MOLTBOT_HARDENING_FS_ENFORCE=0
fi
# 检查API密钥可选但推荐
if [[ -z "$ANTHROPIC_API_KEY" ]]; then
print_warning "ANTHROPIC_API_KEY 未设置"
print_info "如需使用Claude AI请设置此环境变量"
print_info "获取地址: https://console.anthropic.com/account/keys"
else
print_success "Claude API密钥: ${ANTHROPIC_API_KEY:0:10}..."
fi
echo
# 如果有缺失的必需变量,退出
if [[ $MISSING_VARS -gt 0 ]]; then
print_error "缺少 $MISSING_VARS 个必需的环境变量"
echo
echo "请运行配置向导: ${CYAN}./setup-whatsapp-config.sh${NC}"
exit 1
fi
# ============================================
# 步骤3: 验证配置文件
# ============================================
print_header "步骤3: 验证配置文件"
CONFIG_FILE="$HOME/.clawdbot/clawdbot.json"
if [[ -f "$CONFIG_FILE" ]]; then
print_success "配置文件: $CONFIG_FILE"
# 检查文件权限
if [[ -r "$CONFIG_FILE" ]]; then
PERMS=$(stat -c "%a" "$CONFIG_FILE" 2>/dev/null || stat -f "%OLp" "$CONFIG_FILE" 2>/dev/null || echo "unknown")
if [[ "$PERMS" == "600" ]]; then
print_success "文件权限: $PERMS (安全)"
else
print_warning "文件权限: $PERMS (建议设为600)"
chmod 600 "$CONFIG_FILE" 2>/dev/null && print_info "已自动修正为600"
fi
fi
else
print_warning "配置文件不存在"
print_info "将使用环境变量配置"
fi
echo
# ============================================
# 步骤4: 显示安全配置摘要
# ============================================
print_header "安全配置摘要"
echo
echo -e "${CYAN}安全功能状态:${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo -e " 🔒 单用户授权: ${GREEN}已启用${NC}(仅手机号: ${MOLTBOT_AUTHORIZED_USER_HASH:0:8}..."
echo -e " 🌐 网络白名单: ${GREEN}$([ "${MOLTBOT_HARDENING_NETWORK_ENFORCE:-0}" == "1" ] && echo "强制模式 ⚡" || echo "审计模式 📝")${NC}"
echo -e " 📁 文件系统监控: ${GREEN}$([ "${MOLTBOT_HARDENING_FS_ENFORCE:-0}" == "1" ] && echo "强制模式 ⚡" || echo "审计模式 📝")${NC}"
echo -e " 📝 审计日志: ${GREEN}已启用${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo
echo -e "${CYAN}通道配置:${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo -e " 通道类型: ${GREEN}WhatsApp (Baileys)${NC}"
echo -e " DM策略: ${GREEN}白名单模式${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo
echo -e "${CYAN}路径配置:${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo -e " 配置目录: $HOME/.clawdbot/"
echo -e " 审计日志: $HOME/.clawdbot/security-audit.log"
echo -e " 主配置: $CONFIG_FILE"
echo -e " 环境变量: $ENV_FILE"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo
# ============================================
# 步骤5: 最终确认
# ============================================
echo -e "${YELLOW}⚠ 启动前确认:${NC}"
echo "1. 此Bot将仅允许手机号 ${GREEN}${PHONE_NUMBER}${NC} 控制"
echo "2. 其他WhatsApp账号的消息将被静默拒绝"
echo "3. 所有网络请求将受白名单限制"
echo "4. 所有敏感操作将记录到审计日志"
echo "5. 首次启动会显示二维码,请使用手机扫描"
echo
read -p "按回车键继续启动或按Ctrl+C取消... " -r
echo
# ============================================
# 步骤6: 检查依赖
# ============================================
print_header "步骤6: 检查依赖"
# 检查Node.js
if command -v node &> /dev/null; then
NODE_VERSION=$(node --version)
MAJOR_VERSION=$(echo "$NODE_VERSION" | sed 's/v//' | cut -d. -f1)
if [[ "$MAJOR_VERSION" -ge 22 ]]; then
print_success "Node.js: $NODE_VERSION (符合≥22.12.0要求)"
else
print_error "Node.js: $NODE_VERSION (需要≥22.12.0)"
exit 1
fi
else
print_error "Node.js 未安装"
exit 1
fi
# 检查node_modules
if [[ -d "node_modules" ]]; then
print_success "依赖已安装"
else
print_warning "依赖未安装"
print_info "正在安装依赖可能需要5-10分钟..."
if command -v pnpm &> /dev/null; then
pnpm install
elif command -v npm &> /dev/null; then
npm install
else
print_error "npm/pnpm 都不可用"
exit 1
fi
fi
echo
# ============================================
# 步骤7: 启动服务
# ============================================
print_header "步骤7: 启动贾维斯 Bot (WhatsApp)"
echo
echo -e "${GREEN}正在启动服务...${NC}"
echo -e "${CYAN}日志输出:${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo
echo -e "${YELLOW}⚠ 首次启动说明:${NC}"
echo "1. 启动后会显示一个二维码"
echo "2. 打开手机WhatsApp"
echo "3. 进入 设置 > 已连接的设备 > 连接设备"
echo "4. 扫描终端中显示的二维码"
echo "5. 连接成功后即可开始使用"
echo
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo
# 启动命令
if command -v pnpm &> /dev/null; then
exec pnpm moltbot gateway run --bind loopback --port 18789
elif command -v npm &> /dev/null; then
exec npm run moltbot -- gateway run --bind loopback --port 18789
else
# 尝试直接使用node运行
if [[ -f "dist/index.js" ]]; then
exec node dist/index.js gateway run --bind loopback --port 18789
else
print_error "无法找到启动入口"
print_info "请先构建项目: npm run build"
exit 1
fi
fi