La mayor parte de nuestro tráfico de búsqueda nunca fue humano
Por Oleg Sidorkin, CTO de Cinevva
Nuestro tráfico de búsqueda orgánica está creciendo, y lleva haciéndolo todo el año. Esa parte es real. Pero a principios de julio la línea se disparó de una forma que no se correspondía con nada que hubiéramos publicado, y un salto sin una causa detrás merece una tarde de investigación.
Investigamos y encontramos una flota de Chrome sin interfaz que llegaba con un referente de Google.
La forma importa más que el pico
Durante la primavera, la proporción de sesiones falsas osciló entre un tercio y dos tercios. Es, más o menos, el ruido de fondo con el que convive cualquier sitio web público.
A finales de junio empezó a subir y siguió haciéndolo. Desde la primera semana de abril hasta mediados de julio, las sesiones reales se multiplicaron aproximadamente por 5,5. Las automatizadas, por 18,6.
Por qué era difícil detectarlo
Vigilamos estas cifras de cerca, y todo lo que se mueve sin explicación acaba siendo objeto de una consulta. La razón por la que este caso exigió una investigación de verdad es que nuestras filas de sesiones no podían distinguir realmente entre ambas poblaciones.
La interacción se infería a partir de la marca de tiempo last_activity_at de cada sesión. En una visita de una sola página, ese campo no cambia después de la primera escritura.
Por tanto, un bot que carga una página y se marcha escribe la misma fila que una persona que llega a una guía y la lee durante cinco minutos. La tasa de rebote, el tiempo en el sitio, la interacción: todo se calculaba a partir de un campo que no contiene información alguna sobre las sesiones de una sola página. Esto no es raro. Es lo habitual en la mayoría de los sistemas de analítica desarrollados internamente, y sería lo primero que comprobaría en el tuyo.
La solución fue dejar de inferir datos a partir de la fila de la sesión y consultar en su lugar la baliza de salida, que informa del tiempo real en la página y de la profundidad de desplazamiento desde el cliente. En cuanto usamos pruebas en vez de inferencias, ambos grupos se separaron inmediatamente.
| Marcados | Todos los demás | |
|---|---|---|
| Se desplazaron por la página | 1.8% | 56.5% |
| Pertenecen a una cuenta con sesión iniciada | 0.05% | 29% |
Esa diferencia es la prueba de que el clasificador describe algo real, en lugar de etiquetar como robots a visitantes poco activos.
Qué delata realmente a una flota
El agente de usuario es el peor lugar donde buscar, porque es lo más barato de cambiar. La mejor señal resultó ser la tarjeta gráfica.
Los navegadores sin interfaz de un centro de datos no tienen GPU, así que recurren al renderizado por software, y WebGL devuelve la cadena del renderizador sin necesidad de insistir. SwiftShader, llvmpipe, Mesa OffScreen. Los visitantes reales tienen GPU reales.
| Señal | Qué detecta | Porcentaje de nuestras pruebas |
|---|---|---|
| Renderizador de GPU por software | Ausencia de tarjeta gráfica física | 90.5% |
| ASN de centro de datos o proxy | Origen de red alquilado | 58% |
navigator.webdriver | Indicador de automatización activado | 10.4% |
El origen de red ayudó menos de lo que cabría esperar. Aproximadamente cuatro de cada diez de estas sesiones salen a través de proveedores de internet residenciales reales. Los proxies residenciales son baratos hoy en día, y cualquier regla que dé por hecho que los bots proceden de AWS dejará escapar a casi la mitad.
El resto se detectó gracias a imposibilidades físicas en los datos que el cliente comunicaba sobre sí mismo. Un agente de usuario de Chromium siempre termina con un token de Safari que coincide con su token de AppleWebKit, fijado en 537.36 desde 2013, pero esta flota emitía errores como Safari/537.35 y .38. Un agente de usuario de teléfono afirmaba tener una pantalla de 1600x1200. Otra variante declaraba un cuadrado perfecto de 1600x1600. Una afirmaba tener 1200x3000: un monitor de escritorio en vertical con una relación de 2,5:1 que nadie fabrica.
Cada uno de esos casos corresponde a la configuración de un emulador, y ninguno aparece a menos que lo busques.
La flota se adaptaba cada vez que la marcábamos
El primer perfil era Linux Chrome, con un referente de Google, America/New_York y 1920x1080. Escribimos una regla.
Regresó una variante con 800x600 y UTC. Ampliamos la regla.
Después apareció un grupo chino que usaba direcciones residenciales de China Mobile y Unicom con versiones fijas del navegador, entre ellas Chrome 99 de marzo de 2022 y la configuración predeterminada de emulación de dispositivos de Chrome DevTools: un Nexus 5 de 2015 con WeChat de 2018. Esas sesiones salen a través de proveedores de internet residenciales, así que todas nuestras reglas de red eran inútiles contra ellas.
Luego apareció una variante estadounidense en Cox y Comcast con un agente de usuario Chrome 146 actual y totalmente verosímil a 1920x1080. No hay nada incorrecto en esa huella y, examinando las sesiones de una en una, es indistinguible de un visitante real.
Así que el último detector que construimos no examina sesiones individuales. Agrupa las 48 horas anteriores por país, agente de usuario, tamaño de pantalla y fuente de tráfico, y luego busca grupos de al menos 20 sesiones anónimas en los que el 95 % o más nunca lee durante tres segundos ni se desplaza un solo píxel.
Los visitantes reales no se agrupan de forma tan uniforme. Veinte desconocidos con un navegador y una resolución idénticos que se marchan sin leer nada son una máquina con veinte direcciones. Cualquier integrante del grupo que sí haya leído o se haya desplazado sigue considerándose humano, y las sesiones vinculadas a una cuenta real nunca se marcan.
La auditoría también encontró el error contrario
Mientras eliminábamos a los visitantes falsos de las cifras, encontramos visitantes reales que habíamos estado descartando.
Cuando dispusimos de tiempos de lectura reales, descubrimos que el 34,2 % de lo que habíamos contabilizado como rebotes humanos eran personas que habían leído durante 30 segundos o más, o que se habían desplazado más allá de la mitad de la página. Un tercio de esos «fracasos» eran, en realidad, contenido que estaba funcionando. Los lectores chinos que llegaban desde Bing pasaban cinco minutos en una sola guía y quedaban registrados como rebotes.
Las cifras estaban equivocadas en ambos sentidos a la vez, y ambos errores apuntaban en la misma dirección incorrecta. Juntos te hacen creer que tu tráfico es grande y superficial cuando, en realidad, es menor y más profundo.
El canal por el que pagamos era el fiable
Últimos 30 días. El tráfico orgánico de Google representó el 63,7 % de todas las sesiones durante ese periodo.
Todos los instintos relacionados con el crecimiento apuntan en la dirección contraria. Das por hecho que el fraude está en el tráfico de pago y que el tráfico orgánico es el que te has ganado. En nuestro caso era al revés.
Si hubiéramos reasignado el presupuesto basándonos en las cifras de julio, habríamos retirado dinero del canal que realmente aportaba personas para invertirlo en producir más contenido para un scraper.
Por qué merece una tarde
La cifra en sí no es más que una cifra. Pero de ella dependen las páginas que escribiremos a continuación, el idioma en el que invertiremos, si una campaña sobrevive a la revisión y si el trimestre pareció lo bastante bueno como para seguir haciendo lo mismo. Todo eso puede verse alterado por un desconocido con un conjunto barato de proxies.
Si gestionas un sitio pequeño, examina las cadenas del renderizador de GPU y las balizas de salida antes de confiar en tu propia curva de crecimiento.
Y considera nuestras cifras como un mínimo, no como un veredicto. Aquí, «humano» solo significa «aún no detectado», las reglas se escribieron a partir de las huellas que observamos por casualidad y seguimos sin saber quién opera esta flota ni qué quiere de un sitio de creación de juegos.
Contenido relacionado:
- La trampa de los costes fijos — otra cifra que resultó no tener ningún amortiguador detrás
- Por qué construimos nuestro propio motor WebGPU — el mismo argumento sobre controlar la capa de la que dependes
- Guías — el contenido que esta auditoría debía medir