- BT a mutat login-ul (09.2026): go.bancatransilvania.ro face 302 spre
marketing; formularul e pe goapp.bancatransilvania.ro, acelasi tab, fara popup.
- Daca formularul nu apare: eroare explicita cu URL/titlu + screenshot/HTML.
- scripts/check_login_page.py: verifica pagina de login fara credentiale.
- Download: asteapta documentul nou din "Recente"; export gol -> [SKIP], nu timeout.
- Screenshot la eroare facut inainte de oprirea Playwright.
- opencode.json: agentii opencode nu pot citi .env.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxPhZABSUf1RJXRWtwecqC
handle_command trata orice mesaj din grup: la un simplu emoji raspundea
cu "COMANDA NECUNOSCUTA" sau, pentru useri neautorizati, cu
"ACCES INTERZIS" - spam in grup si verificari de membership inutile.
Acum se proceseaza doar mesajele care incep cu "/". Singura exceptie e
raspunsul numeric la meniul de tranzactii, si doar pentru userul care are
o selectie pendinte. Mesajele fara text (poze, stickere) nu mai ajung in
ramura de comanda necunoscuta.
In plus, comenzile adresate explicit altui bot din grup (/scrape@alt_bot)
sunt ignorate - username-ul propriu se afla la pornire prin getMe.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YbuWZ699EFeYfPA3nNraa9
Autorizarea verifica membership-ul in TELEGRAM_CHAT_ID din .env, nu in
chat-ul din care vine comanda. Cand grupul a fost recreat (ROMFAST vechi
-5070112420 -> nou -5350305858), membrii noi erau respinsi, iar logul
arata doar titlul grupului - identic pentru ambele - deci cauza era
invizibila. Acum se logheaza id-ul chat-ului si, la respingere, un hint
explicit cand comanda vine din alt grup decat cel configurat.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YbuWZ699EFeYfPA3nNraa9
Scraper-ul e pornit ca subproces de telegram_trigger_bot.py cu
env=os.environ.copy(). Bot-ul isi incarca .env la pornire, deci copia
contine parola veche; load_dotenv() din config.py nu suprascrie o
variabila deja existenta, asa ca dupa schimbarea parolei scraper-ul
trimitea in continuare parola veche - BT respingea login-ul, push-ul 2FA
nu mai pleca si ramaneam blocati 300s in "Timeout 2FA".
- config.py: BTGO_USERNAME/BTGO_PASSWORD se citesc direct din .env
(dotenv_values), restul variabilelor raman din environment ca sa nu
strice TELEGRAM_MESSAGE_ID / SEND_AS_ZIP transmise de bot la fiecare run.
- btgo_scraper.py: detectie a mesajului de eroare de pe pagina de login in
bucla de asteptare 2FA -> esec rapid cu motivul real, plus screenshot
de diagnostic (si la respingere, si la timeout, cat browser-ul e viu).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YbuWZ699EFeYfPA3nNraa9
Pe prod scraper-ul ruleaza ca serviciu in Session 0 (fara GPU): Chromium
randeaza software. Reducerea viewport-ului de la 1920x1080 la 1366x768
inseamna ~50% mai putini pixeli de rasterizat. 1366 e sigur peste pragul
de ~1100px sub care BT scoate splash-ul "redirect to store".
Adaugate flag-uri care taie overhead inutil fara GPU: --disable-gpu,
--disable-dev-shm-usage, --disable-extensions, --disable-background-networking,
--disable-renderer-backgrounding, --disable-features=Translate.
Verificat e2e pe site-ul BT live la 1366px (formular login real, fara
splash) si printr-o rulare completa prin bot: 5 conturi, 5 CSV-uri.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Pe masina prod (Session 0, randare software) aplicatia Angular de la
goapp.bancatransilvania.ro ramane lenta pe splash-ul "Aplicatia ta de
banking business" si uneori depaseste 20s -> input#user nu apare.
Diagnostic confirmat: URL/titlu corecte, body gol, zero input-uri.
Asteptam load state, apoi input#user cu timeout 60s; daca tot nu apare,
reincarcam popup-ul o data si mai incercam. Worst case ~3 min, sub
timeout-ul de 2FA.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
context.route activeaza interceptarea cererilor: fiecare request al paginii
era pus pe pauza pentru un round-trip catre script. Pe masina prod (sync API,
Session 0) asta adauga latenta la fiecare request si incetinea vizibil
incarcarea dashboard-ului post-2FA. Blocarea nici nu rezolva CPU-ul - acela
vine din randarea software in Session 0, nu din trackere. Net: cost fara
beneficiu, deci o eliminam.
read_accounts: time.sleep(3) fix inlocuit cu wait_for_selector pe
fba-account-details-card (45s). Pe masina lenta lista nu apuca sa randeze
in 3s -> gasea 0 conturi. Daca tot 0, capteaza diagnostic (URL, text,
tag-uri fba-*, screenshot).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Cand wait_for_selector('input#user') da timeout, logam URL, titlu, text
vizibil, lista de input-uri si salvam screenshot full_page - cat browser-ul
e inca viu. Necesar ca sa distingem intre WAF block, randare lenta si
selector schimbat, fara sa mai ghicim.
Handler-ul de blocare trackere inghite acum TargetClosedError la shutdown,
ca sa nu mai spameze log-ul cu "Future exception was never retrieved" si
sa ascunda eroarea reala.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Pagina go.bancatransilvania.ro are tracking activ (Google Analytics,
LinkedIn, Facebook, omniconvert) care face request-uri continue 30+ sec
dupa load. wait_until='networkidle' nu se atinge niciodata si page.goto
face timeout dupa 30s.
Foloseste 'domcontentloaded' si asteapta explicit link-ul Login. Elimin
si fallback-ul mort cu networkidle din login() popup (15s wait inutil
dupa input#user — daca selectorul lipseste, networkidle nici el nu vine).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reduce de la 475 la 175 linii. Elimina diagrama ASCII de arhitectura
si sectiunile duplicate. Adauga sectiune dedicata pentru eroarea de
viewport-mic / Windows Service session 0, cu trimitere la fix-ul
--window-size din btgo_scraper.py. Reorganizeaza troubleshooting
pe simptome utilizator, nu pe linii de cod.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
In Windows Service (session 0, fara display) viewport-ul setat pe context
Playwright nu se propaga la fereastra fizica. BT afiseaza splash de redirect
sub ~1100px, ascunzand input#user si provocand timeout la wait_for_selector.
Adauga --window-size in args ca sa forteze dimensiunea la nivel de SO.
Ignora si .claude/ si .playwright-mcp/ (artefacte tooling local).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
BT a adaugat un guard de viewport: sub ~1200px, pagina de login afiseaza
un splash 'redirect to store' si ascunde formul real (#user / #password)
intr-un container .d-none.d-md-flex cu display:none.
Inainte, viewport-ul era setat doar pe pagina parinte; popup-ul deschis
prin expect_popup() folosea viewport-ul default (~1280x720) si declansa
splash-ul, ceea ce ducea la timeout pe wait_for_selector('input#user').
Fix: cream un context cu viewport 1920x1080, iar popup-urile mostenesc
automat viewport-ul context-ului.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Pagina de login s-a mutat la goapp.bancatransilvania.ro (Angular SPA)
care face un API call inainte sa randeze formularul. Inlocuieste
time.sleep(2) cu wait_for_selector('input#user', timeout=15000).
Actualizeaza si numele link-ului din LOGIN in Login.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Banner-ul GDPR aparea cu intarziere dupa page load si bloca click-ul.
Adaugat wait explicit, mai multe strategii de text, force click si
fallback JavaScript pentru eliminarea banner-ului din DOM.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Modificari principale:
- Noul flux download: expand -> tranzactii -> CSV -> Genereaza -> download
- Detectie inteligenta buton Tranzactii (evita butonul Delete)
- Verificare daca primul cont e deja expandat inainte de click
- Selectie conturi cu 6 strategii fallback + debug logging
- Handler pentru cookie consent "Accept toate" si "Am inteles"
- Screenshot automat la erori de selectie cont
Documentatie:
- README: sectiuni noi pentru inregistrare Playwright si testare manuala
- CLAUDE.md: selectori actualizati pentru noul UI
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Rezolva problema cand selectoarele BT se schimba - acum incearca
multiple strategii pentru a gasi username, password si submit button.
Imbunatateste si gestionarea GDPR cookie banner.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Sistem interactiv de selectie conturi cu state management
- Filtrare pe perioade: [nr cont] [nr zile] (ex: 2 30 = ultimele 30 zile)
- Format compact: tranzactii grupate pe date, fara sold
- Extragere inteligenta comercianti din platile POS (TID pattern)
- Escape automat caractere speciale Markdown pentru Telegram
- Timeout 5 minute pentru sesiuni de selectie
- Suport comenzi: doar numar = ultimele 10, numar + zile = filtrare
Corectari:
- Fix import timedelta pentru filtrare pe date
- Fix conflict nume variabila period vs csv_period
- Fix Markdown parsing errors (underscore, dot, etc)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Adauga logica de autorizare flexibila:
- Useri in TELEGRAM_ALLOWED_USER_IDS (whitelist explicit)
- SAU membrii grupului TELEGRAM_CHAT_ID (verificare getChatMember API)
- Membrii grupului pot folosi bot-ul atat in grup cat si in DM individual
Modificari:
- telegram_trigger_bot.py: metoda is_member_of_group() cu verificare API
- telegram_trigger_bot.py: is_user_allowed() cu logica OR pentru whitelist + grup
- .env.example: comentarii actualizate pentru noua logica
- TELEGRAM_BOT_SETUP.md: documentatie completa pentru autorizare
Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
La comenzile /scrape* se sterg automat fisierele CSV, JSON, ZIP si PNG anterioare pentru a preveni acumularea de date vechi.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- /scrape_zip trimite ZIP pe ambele canale (Telegram + email)
- /zip trimite ZIP și pe email, nu doar pe Telegram
- Elimină emoji-uri din mesajele Telegram user-facing
- Adaugă ghid "NO EMOJIS" în CLAUDE.md
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implementează logica de restart inline în loc să apeleze restart_service.ps1
pentru a evita 2 confirmări consecutive (Read-Host).
Îmbunătățiri:
- Restart serviciu inline (stop + start direct în funcție)
- Un singur prompt la final pentru revenire în meniu
- Mesaje de status detaliate pentru fiecare pas
- Gestionare erori pentru stop și start serviciu
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Nouă funcționalitate pentru actualizare automată:
- Opțiunea [G] în meniul principal
- Funcția Invoke-GitPullRestart care rulează git pull
- Restart automat al serviciului dacă este instalat
- Validare exit code și gestionare erori
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Problema:
- Logging eșua cu UnicodeEncodeError când scria caractere românești (ă, î, ș)
- Windows cmd.exe folosește cp1252 implicit, nu UTF-8
Soluție:
- Forțare encoding UTF-8 pentru stdout și stderr
- Folosește io.TextIOWrapper cu encoding='utf-8'
- errors='replace' pentru caractere care nu pot fi encodate
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Modificări:
- telegram_trigger_bot.py:
- Păstrează TELEGRAM_CHAT_ID și TELEGRAM_MESSAGE_ID pentru progress
- Setează flag SEND_AS_ZIP=true în environment
- NU mai dezactivează notificările
- notifications.py:
- Verifică flag SEND_AS_ZIP din environment
- Dacă SEND_AS_ZIP=true, trimite ZIP cu progress updates
- Mesajul de progres e editat la fel ca /scrape normal
Comportament /scrape_zip:
1. Bot trimite "Scraper pornit (arhiva ZIP)"
2. Scraper rulează și editează mesajul cu progress
3. notifications.py detectează flag-ul SEND_AS_ZIP
4. Trimite ZIP cu solduri în loc de fișiere individuale
5. Editează mesajul final cu detalii despre ZIP
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Funcționalitate:
- /scrape_zip - Rulează scraper + trimite rezultatele ca ZIP
- Dezactivează notificările automate din scraper
- Bot trimite manual ZIP-ul după scraping
Logică:
- run_scraper() primește parametru send_as_zip
- Dacă send_as_zip=True:
- Setează ENABLE_NOTIFICATIONS=false în env
- După scraping, apelează send_zip_files()
- Rezultat: un singur ZIP în loc de fișiere individuale
Comenzi disponibile:
- /scrape - Fisiere individuale (comportament original)
- /scrape_zip - Un singur ZIP (nou)
- /zip - Trimite fișierele existente ca ZIP (fără scraping)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Funcționalitate:
- /zip - Trimite ultimele fișiere ca arhivă ZIP
- Găsește automat fișierele din ultima sesiune
- Include solduri per cont + total RON în caption
- Verifică limita Telegram (50 MB)
- Șterge automat ZIP-ul temporar după trimitere
Avantaje:
- Mai rapid decât /scrape (nu rulează scraper-ul)
- Un singur fișier în loc de mai multe
- Include toate datele (CSV + JSON)
- Afișează solduri complete în mesaj
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- EmailNotifier primește lista de conturi (nu doar count)
- _create_email_body afișează solduri per cont + total RON
- Format tabel HTML frumos cu styling
- send_notifications.py citește date din JSON
- Sincronizare cu TelegramNotifier (deja avea solduri)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>