Cruce laravel.log + access-log.html + validation.log · 26-ago 14:05 → 29-ago 05:29
juancadfl (agente 2787, empresa 2434) corre desde
161.97.116.1 con User-Agent node-fetch/1.0 /
node. Cada hora, a las :14:59, dispara 2–3 login en paralelo
(de ahi el 1062) y cada 30 min barre ~189 hotels/search. El boton disabled
del frontend no aplica: ni Chrome ni un clic.
| Fuente | Que aporta | Valor |
|---|---|---|
| laravel.log 1062 | PK cervo_login | empresa 2434 · agente 2787 · cada hora :14:59 |
| access-log | Usuario autenticado | juancadfl · 20,943 req · 96.5% en :14/:44 |
| validation.log | IP + UA + body | 161.97.116.1 · node-fetch · username=juancadfl |
61 de 69 v1/authenticate en validation son este bot.
56 caen en el segundo exacto :14:59, casi siempre 2
por hora — el mismo par que explota el PK.
Body observado (password se redacta en el log, pero el 1062 ocurre despues de validar credenciales, o sea la clave es correcta):
{ username: "juancadfl", includeUserDetails: …, password: *** }
UA: node-fetch/1.0 (+https://github.com/bitinn/node-fetch) · IP fija 161.97.116.1 (datacenter, no residencial).
18,551 searches en access-log vs 0 hotels/search de este bot en validation a las :14/:44. El scraper manda bodies validos; el 1062 es el unico error de login.
Los 57 hotels/search de validation son otros
usuarios Chrome, horario laboral, bug del SPA:
children: 0 pero manda edades dummy
hab-0-nino-0/1/2: 1.
| Fase | Cuando | Endpoint | Evidencia |
|---|---|---|---|
| 1. Login paralelo | cada hora :14:59 | POST v1/authenticate ×2–3 | validation: node-fetch + 1062 laravel |
| 2. Barrido hoteles | cada 30 min :14 y :44 | ~189× POST v1/hotels/search | access-log · 75 req/s · no sale en validation |
| 3. Tours | mismo slot (a veces) | 15× v1/tours/search | access-log · 0 en validation |
| 4. Fichas / quote | horario laboral | GET hotels/{id}/details + POST quote | UA node · details sin query → 104 validaciones |
Fase 4: 104 GET a solo dos hoteles (/v1/hotels/9/details y
/2688/details) sin query ni body — por eso caen en
validation. Los quote Node iteran habitaciones /
clase_id (aloj 49, 254, 55…) como quien prueba combinaciones,
no un formulario humano.
Eje X: eventos en validation.log · Eje Y: IP · Login 100% desde 161.97.116.1
Source: validation.log 8,999 lineas. shouldRenderJsonWhen loguea cualquier excepcion JSON, no solo ValidationException — por eso el 1062 aparece ahi.
| Hecho | TMC 1040 | Scraper juancadfl |
|---|---|---|
| Ventana | 27-ago 17:01:30–17:09:09 (8 min) | 36 h+ cada :14:59 |
| Agente 2787 | 0 veces | Todas las horas |
| SQL | SELECT agentes / constantes | INSERT cervo_login + hotels/search |
| Cliente | 20 agentes distintos | node-fetch desde 161.97.116.1 |
El primer 1062 es 5 min despues de que TMC ya habia muerto. El job sigue 36 horas con TMC = 0. Si el search de 15 rps carga MySQL, es un efecto colateral del scraper, no al reves.
| Ruido en validation.log | Volumen | Notas |
|---|---|---|
| .env / wp-login / phpunit / .git | ~2,000 | Internet scanners, IP distintas |
| hotels/search Chrome laboral | 57 | Bug SPA: ninos=0 con edades dummy |
| kiu/flight-offers/booking | 117 | Agentes reales cotizando mal el POST |
| notifications / me / purchases | SPA | No es juancadfl (el bot casi no los usa) |
juancadfl.log va a mostrar el body de cada
hotels/search (hoy no esta en validation porque pasan). Mientras tanto: el
login ya esta confirmado. Rate-limit o bloquear 161.97.116.1
/ UA node-fetch / cuenta 2787 corta el 93% de hotels/search
de la plataforma. Arreglar PK de cervo_login y no re-loguear cada hora.