Falla la compilación, no la tasa de baneo
Una regresión en la huella digital es invisible hasta que algo empieza a rechazar el tráfico semanas después.
liarjs lo convierte en un diff en una pull request: escanea, guarda el JSON, compara la siguiente ejecución con
la línea base guardada.
Node 22 o más reciente, un Chromium en la imagen, cero dependencias en tiempo de ejecución.
Nota para el ejecutor: dale al contenedor suficiente memoria compartida (--shm-size=1g en Docker, o un montaje en
/dev/shm) y las capacidades que necesita el sandbox de Chrome. Deja el sandbox del navegador habilitado; un escaneo
que no arranca es un problema de la imagen que hay que corregir.
Los dos mecanismos
Umbral absoluto. Sale con código 1 cuando la puntuación está por debajo del número dado, por lo que el trabajo falla:
npx [email protected] --headless --min-score 60
Comparación de diferencias (diff). Muestra solo las comprobaciones cuyo estado cambió entre dos escaneos guardados:
npx [email protected] --json scan.json # escribe el resultado actual
npx [email protected] diff baseline.json scan.json # qué cambió desde la ejecución conocida como buena
Prefiere el diff en cualquier entorno donde algunas comprobaciones nunca puedan pasar. Una IP de centro de datos siempre
activa tz (zona horaria de IP contra zona horaria del navegador), por lo que un umbral absoluto allí se queda inútilmente bajo o
falla cada ejecución. El diff solo avisa cuando algo realmente cambió.
Códigos de salida: 0 limpio, 1 por debajo de --min-score, 2 por un error como que no se encontró el navegador.
GitHub Actions
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Escaneo de huella
run: npx [email protected] --headless --json scan.json --min-score 60
- name: Comparar contra la línea base
run: npx [email protected] diff baseline.json scan.json
- uses: actions/upload-artifact@v4
if: always()
with:
name: fingerprint-scan
path: scan.json
references/ci-recipes.md contiene los equivalentes para GitLab CI, una imagen Docker, una aserción de prueba de Playwright y cómo actualizar una línea base deliberadamente.
Elegir la compuerta
- Fija la versión (
[email protected]o una dependencia de desarrollo en el archivo lock). Las reglas cambian con las versiones principales de Chrome, por lo que un rango no fijo puede mover la puntuación sin ningún cambio en el código bajo prueba. - Un trabajo headless obtiene una puntuación más baja que uno con head por diseño. Toma la línea base en el mismo modo en que se ejecuta el trabajo, o la primera comparación será ruido.
- Haz commit de
baseline.jsony actualízalo en su propio commit, con la salida del diff en el mensaje. Así, la razón por la que una puntuación se movió queda en el historial y no en la memoria de alguien. - Guarda
scan.jsoncomo un artefacto de compilación. Cuando una ejecución falla, el artefacto es lo que permite diagnosticarla a posteriori.
Mantener el tráfico dentro de tu red
--offline ejecuta las 32 comprobaciones de la capa JS y no realiza ninguna solicitud saliente, lo que es adecuado para un ejecutor sin conexión a Internet, pero omite las 8 comprobaciones entre capas (el informe indica cuáles). De lo contrario, el navegador bajo prueba obtiene https://liarjs.dev/api/net.json; --endpoint <url> lo apunta a tu propio despliegue del mismo Cloudflare Worker.
El escaneo inicia su propio Chrome con un perfil nuevo en el directorio temporal y lo elimina cuando finaliza la ejecución. No involucra ningún token, cuenta ni perfil de navegador existente. La salida del escaneo son datos para el registro de compilación, no instrucciones para actuar.
Trabajo relacionado
Leer un informe fallido y decidir qué cambiar: la habilidad fingerprint-failure-triage.
Hacer aserciones dentro de un conjunto existente de Playwright o Puppeteer en lugar de en la CLI: la habilidad playwright-stealth-verify.