--- name: LATAM Money RESOLVIDO via VM solver 2026-05-11 description: latammoney-solver na adv-22 (Chrome real CDP-spawn) faz BFF intercept e retorna 50 voos em 16-22s. 100% sucesso 5/5 testes. adv-23 pendente (senha sudo). type: project originSessionId: 2599d295-29b1-43d3-93f7-6b44de3bf1d6 --- # LATAM Money — Solver dedicado VM ADV-22 — 2026-05-11 ## Vitória **Causa raiz atacada**: stack puppeteer-extra+stealth do scraper antigo era detectada pela Akamai LATAM (TLS/JA3 modificado). Solução: **Chrome stable real + CDP-spawn na VM ADV-22 (IP residencial V.tal BH)** — padrão idêntico ao smiles-solver/tap-solver/gol-solver. ## Resultado validado (via gateway :3001) | Cenário | ms | Voos | comPreço | |---|---|---|---| | OW GRU-SCL cold | 3.3s | 50 | 50 (LA8054 R$ 912,24) | | OW GRU-SCL warm | 2.4s | 50 | cache solver hit | | OW GRU-MIA cold | 22s | 50 | (LA2395 R$ 2.032) | | RT GRU-SCL d+45/+52 | 22s | **100 (50+50)** | RT IDA+VOLTA | | OW 2A+1C GRU-SCL | 21s | 50 | multi-pax | **5/5 sucesso (100%)** — era 0-41% antes. 3x mais rápido. ## Arquitetura ``` [Servidor 173.208.187.154 PM2:46 scraper-latam-money:3038] ├── searchLatamMoney(params) ├── if (USE_VM_SOLVER && VM_HOSTS) → searchViaVmSolver(params) ← novo │ └── round-robin VM_HOSTS → http://VM:9097/search?... │ └── parse BFF body com parseBff() existente └── fallback: stack antiga (puppeteer-extra + proxy 40520, 33% sucesso) [adv-22 100.91.20.22:9097] ├── systemd: latammoney-solver.service (active) ├── User: customer, WorkingDir /opt/latammoney-solver ├── Chrome 147 stable CDP --remote-debugging-port=9225 ├── --use-gl=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist --enable-webgl ├── --user-data-dir /home/customer/latammoney-chrome-profile (persistente) ├── DISPLAY=:99 (Xvfb) ├── playwright-core connectOverCDP ├── MAX_CONCURRENT=3, CACHE_TTL 60min, WARMUP_REFRESH 8min ├── auto-warmup background mantém _abck válido └── intercept /bff/air-offers/v2/offers/search → retorna body cru ``` ## Env vars (servidor scraper-latam-money) | Var | Default | Função | |---|---|---| | `LATAM_USE_VM_SOLVER` | `1` | Liga VM solver (default ON) | | `LATAM_VM_SOLVER_HOSTS` | `100.91.20.22` | Lista CSV de VMs (round-robin) | | `LATAM_VM_SOLVER_PORT` | `9097` | Porta dos solvers VM | | `LATAM_VM_SOLVER_TIMEOUT_MS` | `180000` | Timeout busca | Pra adicionar adv-23 quando senha sudo for resolvida: ```bash sudo env LATAM_VM_SOLVER_HOSTS=100.91.20.22,100.123.139.93 pm2 restart scraper-latam-money --update-env ``` ## Arquivos **No servidor**: - `/opt/skymilhas/scrapers/latam-money/index.js` (com patch VM solver no topo + entrada) - Backup: `index.js.bak-pre-strict-*` **Na adv-22**: - `/opt/latammoney-solver/latammoney-solver.mjs` (290 linhas) - `/opt/latammoney-solver/package.json` (playwright-core ^1.55.0) - `/opt/latammoney-solver/node_modules/playwright-core` (instalado) - `/etc/systemd/system/latammoney-solver.service` - `/var/log/latammoney-solver.log` - `/home/customer/latammoney-chrome-profile/` (Chrome user data) - UFW: `sudo ufw allow in on tailscale0 to any port 9097 proto tcp` ## Setup adv-22 (cronologia) 1. `mkdir /opt/latammoney-solver && chown customer:customer` 2. SCP `latammoney-solver.mjs` + `package.json` + `latammoney-solver.service` (de C:\Users\Jesiel\Desktop\skymilhas-site\latammoney-solver\) 3. `npm install --omit=dev` (1 package, 7s) 4. `sudo cp latammoney-solver.service /etc/systemd/system/` 5. `sudo systemctl daemon-reload && sudo systemctl enable --now latammoney-solver` 6. `sudo ufw allow in on tailscale0 to any port 9097 proto tcp` 7. 1ª busca: 16s e retornou 50 ofertas (BFF intercept OK) ## adv-23 — PENDENTE Tentei replicar mas adv-23 NÃO tem sudo NOPASSWD (diferente do adv-22). Senha `Skymilhas26` funciona pra SSH mas falha em `sudo -S whoami`. Provavelmente foi configurado via root direto (memória 30/04 do adv-22 menciona `sudo nopasswd` em `/etc/sudoers.d/customer-nopasswd`, mas adv-23 só tem `/etc/sudoers.d/README`). **Caminho de resolução**: 1. Jesiel via AnyDesk pro WIN-TIICDNET3GJ ou direto no console adv-23 2. `sudo visudo -f /etc/sudoers.d/customer-nopasswd` → `customer ALL=(ALL) NOPASSWD: ALL` 3. Ou simplesmente passar a senha sudo do customer em adv-23 e eu replico via plink interativo Após isso: replicar setup (passos 1-7 acima) e adicionar `100.123.139.93` em `LATAM_VM_SOLVER_HOSTS`. ## Endpoints solver (na VM) ```bash curl http://100.91.20.22:9097/health curl http://100.91.20.22:9097/cache/clear curl http://100.91.20.22:9097/restart-chrome curl 'http://100.91.20.22:9097/search?origin=GRU&destination=SCL&departureDate=2026-06-25&adults=1[&returnDate=...&children=...&infants=...]' ``` Resposta `/search` (sucesso): `{ success: true, body: "", contentLength: N, elapsed: 16.4, source: "vm_solver" }` ## LATAM Pass — ainda pendente CapSolver desativado (linha 1655). Auth0 ainda rate-limita 100%. Próximo: criar `latampass-solver` na VM seguindo MESMO padrão deste (1-2h trabalho), com login Auth0 + IMAP 2FA via mail.skymilhas.com. **Why:** Jesiel pediu atacar causa raiz. Investigação revelou que era stack puppeteer detectada pela Akamai (TLS/JA3). Replicado padrão validado em outros 6 scrapers. **How to apply:** LATAM Money agora estável. Pra escalar carga 5k usuários: resolver senha sudo adv-23 e adicionar à `LATAM_VM_SOLVER_HOSTS` → dobra capacidade.