Files

85 lines
3.1 KiB
Bash

#!/bin/bash
# Kakao Access Token Auto Refresh
# Refreshes access token using refresh token before 6-hour expiry
set -e
CONFIG_PATH="$HOME/.openclaw/openclaw.json"
# Load from config
REST_API_KEY=$(jq -r '.env.vars.KAKAO_REST_API_KEY // empty' "$CONFIG_PATH")
CLIENT_SECRET=$(jq -r '.env.vars.KAKAO_CLIENT_SECRET // empty' "$CONFIG_PATH")
if [ -z "$REST_API_KEY" ] || [ -z "$CLIENT_SECRET" ]; then
echo "❌ KAKAO_REST_API_KEY or KAKAO_CLIENT_SECRET not found in config"
# Send error to memory for cron to pick up (daily log file)
LOG_FILE="$HOME/openclaw/memory/kakao-token-errors-$(date +%Y-%m-%d).log"
echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] KAKAO_TOKEN_REFRESH_FAILED: Config missing" >> "$LOG_FILE"
exit 1
fi
# Read current refresh token
REFRESH_TOKEN=$(jq -r '.env.vars.KAKAO_REFRESH_TOKEN // empty' "$CONFIG_PATH")
if [ -z "$REFRESH_TOKEN" ]; then
echo "❌ KAKAO_REFRESH_TOKEN not found in config"
exit 1
fi
echo "🔄 Refreshing Kakao access token..."
# Request new tokens
RESPONSE=$(curl -s -X POST "https://kauth.kakao.com/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded;charset=utf-8" \
-d "grant_type=refresh_token" \
-d "client_id=$REST_API_KEY" \
-d "client_secret=$CLIENT_SECRET" \
-d "refresh_token=$REFRESH_TOKEN")
# Check for errors
ERROR=$(echo "$RESPONSE" | jq -r '.error // empty')
if [ -n "$ERROR" ]; then
echo "❌ Token refresh failed:"
echo "$RESPONSE" | jq '.'
# Log error (daily log file)
ERROR_DESC=$(echo "$RESPONSE" | jq -r '.error_description // .error')
LOG_FILE="$HOME/openclaw/memory/kakao-token-errors-$(date +%Y-%m-%d).log"
echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] KAKAO_TOKEN_REFRESH_FAILED: $ERROR_DESC" >> "$LOG_FILE"
exit 1
fi
# Extract tokens
NEW_ACCESS_TOKEN=$(echo "$RESPONSE" | jq -r '.access_token')
NEW_REFRESH_TOKEN=$(echo "$RESPONSE" | jq -r '.refresh_token // empty')
EXPIRES_IN=$(echo "$RESPONSE" | jq -r '.expires_in')
REFRESH_EXPIRES_IN=$(echo "$RESPONSE" | jq -r '.refresh_token_expires_in // empty')
echo "✅ New access token received (expires in ${EXPIRES_IN}s)"
# Calculate expiry timestamps (portable: works on macOS and Linux)
EXPIRES_AT=$(node -e "console.log(new Date(Date.now() + $EXPIRES_IN * 1000).toISOString())")
# Update config
TMP_CONFIG=$(mktemp)
jq --arg access "$NEW_ACCESS_TOKEN" \
--arg expires "$EXPIRES_AT" \
'.env.vars.KAKAO_ACCESS_TOKEN = $access | .env.vars.KAKAO_TOKEN_EXPIRES_AT = $expires' \
"$CONFIG_PATH" > "$TMP_CONFIG"
# Update refresh token if new one provided
if [ -n "$NEW_REFRESH_TOKEN" ] && [ "$NEW_REFRESH_TOKEN" != "null" ]; then
echo "✅ New refresh token received (expires in ${REFRESH_EXPIRES_IN}s)"
REFRESH_EXPIRES_AT=$(node -e "console.log(new Date(Date.now() + $REFRESH_EXPIRES_IN * 1000).toISOString())")
jq --arg refresh "$NEW_REFRESH_TOKEN" \
--arg refresh_expires "$REFRESH_EXPIRES_AT" \
'.env.vars.KAKAO_REFRESH_TOKEN = $refresh | .env.vars.KAKAO_REFRESH_TOKEN_EXPIRES_AT = $refresh_expires' \
"$TMP_CONFIG" > "${TMP_CONFIG}.2"
mv "${TMP_CONFIG}.2" "$TMP_CONFIG"
fi
mv "$TMP_CONFIG" "$CONFIG_PATH"
echo "💾 Tokens saved to config"
echo "✅ Done! (no restart needed - runtime config reload)"