#!/usr/bin/env bash # agent_browser_login.sh # Opens a headed, isolated agent-browser session and logs in to any client # page using the nsec from ~/.wsb_key/private_key.txt. # # Usage: # ./agent_browser_login.sh [session-name] [url] # # Defaults: # session-name : auto-login-$$ (unique per run) # url : https://laantungir.net/client/index.html set -euo pipefail SESSION="${1:-auto-login-$$}" RAW_URL="${2:-index.html}" BASE_URL="https://laantungir.net/client" # If just a page name (no http/https/slash prefix), expand to full client URL if [[ "$RAW_URL" != http* && "$RAW_URL" != /* ]]; then URL="${BASE_URL}/${RAW_URL}" else URL="$RAW_URL" fi KEY_FILE="${HOME}/.wsb_key/private_key.txt" if [[ ! -f "$KEY_FILE" ]]; then echo "ERROR: Key file not found: $KEY_FILE" >&2 exit 1 fi NSEC=$(cat "$KEY_FILE" | tr -d '[:space:]') if [[ -z "$NSEC" ]]; then echo "ERROR: Key file is empty: $KEY_FILE" >&2 exit 1 fi echo "[agent_browser_login] Session: $SESSION" echo "[agent_browser_login] URL: $URL" echo "[agent_browser_login] Key: ${NSEC:0:12}..." # Open the page in an isolated headed session agent-browser --session-name "$SESSION" open "$URL" agent-browser --session-name "$SESSION" wait --load networkidle # Check if already logged in (Logout button present = already authed) IS_LOGGED_IN=$(agent-browser --session-name "$SESSION" eval \ "document.querySelector('button')?.textContent?.includes('Logout') || \ [...document.querySelectorAll('button')].some(b=>b.textContent.trim()==='Logout') \ ? 'yes' : 'no'" 2>/dev/null || echo "no") if [[ "$IS_LOGGED_IN" == "yes" ]]; then echo "[agent_browser_login] Already logged in, logging out first..." agent-browser --session-name "$SESSION" eval \ "[...document.querySelectorAll('button')].find(b=>b.textContent.trim()==='Logout')?.click()" agent-browser --session-name "$SESSION" wait 1000 fi # Launch the login modal echo "[agent_browser_login] Launching login modal..." agent-browser --session-name "$SESSION" eval "window.NOSTR_LOGIN_LITE?.launch()" agent-browser --session-name "$SESSION" wait 500 # Click "Local Key" echo "[agent_browser_login] Clicking Local Key..." agent-browser --session-name "$SESSION" eval \ "[...document.querySelectorAll('button')].find(b=>b.textContent.includes('Local Key'))?.click()" agent-browser --session-name "$SESSION" wait 500 # Fill in the nsec key echo "[agent_browser_login] Filling in nsec..." agent-browser --session-name "$SESSION" eval \ "(()=>{ const i = document.querySelector('input[type=password], input[placeholder*=nsec], input[placeholder*=secret], textarea[placeholder*=nsec]') || [...document.querySelectorAll('input,textarea')].find(el=>el.placeholder?.toLowerCase().includes('secret')); if(!i) return 'ERROR: no key input found'; i.value = '$NSEC'; i.dispatchEvent(new Event('input',{bubbles:true})); i.dispatchEvent(new Event('change',{bubbles:true})); return 'filled'; })()" agent-browser --session-name "$SESSION" wait 300 # Click "Import Key" echo "[agent_browser_login] Clicking Import Key..." agent-browser --session-name "$SESSION" eval \ "[...document.querySelectorAll('button')].find(b=>b.textContent.includes('Import Key') && !b.disabled)?.click()" agent-browser --session-name "$SESSION" wait 1000 # Click "Continue" if shown agent-browser --session-name "$SESSION" eval \ "[...document.querySelectorAll('button')].find(b=>b.textContent.trim()==='Continue')?.click()" 2>/dev/null || true agent-browser --session-name "$SESSION" wait 2000 # Verify login PUBKEY=$(agent-browser --session-name "$SESSION" eval \ "window.nostr?.getPublicKey ? 'pending' : 'none'" 2>/dev/null || echo "none") agent-browser --session-name "$SESSION" eval \ "window.nostr?.getPublicKey().then(pk=>window._loginPubkey=pk)" 2>/dev/null || true agent-browser --session-name "$SESSION" wait 1000 PUBKEY=$(agent-browser --session-name "$SESSION" eval \ "window._loginPubkey || 'not logged in'" 2>/dev/null || echo "not logged in") echo "[agent_browser_login] Logged in as: $PUBKEY" # If this is bunker.html, extract and print the bunker URI if [[ "$URL" == *"bunker.html"* ]]; then agent-browser --session-name "$SESSION" wait 2000 BUNKER_URI=$(agent-browser --session-name "$SESSION" eval \ "[...document.querySelectorAll('textarea')].map(t=>t.value).find(v=>v.startsWith('bunker://'))" \ | tr -d '"') if [[ -n "$BUNKER_URI" && "$BUNKER_URI" != "null" ]]; then echo "[agent_browser_login] Bunker URI: $BUNKER_URI" echo "BUNKER_URI=$BUNKER_URI" else echo "[agent_browser_login] WARNING: Could not read bunker URI (bunker may not be started yet)" fi fi echo "[agent_browser_login] Session '$SESSION' is ready." echo "" echo "To use this session in subsequent agent-browser commands:" echo " agent-browser --session-name \"$SESSION\" snapshot"