Informe: scraper juancadfl (agente 2787)

Cruce laravel.log + access-log.html + validation.log · 26-ago 14:05 → 29-ago 05:29

Script Node.js en un VPS, no un agente en el SPA 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.
20,943
Requests access-log
93%
De todo hotels/search
61
Login fallidos (1062) en validation
node-fetch
User-Agent del login

Identidad cruzada

FuenteQue aportaValor
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

Payload del login (validation.log)

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).

Los hotels/search casi no fallan validacion

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.

Que hace el job

FaseCuandoEndpointEvidencia
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.

IPs del scraper

161.97.116.1 (VPS)
149
38.41.6.206
21
190.142.101.179
18
170.81.144.103
16
otras 38.41.6.x
4

Eje X: eventos en validation.log · Eje Y: IP · Login 100% desde 161.97.116.1

validation.log no es solo validacion

Errores API / app — 3,073
Scanners / probes — 2,007
UA vacio (scan) — 2,006
Otros hosts — 1,705
juancadfl Node — 208

Source: validation.log 8,999 lineas. shouldRenderJsonWhen loguea cualquier excepcion JSON, no solo ValidationException — por eso el 1062 aparece ahi.


Too many connections: sin relacion

HechoTMC 1040Scraper 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.

Lo que NO es este usuario

Ruido en validation.logVolumenNotas
.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)
Acciones El canal temporal 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.
2787 = juancadfl 161.97.116.1 node-fetch/1.0 2× authenticate :14:59 laravel.log · access-log.html · validation.log