Inyeccion de historial: generar historial realista
Cómo inyectar historial de navegación realista en perfiles de navegador, con soporte para control de profundidad de historial personalizada.
Prefieres la documentación del producto mantenida?
Este artículo tiene una página equivalente en el centro de documentación. Usa los docs para el flujo canónico, las flags actuales y la referencia duradera.
Introducción
Cada navegador real acumula historial de navegación con el tiempo. El botón de retroceso tiene a dónde ir, history.length es mayor que uno, y el almacén interno de historial del navegador contiene entradas que abarcan días o semanas. Un navegador recién lanzado con cero historial destaca de uno con un rastro de uso natural. Para investigación de privacidad, pruebas y gestión de múltiples cuentas, el estado del historial de navegación es una parte importante de la identidad general del navegador.
BotBrowser proporciona el flag --bot-inject-random-history (tier PRO) para llenar la sesión del navegador con historial de navegación sintético al lanzar. El historial generado incluye entradas de sitios web populares con marcas de tiempo variadas, creando un rastro de uso realista que existe antes de que comience cualquier automatización. Este flag funciona junto con otras señales de identidad como --bot-cookies y --bot-bookmarks para crear sesiones de navegador que parecen naturalmente usadas desde el inicio.
Impacto en la privacidad: Por qué importa el historial de navegación
La propiedad history.length es accesible para cualquier JavaScript ejecutándose en una página. Una sesión de navegador nueva siempre comienza con history.length de 1 (la página actual). Un navegador con historial de navegación previo tiene un valor mayor. Este simple número revela si el navegador ha sido usado anteriormente en la sesión actual.
Más allá de history.length, el comportamiento general de un navegador con cero historial difiere de uno con estado acumulado. Los patrones de navegación, la disponibilidad de botones de avance/retroceso y el comportamiento de restauración de sesión dependen del estado del historial. Los investigadores de privacidad que estudian la huella del navegador necesitan controlar esta señal para crear entornos de prueba consistentes y reproducibles.
Para la gestión de múltiples cuentas, cada identidad debería parecer tener un historial de navegación independiente que refleje uso natural. Un navegador que siempre comienza con historial limpio parece una instalación nueva, que no es cómo la mayoría de los usuarios interactúan con sus navegadores. Añadir historial sintético crea una identidad más completa que es consistente con las otras señales que proporciona el perfil.
Antecedentes técnicos
Cómo funciona el historial de navegación en Chromium
Chromium mantiene el historial de navegación en una base de datos SQLite dentro del directorio de datos del usuario. Esta base de datos almacena:
- URLs visitadas: La URL completa de cada página visitada
- Marcas de tiempo de visitas: Cuándo se accedió a cada página, con precisión de microsegundos
- Conteos de visitas: Cuántas veces se ha visitado cada URL
- Tipos de transición: Cómo llegó el usuario a la página (escritura, clic en enlace, redirección, etc.)
- Referentes: Qué página condujo a la visita
La propiedad history.length en JavaScript refleja el número de entradas en el historial de sesión de la pestaña actual (la pila de retroceso/avance), no el historial de navegación total. Sin embargo, el estado general de la base de datos de historial afecta características como las sugerencias del omnibox (barra de direcciones), las fichas "Más visitados" en la página Nueva Pestaña y la interfaz de búsqueda de historial en chrome://history.
Historial de sesión vs. Historial global
Hay una distinción importante entre dos tipos de historial:
Historial de sesión es por pestaña y rastrea la navegación de retroceso/avance dentro de una sola pestaña. Esto es con lo que interactúan history.length, history.back() y history.forward(). Se reinicia cuando se cierra la pestaña.
Historial global es el registro de todas las URLs visitadas en todas las pestañas y sesiones a nivel del navegador. Se almacena en la base de datos de historial y persiste entre reinicios del navegador (a menos que el usuario lo borre).
El flag --bot-inject-random-history de BotBrowser llena la base de datos de historial global, dando al navegador un rastro de historial realista que aparece en chrome://history e influye en las sugerencias del omnibox.
Enfoques comunes y sus limitaciones
Navegación por script
La forma más directa de crear historial de navegación es visitar sitios web realmente antes de comenzar la tarea real. Esto significa navegar a una lista de URLs, esperar a que cada una cargue, y luego proceder con la automatización. Este enfoque funciona pero tiene inconvenientes significativos:
- Costo de tiempo: Cargar 20-50 páginas toma decenas de segundos a minutos, dependiendo de la complejidad de la página y la velocidad de red
- Sobrecarga de red: Cada carga de página genera tráfico de red real, consume ancho de banda del proxy y puede activar limitación de tasa
- Efectos secundarios: Las cargas de página reales ejecutan JavaScript, establecen cookies, disparan eventos de analíticas y pueden activar sistemas de rastreo antes de que comience la tarea real
- No determinista: Los tiempos de carga de página, redirecciones y contenido dinámico hacen que el proceso de generación de historial sea impredecible
Reutilización del directorio de datos de usuario
Reutilizar un --user-data-dir que ya contiene historial de una sesión anterior preserva el historial de navegación automáticamente. Sin embargo, esto también preserva todo otro estado (caché, cookies, almacenamiento local, service workers), sin darte control granular sobre qué señales preservar y cuáles reiniciar.
JavaScript history.pushState
La API history.pushState() puede añadir entradas al historial de sesión sin navegación, pero solo funciona dentro del mismo origen y solo afecta el historial de sesión de la pestaña actual. No añade entradas a la base de datos de historial de navegación global ni afecta las sugerencias del omnibox.
Enfoque de BotBrowser
El flag --bot-inject-random-history de BotBrowser genera historial de navegación sintético en el momento del lanzamiento, antes de que se cargue cualquier página. Este enfoque evita los problemas de rendimiento y efectos secundarios de la navegación por script mientras produce un estado de historial realista.
Tres modos de operación
El flag soporta tres modos (actualización de marzo 2026):
--bot-inject-random-historyo--bot-inject-random-history=true: Inyecta un número aleatorio de entradas de historial (2-7). Este es el comportamiento predeterminado.--bot-inject-random-history=15: Inyecta exactamente 15 entradas de historial. El valor resultante dehistory.lengthserá 16 (15 entradas inyectadas + la página actual). Puedes especificar cualquier entero positivo.--bot-inject-random-history=false: Desactiva la inyección de historial completamente.
La sintaxis ={number} te da control preciso sobre la profundidad del historial, lo cual es útil cuando se requiere un valor específico de history.length para mantener consistencia entre sesiones.
Qué se genera
El flag produce entradas de historial que incluyen:
- Sitios web populares: Entradas de dominios conocidos que un usuario típico visitaría
- Marcas de tiempo variadas: Las visitas se distribuyen a lo largo de un rango de tiempo realista, no agrupadas en un solo momento
- Dominios diversos: El historial generado abarca múltiples categorías (búsqueda, noticias, redes sociales, compras) para reflejar patrones de navegación naturales
- Conteos de visitas realistas: Algunas URLs aparecen múltiples veces, imitando el patrón de sitios frecuentemente visitados
Prellenado a nivel del motor
Las entradas de historial se insertan en la base de datos de historial del navegador durante la inicialización. Esto significa que están disponibles antes de que se cree cualquier contexto de navegador y antes de que se cargue cualquier página. El omnibox, chrome://history y la página Nueva Pestaña reflejan el historial prellenado inmediatamente.
Sin sobrecarga de red
Debido a que el historial se genera sintéticamente en lugar de a través de visitas reales a páginas, no hay tráfico de red, cargas de página ni ejecución de JavaScript. El prellenado de historial añade un tiempo de inicio insignificante comparado con la navegación por script.
Funciona con directorios de datos de usuario nuevos
El flag funciona con directorios --user-data-dir nuevos. No necesitas preparar ni sembrar el directorio de antemano. Cada lanzamiento con un directorio temporal nuevo y --bot-inject-random-history produce un nuevo conjunto de entradas de historial.
Configuración y uso
Uso básico en CLI
# Historial aleatorio (2-7 entradas)
chrome --bot-profile="/path/to/profile.enc" \
--bot-inject-random-history \
--user-data-dir="$(mktemp -d)"
# Cantidad exacta: inyectar 15 entradas (history.length = 16)
chrome --bot-profile="/path/to/profile.enc" \
--bot-inject-random-history=15 \
--user-data-dir="$(mktemp -d)"
Integración con Puppeteer
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
// Usa =N para cantidad exacta, u omite el valor para aleatorio (2-7)
'--bot-inject-random-history=10',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://example.com');
const historyLength = await page.evaluate(() => history.length);
console.log('History length:', historyLength); // 11 (10 + página actual)
await browser.close();
})();
Integración con Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
// Usa =N para cantidad exacta, u omite el valor para aleatorio (2-7)
'--bot-inject-random-history=20',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Configuración completa de identidad
Combina historial con marcadores, cookies y configuración de locale para una identidad completa:
chrome --bot-profile="/path/to/profile.enc" \
--bot-inject-random-history \
--bot-bookmarks='[{"title":"Google","type":"url","url":"https://www.google.com"},{"title":"YouTube","type":"url","url":"https://www.youtube.com"}]' \
--bot-cookies="@/path/to/cookies.json" \
--bot-always-active \
--bot-config-timezone=Europe/London \
--bot-config-locale=en-GB \
--bot-config-languages=en-GB,en
Verificación
Después de lanzar con --bot-inject-random-history, verifica que se haya rellenado el historial:
const page = await browser.newPage();
// Check session history length (should be > 1 after some navigation)
await page.goto('https://example.com');
const historyLength = await page.evaluate(() => history.length);
console.log('Session history length:', historyLength);
// Navigate to the history page to see global history
await page.goto('chrome://history');
// The history page should show entries from the synthetic history
Mejores prácticas
- Usa un user-data-dir nuevo por sesión. Cada sesión debería comenzar con su propio directorio de datos para evitar arrastrar estado no deseado:
--user-data-dir="$(mktemp -d)" - Combina con --bot-always-active. El flag
--bot-always-active(tier PRO, habilitado por defecto) mantiene las ventanas en estado activo, haciendo que la sesión parezca más como navegación activa. - Asocia el historial con la identidad. Cuando usas historial junto con flags de locale y zona horaria, la combinación crea una identidad coherente.
- Combina con --bot-bookmarks. Marcadores e historial juntos crean una identidad de navegador más completa que cualquiera por sí solo.
- No confíes solo en history.length para verificación. El historial de sesión y el historial global son diferentes. Comprueba
chrome://historypara una vista completa.
Preguntas frecuentes
¿Qué sitios web aparecen en el historial generado?
El historial generado incluye entradas de sitios web populares y conocidos de múltiples categorías. Las entradas específicas son variadas para crear un patrón de navegación realista.
¿El historial generado coincide con el locale del perfil?
La generación de historial produce un conjunto general de sitios web populares globales. Para historial específico de locale, las entradas generadas se complementan con la configuración de locale y zona horaria que proporcionas a través de otros flags.
¿Puedo controlar qué URLs aparecen en el historial?
El flag --bot-inject-random-history genera historial automáticamente. Para listas de URLs personalizadas, usarías navegación por script o gestión del directorio de datos de usuario en su lugar.
¿Esto afecta a history.length en JavaScript?
El flag llena el historial de navegación global (la base de datos de chrome://history). La propiedad history.length en JavaScript refleja el historial de sesión de la pestaña actual, que comienza en 1 para una nueva pestaña. Después de navegar a páginas, history.length se incrementa normalmente.
¿Qué tier se requiere para --bot-inject-random-history?
El flag --bot-inject-random-history está disponible en el tier PRO.
¿Puedo usar esto con Docker o despliegues de servidor headless?
Sí. El flag funciona en todos los entornos de despliegue, incluyendo contenedores Docker y servidores Linux headless. No se requiere pantalla ni GUI para la generación de historial.
¿Cómo interactúa esto con --user-data-dir?
Si proporcionas un directorio temporal nuevo, el historial se genera desde cero. Si reutilizas un directorio existente, el historial sintético se añade junto a cualquier historial existente en ese directorio.
¿Cómo controlo el valor exacto de history.length?
Usa la sintaxis ={number}. Por ejemplo, --bot-inject-random-history=15 inyecta exactamente 15 entradas de historial, por lo que después de navegar a una página, history.length será 16 (15 inyectadas + 1 página actual). Esto es útil cuando necesitas una profundidad de historial específica y reproducible en múltiples sesiones. Sin el sufijo ={number}, el flag inyecta una cantidad aleatoria entre 2 y 7.
Resumen
El flag --bot-inject-random-history añade historial de navegación realista a las sesiones de BotBrowser sin la sobrecarga y efectos secundarios de la navegación por script. Combinado con marcadores, cookies y configuración de locale, crea identidades de navegador con rastros de uso completos.
Para temas relacionados, consulta Gestión de cookies para persistencia de sesión, Prellenado de marcadores para configuración de marcadores, y Gestión de perfiles para organizar conjuntos de identidad.
Artículos Relacionados
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.