Files
client/agent_browser_login.sh
T
2026-04-17 16:52:51 -04:00

126 lines
4.8 KiB
Bash
Executable File

#!/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"