Playwright uruchamia izolowaną przeglądarkę (Chromium/Firefox) z czystym profilem. To oznacza, że automatyzacja nie ma dostępu do zalogowanych portali użytkownika — każde zadanie wymaga złożonego logowania (login + hasło + 2FA + email verification).
Dla zadań takich jak:
.env…jest to blokujące. Użytkownik jest już zalogowany w lokalnym Firefox, ale Playwright tego nie widzi.
Kopiujemy sesje z lokalnego Firefox do izolowanej przeglądarki Playwright.
Moduł FirefoxSessionImporter (src/nlp2cmd/automation/firefox_sessions.py):
┌──────────────────┐ copy session files ┌────────────────────────┐
│ Firefox (Snap) │ ─────────────────────────→ │ Playwright Firefox │
│ zalogowany na: │ cookies.sqlite │ (izolowana instancja) │
│ - openrouter.ai │ logins.json │ │
│ - github.com │ storage/ │ ✓ Zalogowany na: │
│ - anthropic.com │ cert9.db │ - openrouter.ai │
│ - allegro.pl │ webappsstore.sqlite │ - github.com │
└──────────────────┘ │ - anthropic.com │
└────────────────────────┘
NLP2CMD_USE_FIREFOX_SESSIONS=1 nlp2cmd -r "wyciągnij klucz API z OpenRouter i zapisz do .env"
cookies.sqlite z Firefox (WAL-safe, działa gdy Firefox uruchomiony)context.add_cookies()playwright install chromium=1 i =cookies działają identycznieNLP2CMD_USE_FIREFOX_SESSIONS=firefox nlp2cmd -r "otwórz stronę"
~/.nlp2cmd/firefox_playwright_profile/pw.firefox.launch_persistent_context() z tym profilemplaywright install firefoxNLP2CMD_FIREFOX_PROFILE=~/snap/firefox/common/.mozilla/firefox/abc123.default-release \
NLP2CMD_USE_FIREFOX_SESSIONS=1 nlp2cmd -r "..."
Jeśli NLP2CMD_USE_FIREFOX_SESSIONS=1 ale Playwright Firefox nie jest zainstalowany:
⚠ Playwright Firefox nie zainstalowany (uruchom: playwright install firefox)
↳ Fallback: Chromium + wstrzykiwanie ciasteczek Firefox
🦊 Wstrzyknięto 1781 ciasteczek Firefox do Chromium
System automatycznie przełącza się na Chromium + cookie injection.
| Zmienna | Wartości | Opis |
|---|---|---|
NLP2CMD_USE_FIREFOX_SESSIONS |
1 |
Chromium + Firefox cookie injection (zalecany) |
NLP2CMD_USE_FIREFOX_SESSIONS |
cookies |
Identycznie jak 1 |
NLP2CMD_USE_FIREFOX_SESSIONS |
firefox |
Pełny profil Firefox (eksperymentalny, SPA crash!) |
NLP2CMD_USE_FIREFOX_SESSIONS |
(puste/brak) | Domyślne: czysty Chromium |
NLP2CMD_FIREFOX_PROFILE |
/ścieżka/do/profilu |
Jawna ścieżka do profilu Firefox |
Moduł przeszukuje standardowe lokalizacje:
| Instalacja | Ścieżka |
|---|---|
| Standard (apt) | ~/.mozilla/firefox/ |
| Snap (domyślna Ubuntu 22+) | ~/snap/firefox/common/.mozilla/firefox/ |
| Flatpak | ~/.var/app/org.mozilla.firefox/.mozilla/firefox/ |
Kolejność wykrywania profilu:
profiles.ini → sekcja z Default=1default-release w nazwiecookies.sqlite| Plik | Zawartość |
|---|---|
cookies.sqlite (+wal) |
Ciasteczka wszystkich stron |
logins.json |
Zapisane hasła (zaszyfrowane) |
key4.db |
Klucze szyfrowania haseł |
cert9.db |
Certyfikaty SSL |
webappsstore.sqlite |
localStorage |
permissions.sqlite |
Uprawnienia stron |
formhistory.sqlite |
Historia formularzy |
storage/ |
IndexedDB, cache API |
sessionstore.jsonlz4 |
Otwarte karty |
⚠️ Pełny profil Firefox (=firefox) crashuje strony SPA jak OpenRouter, GitHub, Anthropic.
Przyczyna: localStorage/IndexedDB/service workers z profilu Snap Firefox są
niekompatybilne z wersją Firefox w Playwright. Strona wyświetla:
"Application error: a client-side exception has occurred".
Rozwiązanie: Tryb =1 (Chromium + cookies) jest bezpieczny — wstrzykuje
tylko ciasteczka, które wystarczają do utrzymania sesji logowania.
LocalStorage nie jest potrzebny do autentykacji.
| Tryb | SPA-safe | localStorage | cookies | Zalecany |
|---|---|---|---|---|
=1 / =cookies |
✅ | ❌ | ✅ | Tak |
=firefox |
❌ | ✅ | ✅ | Nie (crashuje SPA) |
lock, .parentlock) są usuwane z kopii, aby Playwright mógł
otworzyć profil.max_age_hours).
Marker: ~/.nlp2cmd/firefox_playwright_profile/.nlp2cmd_session_copiedcookies.sqlite odbywa się na kopii w /tmp,
nie blokuje działającego Firefox.from nlp2cmd.automation.firefox_sessions import FirefoxSessionImporter
importer = FirefoxSessionImporter()
diag = importer.diagnose()
# diag = {
# "detected_profile": "/home/tom/snap/firefox/common/.mozilla/firefox/fk8ne2tm.default-1742302987775",
# "cookie_count": 1781,
# "cookie_domains": [".anthropic.com", ".github.com", ".openrouter.ai", ...],
# "session_files": {"cookies.sqlite": {"exists": true, "size": 1048576}, ...}
# }
# Playwright + Firefox browser
pip install playwright
playwright install firefox
# LUB tylko Chromium (wystarczy dla trybu cookies)
playwright install chromium
┌─────────────────────────────────────────────────────┐
│ nlp2cmd -r "wyciągnij klucz z OpenRouter" │
│ │
│ 1. ActionPlanner → plan 10 kroków │
│ navigate → check_session → extract_key → ... │
│ │
│ 2. FirefoxSessionImporter │
│ detect profile → copy sessions → cleanup locks │
│ │
│ 3. Playwright Firefox launch_persistent_context │
│ (z skopiowanym profilem = zalogowane sesje) │
│ │
│ 4. StepValidator (pre/post walidacja) │
│ check_session → "logged_in" ✓ │
│ extract_key → DOM scan → clipboard → regex │
│ │
│ 5. SchemaFallback (jeśli krok fail) │
│ rule-based → DOM extraction → clipboard → │
│ LLM re-planning via Ollama │
│ │
│ 6. save_env → .env + verify_env │
└─────────────────────────────────────────────────────┘
Automatyzacja zadań w przeglądarce bez potrzeby logowania — Playwright korzysta z istniejących sesji użytkownika z Firefox.
/tmpUżytkownik: nlp2cmd -r "wyciągnij klucz API z OpenRouter i zapisz do .env"
1. [ActionPlanner] → 10-krokowy plan (navigate, check_session, extract_key, ...)
2. [SessionImporter] → kopiuje sesje z Firefox Snap
3. [Playwright FF] → otwiera https://openrouter.ai/settings/keys
4. [check_session] → "logged_in" ✓ (dzięki skopiowanym cookies!)
5. [extract_key] → skanuje DOM → znajduje klucz sk-or-v1-...
6. [save_env] → zapisuje OPENROUTER_API_KEY="sk-or-v1-..." do .env
7. [verify_env] → potwierdza zapis ✓
Rezultat: Klucz API wyekstrahowany i zapisany bez interakcji użytkownika.