126 lines
4.8 KiB
Bash
Executable File
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"
|