#!/bin/bash # Token 自注册脚本 # 首次使用时自动调用,获取独立 Token # # 前置条件:~/.openclaw/cloud-deploy.json 已初始化(含 apiUrl + registrationKey) # 用法: bash register.sh [contactId] set -e CONFIG_FILE="$HOME/.openclaw/cloud-deploy.json" SCRIPT_DIR="$(dirname "$0")" # 检查配置文件 if [ ! -f "$CONFIG_FILE" ]; then echo "📝 首次使用,自动初始化配置..." bash "$SCRIPT_DIR/init-config.sh" fi # 读取配置 API_URL=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE'))['apiUrl'])") REG_KEY=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE'))['registrationKey'])") TOKEN=$(python3 -c "import json; t=json.load(open('$CONFIG_FILE')).get('token'); print(t if t else '')") # 如果已有 Token,验证是否有效 if [ -n "$TOKEN" ]; then HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 \ -H "Authorization: Bearer $TOKEN" \ "$API_URL/health" 2>/dev/null || echo "000") if [ "$HTTP_CODE" != "000" ]; then echo "Token 已存在且有效" echo "$TOKEN" exit 0 fi fi # 获取 agentId(配置文件 → hostname 兜底) AGENT_ID=$(python3 -c "import json; a=json.load(open('$CONFIG_FILE')).get('agentId',''); print(a if a else '')" 2>/dev/null) if [ -z "$AGENT_ID" ]; then AGENT_ID="$(hostname)-$(date +%s)" fi INSTANCE_NAME="$(hostname)" CONTACT_ID="${1:-unknown}" echo "正在注册 Token..." echo " API: $API_URL" echo " AgentId: $AGENT_ID" echo " Instance: $INSTANCE_NAME" # 调用注册接口 RESPONSE=$(curl -s --max-time 15 \ -X POST "$API_URL/auth/register" \ -H "Content-Type: application/json" \ -d "{ \"registrationKey\": \"$REG_KEY\", \"agentId\": \"$AGENT_ID\", \"instanceName\": \"$INSTANCE_NAME\", \"contactId\": \"$CONTACT_ID\" }" 2>/dev/null) if [ -z "$RESPONSE" ]; then echo "错误:API 无响应" exit 1 fi # 检查是否有错误 ERROR=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('error',''))" 2>/dev/null) if [ -n "$ERROR" ]; then MSG=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('message',''))" 2>/dev/null) echo "注册失败: $ERROR - $MSG" exit 1 fi # 提取 Token NEW_TOKEN=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('token',''))" 2>/dev/null) if [ -z "$NEW_TOKEN" ]; then echo "错误:未获取到 Token" echo "$RESPONSE" exit 1 fi # 保存 Token 到配置(通过环境变量传递,避免注入) NEW_TOKEN="$NEW_TOKEN" AGENT_ID="$AGENT_ID" CONFIG_FILE="$CONFIG_FILE" python3 -c " import json, os config_path = os.environ['CONFIG_FILE'] with open(config_path, 'r') as f: config = json.load(f) config['token'] = os.environ['NEW_TOKEN'] config['agentId'] = os.environ['AGENT_ID'] with open(config_path, 'w') as f: json.dump(config, f, indent=2, ensure_ascii=False) " # 注册成功后清除本地注册码(已完成使命,避免泄露) python3 -c " import json with open('$CONFIG_FILE', 'r') as f: config = json.load(f) config['registrationKey'] = '' with open('$CONFIG_FILE', 'w') as f: json.dump(config, f, indent=2, ensure_ascii=False) " echo "✅ 注册成功,Token 已保存,注册码已清除" echo "$NEW_TOKEN"