#!/usr/bin/env node /** * Kakao OAuth Refresh Token Collector * * 1. Starts local server on :8080 * 2. Opens browser for authorization * 3. Exchanges code for tokens * 4. Saves refresh_token to openclaw.json */ const http = require('http'); const { spawn } = require('child_process'); const fs = require('fs'); const path = require('path'); const REST_API_KEY = process.env.KAKAO_REST_API_KEY || '4d7f36bbfa672c5e24582307de57f4e4'; const CLIENT_SECRET = process.env.KAKAO_CLIENT_SECRET; const REDIRECT_URI = 'http://localhost:8080/callback'; const SCOPE = 'talk_calendar'; if (!CLIENT_SECRET) { console.error('ā KAKAO_CLIENT_SECRET environment variable not set'); process.exit(1); } const CONFIG_PATH = path.join(process.env.HOME, '.openclaw', 'openclaw.json'); // Authorization URL const authUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${encodeURIComponent(REDIRECT_URI)}&response_type=code&scope=${SCOPE}`; console.log('š± Kakao OAuth Refresh Token Collector\n'); console.log('š Authorization URL:'); console.log(authUrl); console.log('\nš Opening browser...\n'); // Open browser spawn('open', [authUrl]); // Start callback server const server = http.createServer(async (req, res) => { const url = new URL(req.url, `http://localhost:8080`); if (url.pathname === '/callback') { const code = url.searchParams.get('code'); const error = url.searchParams.get('error'); if (error) { res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' }); res.end(`
Error: ${error}
`); console.error('ā Authorization failed:', error); server.close(); process.exit(1); } if (!code) { res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' }); res.end('Refresh token saved. You can close this window.
Next: Restart OpenClaw gateway.
`); server.close(); process.exit(0); } catch (error) { console.error('ā Token exchange failed:', error.message); res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' }); res.end(`${error.message}
`); server.close(); process.exit(1); } } else { res.writeHead(404); res.end('Not Found'); } }); server.listen(8080, () => { console.log('š Callback server listening on http://localhost:8080'); console.log('ā³ Waiting for authorization...\n'); }); // Timeout after 5 minutes setTimeout(() => { console.log('\nā° Timeout after 5 minutes'); server.close(); process.exit(1); }, 5 * 60 * 1000);