--- projeto: SkyMilhas data: 2026-04-23 tags: [skymilhas, cache, dedup, kasada, tap, frontend, multi-datas, link-oficial] status: em-andamento --- # Sessao 2026-04-23 - Cache, TAP Kasada, Link Multi-datas Sessao longa cobrindo tres frentes: 1. **TAP**: Kasada bloqueou IP/pool — infra propria criada, mas nao passou 2. **Cache + Dedup**: correcoes no gateway e scrapers 3. **Frontend**: fix de link oficial em busca de multiplas datas --- ## 1. TAP Miles&Go — Kasada Block (NAO RESOLVIDO) ### Contexto - TAP funcionou ate ~13:34 UTC de hoje (84 voos CNF->LIS retornados) - A partir de ~14:00 UTC: TODAS as chamadas /bfm/rest/booking/availability/search retornam **HTTP 429** com `x-kpsdk-r: 1-AA` (block Kasada) - O MESMO codigo que funcionava de manha parou de funcionar sem mudanca alguma ### Diagnostico - `x-kpsdk-h` (hash fingerprint Kasada) identico em todas tentativas - Kasada classificador server-side colocou IP do servidor (173.208.187.154) + pool proxy-seller em blacklist ### 12 tentativas falharam (todas 429) 1. puppeteer-real-browser + sem proxy 2. puppeteer-real-browser + proxy-bridge BR (40500) 3. puppeteer-real-browser + proxy-bridge US (40502) 4. Camoufox + proxy BR 5. Camoufox + proxy PT/ES/IT (multi-pais via 40506) 6. Camoufox + proxy TAP dedicado (40508) 7. Camoufox + fetch direto no browser (skip Angular) 8. Camoufox + fingerprint random (3 OS x 3 locale x 4 screen) 9. Warmup www.flytap.com -> booking.flytap.com 10. Browser fresh a cada request (pool_max_uses=1) 11. IP rotation em 5 paises diferentes 12. Direct fetch com payload Angular completo ### Correcoes de codigo aplicadas (ficam permanentes) 1. **Bug EXE fare family**: `indexOf('EXEC')` -> `indexOf('EXE')`, reordenado. EXEINT agora mapeia pra "Executive" (antes mostrava "EXEINT" cru). 2. **Suporte Round-Trip**: - `buildBookingUrl` adiciona `retDate` + `flightType=return` quando `params.returnDate` - Parser itera `listOutbound` E `listInbound` - `parseTapFlight(direction)` usa campos in/out do offer conforme sentido - Gateway ja passa `returnDate` (server.js:867) ### Infra propria criada (ONLINE, mas stopped) | Componente | Porta | Status | |---|---|---| | `proxy-bridge-tap` | 40508/40509 | ✅ online (BR/PT/ES/IT/FR/DE/GB/US) | | `kasada-solver` | 40520/40521 | ⏸️ stopped (queimando IP) | | `scraper-tap-milesgo` | 3022 | ⏸️ stopped | ### Proxima acao - Esperar 4-24h cooldown natural do Kasada - Reativar: `pm2 restart scraper-tap-milesgo kasada-solver` - Testar com curl antes: `curl --max-time 10 https://booking.flytap.com/bfm/rest/booking/availability/search -X POST -H "content-type: application/json" -d '{}' -o /dev/null -w "%{http_code}\n"` — se != 429, liberou --- ## 2. Cache + Dedup (RESOLVIDO) ### CACHE_TTL padronizado 60min em todos - Antes: AA = 2h, Azul = 4h, resto = 60min - Agora: TODOS = 60min (alinhado com gateway + scrapers + cache-helper) - Arquivos modificados: - `/opt/skymilhas/scrapers/aadvantage/index.js` + `service.js` - `/opt/skymilhas/scrapers/azul/service.js` ### Gateway dedup (pendingSearches) — /opt/skymilhas/server.js - **Problema**: frontend disparava requests paralelos com mesma cacheKey -> gateway fazia 2 scrapes e salvava cache 2x. Log: `(FRESH)` seguido de `(CACHE)` pra mesma data. - **Fix**: novo `Map pendingSearches` (linha ~908). Se cacheKey ja tem Promise in-flight, 2a request aguarda ela terminar e pega cache. - **Backup**: `/opt/skymilhas/server.js.bak-predup-` ### Chave de cache — cada data + returnDate e chave separada ``` GRU-MIA-2026-05-11-2026-05-15-2-1-1-business (ida 11, volta 15) GRU-MIA-2026-05-12-2026-05-16-2-1-1-business (ida 12, volta 16) GRU-MIA-2026-05-13-2026-05-17-2-1-1-business (ida 13, volta 17) ``` ### Comportamento confirmado em producao - 1a busca 5 datas: ~72s (scrape ao vivo cada) - 2a busca mesmas datas (<60min): `CACHE HIT` instantaneo (<1s total) - Log: `[Livelo] CACHE HIT GRU->MIA | 99 voos` confirmando --- ## 3. Frontend - Link Oficial Multi-datas (RESOLVIDO) ### Bug - Em busca matriz (5+ dias), funcao `gerarLinkCompanhia` usava `buscaAtual.dataVolta` = primeira data da matriz - Qualquer voo de datas subsequentes abria site oficial com **data errada** (sempre a primeira ou ultima dependendo do merge) - Afeta: Livelo, Smiles, LATAM, Azul, TAP, AA, Delta, GOL ### Fix aplicado em /var/www/skymilhas/app/Views/painel/index.php 1. No merge de resultados (loop datas), cada voo passa a guardar: ```js dataIdaBusca: dataIdaAtual, dataVoltaBusca: dataVoltaAtual ``` 2. `gerarLinkCompanhia()` agora usa: ```js const dataPartida = voo.dataIdaBusca || voo.dataPartida || ...; const dataVoltaBusca = voo.dataVoltaBusca || buscaAtual?.dataVolta || ''; ``` 3. `voo.link` do scraper continua tendo prioridade (ja vinha certo) 4. Fallback `gerarLinkCompanhia` agora usa as datas do voo especifico ### Backup `/var/www/skymilhas/app/Views/painel/index.php.bak-prelinkfix-` --- ## Tentativa de paralelizar loop JS (REVERTIDA) ### Motivo - Loop `for await` sequencial = 5 datas x 15s = 75s - Tentei pool de 3 workers concorrentes -> esperava ~25s - **Usuario reportou que "selecao no frontend parou de funcionar"** apos meu deploy - **REVERTI** para backup `bak-preparallel2-1776971545` - Patch nao esta ativo (0 matches de `CONCURRENCIA_DATAS` em producao) ### Possivel causa (nao investigada) - Algum race condition com UI updates em paralelo - Ou conflito com `buscaCancelada` sendo mutado em varios workers - Ou merge de `resultadosAgrupados` sendo sobrescrito por workers ### Proxima vez - Testar patch em staging antes de produzir - Adicionar logs de debug ao loop paralelo - Considerar Promise.allSettled em vez de Promise.all --- ## Conflito de deploy observado - Deployei painel/index.php as 20:54 UTC - Outro processo/deploy sobrescreveu minha versao as 21:05 UTC - Identifiquei pelo diff de tamanho (1953706 -> 1967673 bytes) - O arquivo nao tinha meu patch mas tinha outras mudancas (agrupamento por data real) - Reapliquei o link-fix preservando as mudancas externas **Suspeita**: existe algum deploy automatico / hot-reload no servidor de site que sobrescreve arquivos. Preciso investigar como funciona se for fazer patches durarem. --- ## Arquivos/scripts criados/modificados ### Scraper server (173.208.187.154) - `/opt/skymilhas/server.js` — gateway com dedup - `/opt/skymilhas/scrapers/tap/index.js` — EXE fix + RT + Camoufox migration (stopped) - `/opt/skymilhas/scrapers/kasada-solver/index.js` — novo solver (stopped) - `/opt/skymilhas/scrapers/proxy-bridge-tap.js` — novo bridge dedicado (online) - `/opt/skymilhas/scrapers/aadvantage/index.js` + `service.js` — CACHE_TTL 60min - `/opt/skymilhas/scrapers/azul/service.js` — CACHE_TTL 60min ### Site server (75.119.132.37) - `/var/www/skymilhas/app/Views/painel/index.php` — link fix multi-datas --- ## Metricas finais da sessao - **Duracao**: ~8h - **Corrigido**: 3 bugs (cache TTL, gateway dedup, link oficial multi-datas) - **Nao resolvido**: TAP Kasada block (requer cooldown servidor-side) - **Infra adicionada**: 2 PM2 services (proxy-bridge-tap online, kasada-solver stopped) - **Commits/edits**: ~15 - **Backups criados**: 4 (server.js, painel x 2, tap/index.js)