# VM 201 — btgo-playwright (Scraper Banca Transilvania George) ## Obiectiv Scraper automat pentru `go.bancatransilvania.ro` (Banca Transilvania): extrage solduri conturi și descarcă CSV-uri de tranzacții. Rulează ca Windows Service pe VM 201, cu notificări Telegram. **Repo:** `git@gitea.romfast.ro:romfast/btgo-playwright.git` --- ## Stack Tehnic | Componentă | Detaliu | |------------|---------| | Limbaj | Python (venv dedicat) | | Browser automation | `playwright==1.48.0` (Python SDK) | | Mod | API Python direct: `from playwright.sync_api import sync_playwright` | | Notificări | Telegram Bot API | | Deploy | Windows Service (PowerShell wrappers) | | Headless | **`HEADLESS=false` obligatoriu** | ### De ce Playwright Python SDK (și nu MCP / CLI) Trei variante de a folosi Playwright; aici se folosește **a treia**: 1. **Playwright MCP plugin** — pentru Claude Code (agent control). NU se aplică. 2. **Playwright CLI** — pentru proiecte Node.js. NU se aplică. 3. **Playwright Python SDK** — dependință Python instalată în venv, folosită programatic din script. ✅ Folosită aici. Concluzie: setup-ul actual e corect pentru acest use case. Funcționează independent de Claude. --- ## Constrângere Critică: HEADLESS=false WAF-ul Banca Transilvania detectează și blochează: - Rularea în Docker - Rularea headless **De aceea:** - Serviciul rulează direct pe VM 201 (Windows GUI prezent) - Browser-ul Chromium pornește vizibil (`headless=False`) - VM 201 trebuie să rămână pornit cu sesiune Windows activă Orice migrare către container Linux / headless rupe scraper-ul la primul login. --- ## Flow Aplicație ``` login() → autentificare cu user/parolă ↓ handle_2fa_wait() → așteaptă confirmare 2FA (notificare Telegram) ↓ read_accounts() → parsează lista de conturi + solduri ↓ download_transactions() → descarcă CSV per cont ↓ save_results() → persistă date + notificare Telegram (succes/eroare) ``` --- ## Deploy ca Windows Service Serviciul este înregistrat ca Windows Service prin scripturi PowerShell din repo. Lansează `python.exe` din venv-ul proiectului asupra entry-point-ului scraper-ului. Verificare rapidă pe VM 201: ```powershell # Status serviciu Get-Service -Name "btgo-playwright*" # Restart Restart-Service -Name "btgo-playwright" # Loguri Get-EventLog -LogName Application -Source "btgo-playwright" -Newest 20 ``` (Numele exact al serviciului și calea instalării sunt în README-ul repo-ului `btgo-playwright`.) --- ## Dependențe Operaționale - **VM 201 pornit + sesiune Windows activă** (necesar pentru `HEADLESS=false`) - **Acces internet** către `go.bancatransilvania.ro` - **Acces internet** către `api.telegram.org` - **Chromium instalat de Playwright** (`playwright install chromium` în venv) --- ## Troubleshooting ### Login eșuează / WAF block 1. Verifică că serviciul rulează cu sesiune Windows activă (NU doar RDP deconectat — sesiunea trebuie să persiste). Vezi mai jos. 2. Confirmă `HEADLESS=false` în config / variabile mediu. 3. Verifică că nu rulează în paralel altă instanță Chromium pe profilul Playwright (lock pe user data dir). ### 2FA nu primește notificare Verifică tokenul Telegram și `chat_id` din config. Test rapid: ```powershell curl "https://api.telegram.org/bot$TOKEN/getMe" ``` ### Sesiune Windows se închide după RDP disconnect Pentru ca browser-ul GUI să rămână activ după RDP disconnect, sesiunea trebuie păstrată. Variante: - `tscon` din alt RDP pentru a transfera sesiunea pe consola fizică - Configurare auto-logon + serviciul lansat în sesiunea consolă --- ## Referințe - Repo: http://gitea:3000/romfast/btgo-playwright - Playwright Python docs: https://playwright.dev/python/ - README VM 201: `../README.md` --- **Ultima actualizare:** 2026-04-25 **Autor:** Marius Mutu