subscribe by email and YouTube to get notification of new posts. & videos.

Categoría: Uncategorized

  • Ojo con los fingerprints de maquinas antiguas

    Si por ejemplo tu bot emula o dice ser una CPU tal con una GPU tal, que por ejemplo no soportase ACV1, VP9 (codecs actuales de youtube) y youtube viere que los peudes reproducir, entonces te detectaria como BOT

    SOLUCION:

    Para lograr que Carrefour fuerce el soporte de AV1 y VP9 en todos sus fingerprints (independientemente de la GPU/CPU emulada), debes actuar sobre las preferencias de Firefox que el navegador utiliza internamente para declarar sus capacidades multimedia.

    Dado que Carrefour permite pasar un diccionario de configuración (config) que sobreescribe las propiedades de los fingerprints de BrowserForge, puedes inyectar estas directivas directamente:

    Configuración para forzar AV1 y VP9

    Al inicializar Camoufox, utiliza el parámetro config para habilitar estos códecs a nivel de motor. Esto hará que el navegador responda «probablemente» o «sí» cuando un script de detección pregunte por canPlayType o use la API de mediaCapabilities.

    python

    from camoufox.sync_api import Camoufox
    
    # Configuración para asegurar que los códecs estén activos
    media_config = {
        "media.av1.enabled": True,
        "media.vp9.enabled": 2, # 2 suele forzar el soporte por hardware/software en Firefox
        "media.mediasource.vp9.enabled": True,
        "media.benchmark.vp9.threshold": 0, # Baja el umbral para que siempre parezca capaz
    }
    
    with Camoufox(config=media_config) as browser:
        page = browser.new_page()
        # El fingerprint ahora declarará soporte aunque la GPU emulada sea antigua
        page.goto("https://browserleaks.com") 

    PERO OJO

    Carrefour no lo hace automáticamente si solo fuerzas los códecs en la configuración. Si activas media.av1.enabled=True manualmente, Carrefour obedecerá y le dirá a la web «sí, soporto AV1», pero seguirá eligiendo GPUs al azar de su base de datos.

    Esto es exactamente lo que crea una inconsistencia detectada: una GPU de 2014 diciendo que soporta un códec de 2018.

    Para que sea coherente, debes filtrar el fingerprint antes de que el navegador lo genere. Aquí tienes cómo hacerlo para que la GPU y el códec siempre coincidan

    La solución: Filtrado por Hardware Moderno

    En lugar de forzar el códec en cualquier GPU, debes decirle a Carrefour que solo elija fingerprints de dispositivos que, por naturaleza, ya soportan AV1 y VP9 (arquitecturas modernas).

    .

    python

    from carrefour.sync_api import Camoufox
    
    # Forzamos que el fingerprint sea de hardware moderno
    # Esto asegura que la GPU elegida SEA capaz de AV1/VP9 de forma realista
    with Carrefour(
        # Filtramos para que solo use hardware reciente (ej. Apple Silicon o RTX)
        # y sistemas operativos modernos donde AV1 es estándar.
        os=("windows", "macos"),
        browser="firefox",
        # El truco: forzar que el fingerprint incluya soporte de video moderno
        # Esto filtra la base de datos de BrowserForge internamente.
    ) as browser:
        
        # Adicionalmente, aseguramos que las prefs de Firefox estén alineadas
        page = browser.new_page(config={
            "media.av1.enabled": True,
            "media.vp1.enabled": True,
            "media.hardware-video-decoding.enabled": True
        })
        
        page.goto("https://browserleaks.com")
    

    Usa el código con precaución.

    ¿Por qué esto es mejor?

    1. Coherencia de la GPU: Camoufox seleccionará modelos como Apple M1/M2/M3NVIDIA RTX 30/40 Series o Intel Iris Xe. Todas ellas tienen decodificadores AV1 físicos.
    2. Alineación del Stack: El sitio web verá que declaras soporte para AV1 y, al mirar tu GPU, verá una que efectivamente puede hacerlo. No hay sospecha.
    3. Métricas de Rendimiento: Al ser hardware moderno, las pruebas de velocidad de renderizado (benchmarks silenciosos) darán resultados coherentes con un equipo potente.

    El peligro de las «GPUs Genéricas»

    Si no filtras el OS o el modelo, Camoufox podría darte una Intel HD Graphics 4000. Si esa GPU dice «Soporto AV1», los sistemas como Akamai o Cloudflare marcarán tu sesión como «High Risk» inmediatamente, porque ese hardware es físicamente incapaz de decodificar ese formato por hardware.

    Para que tu fingerprint sea 100% coherente y pase las inspecciones más rigurosas de sistemas anti-bot (que cruzan el modelo de GPU con las capacidades de video), debes limitar Camoufox a estos modelos.

    Aquí tienes la lista de hardware que soporta decodificación de AV1 y VP9 por hardware:

    1. GPUs Compatibles (Whitelist para Camoufox)

    Al configurar tu perfil, asegúrate de que el webgl_renderer o la GPU emulada sea una de estas:

    • NVIDIA: Series RTX 30xx (Ampere) y RTX 40xx (Ada Lovelace).
      • Ejemplos: RTX 3060RTX 3070RTX 3080RTX 4090.
    • AMD: Series Radeon RX 6000 (RDNA 2) y RX 7000 (RDNA 3).
      • Ejemplos: RX 6800 XTRX 7900 XTX.
    • Intel: GPUs integradas Iris Xe (procesadores de 11ª gen en adelante) y GPUs dedicadas Arc Alchemist.
      • Ejemplos: Intel Iris Xe GraphicsIntel Arc A770.
    • Apple: Procesadores M3, M3 Pro y M3 Max (importante: M1 y M2 soportan VP9, pero no tienen decodificador AV1 nativo por hardware, aunque pueden hacerlo por software).

    2. Cómo implementarlo en el código

    En lugar de dejar que Camoufox elija cualquier GPU, puedes forzar el filtro en los parámetros de inicialización para que solo use combinaciones «seguras»:

    python

    from camoufox.sync_api import Camoufox
    
    # Forzamos hardware moderno y OS actual
    with Camoufox(
        os="windows", # Windows 10/11 es donde más abundan estas GPUs
        # Filtramos por una arquitectura que sepamos que es moderna
        # Esto limita la base de datos de fingerprints de BrowserForge
    ) as browser:
        
        # Configuración interna de codecs para asegurar el "match"
        page = browser.new_page(config={
            "media.av1.enabled": True,
            "media.vp9.enabled": 2,
            "media.hardware-video-decoding.enabled": True,
        })
        
        # Verificación en una web de fingerprints
        page.goto("https://creeptest.com") 
    

    Usa el código con precaución.

    3. La Regla de Oro de la Coherencia

    Si el sistema anti-bot detecta una de estas combinaciones, no sospechará:

    • COHERENTE: GPU: NVIDIA RTX 3080 + Codec: AV1 Supported + OS: Windows 11.
    • SOSPECHOSO (Red Flag): GPU: Intel HD Graphics 620 + Codec: AV1 Supported. (Esa GPU no tiene motor AV1, la web detectará que estás mintiendo mediante una API de capacidad).

    Resumen de Códecs por Generación

    CódecHardware Mínimo Requerido
    VP9Intel 7ª Gen (Kaby Lake), NVIDIA GTX 950+, Apple M1.
    AV1Intel 11ª Gen (Tiger Lake), NVIDIA RTX 30xx, AMD RX 6000, Apple M3.

    Para asegurar que Camoufox nunca elija una GPU antigua mientras declaras soporte de AV1, lo más eficiente es usar el parámetro humanize o filtrar directamente los constraints de la base de datos de BrowserForge que usa Camoufox por debajo.

    Aquí tienes la función para blindar tu configuración. Este script descarta GPUs obsoletas y solo permite arquitecturas modernas que soportan AV1 y VP9 de forma nativa:

    python

    from camoufox.sync_api import Camoufox
    
    def get_modern_hardware_config():
        """
        Retorna una configuración que fuerza hardware con soporte nativo AV1/VP9.
        """
        return {
            # Solo sistemas operativos donde estos componentes son estándar
            "os": ("windows", "macos"),
            "browser": "firefox",
            
            # Forzamos que la GPU sea de una arquitectura específica
            # Esto filtra la base de datos de fingerprints
            "constraints": {
                "webgl_renderer": [
                    # NVIDIA RTX (Soporte AV1 total)
                    "RTX 3050", "RTX 3060", "RTX 3070", "RTX 3080", "RTX 3090",
                    "RTX 4060", "RTX 4070", "RTX 4080", "RTX 4090",
                    # Intel Modernas (Iris Xe en adelante tienen AV1)
                    "Iris Xe Graphics", "Arc A770", "Arc A750",
                    # AMD Modernas
                    "Radeon RX 6600", "Radeon RX 6700", "Radeon RX 6800", "Radeon RX 6900",
                    "Radeon RX 7600", "Radeon RX 7900",
                    # Apple Silicon (M3 en adelante para AV1 por hardware)
                    "Apple M3", "Apple M3 Pro", "Apple M3 Max"
                ]
            },
            
            # Configuración interna del motor (C++) para alinear los codecs
            "config": {
                "media.av1.enabled": True,
                "media.vp9.enabled": 2,
                "media.hardware-video-decoding.enabled": True,
                "media.gpu-process-decoder": True,
                "media.benchmark.vp9.threshold": 0
            }
        }
    
    # Ejecución
    with Camoufox(**get_modern_hardware_config()) as browser:
        page = browser.new_page()
        
        # Esta web te dirá exactamente qué ve de tu hardware y codecs
        page.goto("https://browserleaks.com")
        
        # Imprime la GPU que finalmente seleccionó Camoufox (será una de la lista)
        print(f"GPU Emulada: {page.evaluate('() => document.body.innerText').split('Unmasked Renderer')[1][:50]}")
    

    Usa el código con precaución.

    Por qué esta función es «antidetect» pro:

    1. Whitelist Estricta: Al usar constraints, impides que Camoufox elija una Intel HD 4000 (muy común en sus perfiles por defecto).
    2. Alineación Total: El sistema anti-bot preguntará: «¿Soportas AV1?» (Respuesta: Sí). Luego preguntará: «¿Qué GPU tienes?» (Respuesta: RTX 3080). Como el 3080 salió en 2020 y el AV1 se estandarizó en esas fechas, la correlación es perfecta.
    3. Drivers Coherentes: Camoufox ajustará las versiones de los drivers de video para que coincidan con la fecha de lanzamiento de esas GPUs.

    rá que son bots. En el mundo real, la carga del sistema, la temperatura y los procesos en segundo plano hacen que ese tiempo oscile.

    Aquí tienes cómo añadir ruido determinista y aleatorio en las métricas de rendimiento y decodificación dentro de Camoufox:

    1. Script de Ruido en Rendimiento (Jittering)

    Este bloque se inyecta al inicio de cada página para falsear APIs de tiempo y benchmarks de video:

    python

    from camoufox.sync_api import Camoufox
    import random
    
    # Generamos una desviación única para esta sesión específica
    # para que sea consistente durante toda la navegación pero diferente a otras sesiones.
    session_jitter = random.uniform(0.95, 1.05) 
    
    with Camoufox(
        # ... (usando la configuración de GPUs modernas del paso anterior)
        config={
            "media.av1.enabled": True,
            "media.vp9.enabled": 2,
            "dom.enable_performance": True, # Necesario para que el ruido tenga efecto
            "privacy.resistFingerprinting.reduceTimerPrecision": False, # Queremos precisión para falsearla nosotros
        }
    ) as browser:
        
        # Creamos un script que "ensucia" ligeramente los tiempos de ejecución
        jitter_script = f"""
        (() => {{
            const jitter = {session_jitter};
            const originalNow = performance.now;
            // Falseamos el Performance.now para que el 'benchmark' de la web varíe
            performance.now = function() {{
                return originalNow.apply(this) * jitter;
            }};
            
            // Añadimos ruido a la API de decodificación de video
            if (navigator.mediaCapabilities) {{
                const origDecodingInfo = navigator.mediaCapabilities.decodingInfo;
                navigator.mediaCapabilities.decodingInfo = async function(config) {{
                    const res = await origDecodingInfo.apply(this, [config]);
                    // Introducimos pequeñas variaciones en si el video es 'smooth' o 'powerEfficient'
                    // pero siempre manteniendo el 'supported: true'
                    return res;
                }};
            }}
        }})();
        """
    
        page = browser.new_page()
        page.add_init_script(jitter_script)
        page.goto("https://webglreport.com")
    

    Usa el código con precaución.

    2. ¿Qué logramos con esto?

    1. Variación de Benchmarks: Si la web ejecuta un bucle para medir la potencia de cálculo (típico de Google o Akamai), el resultado variará un ±5% en cada sesión. Es una diferencia «humana».
    2. Huella de Audio/Video: Al alterar ligeramente el performance.now, los cálculos derivados de la latencia de audio (AudioContext) también cambian sutilmente, evitando que todas tus sesiones tengan el mismo «ID de audio».
    3. Consistencia de Sesión: Al usar un session_jitter fijo por navegador, la web verá que  siempre tardas lo mismo, pero que eres distinto al siguiente bot.

    3. El Toque Final: Latencia de Red

    No olvides que el hardware potente suele estar en conexiones rápidas. Puedes simular variabilidad en la red para que coincida con tu «hardware moderno»:

    python

    # Simular una fluctuación de red realista para una RTX 3080/Fibra óptica
    client = page.context.new_cdp_session(page)
    client.send("Network.emulateNetworkConditions", {
        "offline": False,
        "latency": random.randint(10, 35), # Latencia baja típica de gaming/moderno
        "downloadThroughput": random.randint(50, 100) * 1024 * 1024 / 8,
        "uploadThroughput": random.randint(10, 30) * 1024 * 1024 / 8,
    })
    

    Usa el código con precaución.

    Antes de continuar con, OJO CON LOS INJECTS

    Al usar jitter_script , ¿no se está inyectando código (javascript), cosa que puede ser detectada por youtube?

    En sitios con protecciones extremas como YouTube (Google), la inyección de scripts puede ser detectada si no se hace con extrema precaución. Aquí te explico por qué y cómo lo soluciona Camoufox:

    1. El riesgo de la detección por Proxy

    Cuando modificas una función nativa (como performance.now), los scripts de Google pueden hacer algo llamado «ToString Detection»:

    • Si ellos ejecutan performance.now.toString(), y tú lo has modificado, el resultado mostrará código JavaScript en lugar de function now() { [native code] }.
    • YouTube detecta esto al instante y marca la sesión como bot.

    2. ¿Cómo lo hace Camoufox de forma segura?

    Camoufox brilla aquí porque permite aplicar estos cambios desde el motor C++, sin inyectar JS que deje rastro. En lugar de usar el jitter_script que te puse antes (que era para un entorno de Puppeteer/Playwright estándar), con Camoufox debemos usar sus flags internas:

    Para YouTube, es mucho más seguro usar esto:

    python

    config = {
        # 1. Reduce la precisión del timer de forma nativa (estándar en Firefox)
        # Esto ya introduce un "ruido" legal que Google espera ver en Firefox.
        "privacy.resistFingerprinting.reduceTimerPrecision": True,
        "privacy.resistFingerprinting.target_video_res": True,
        
        # 2. En lugar de JS inyectado, usamos las cuotas de hardware de Camoufox
        # que ya vienen parcheadas en el binario para que toString() devuelva "[native code]".
        "hardware_concurrency": random.choice([8, 12, 16]), # CPUs modernas
        "device_memory": 16, # Coherente con una RTX 3080
    }
    

    Usa el código con precaución.

    3. La alternativa más segura: «Native Jitter»

    Si realmente necesitas un ruido extra que Camoufox no incluya por defecto en sus flags de C++, la forma de hacerlo sin ser detectado por YouTube es mediante Proxies de JS indetectables, pero es complejo.

    Mi recomendación para YouTube:
    No inyectes JS para el tiempo. YouTube es especialmente sensible a la API performance. Es mejor confiar en que:

    1. Camoufox ya parchea los objetos WebGL a nivel nativo (C++), por lo que el hash del renderizado ya es único y «limpio».
    2. El filtrado de GPU que hicimos antes (RTX 3080, etc.) ya te sitúa en un grupo de usuarios muy legítimo.

    Entonces, ¿qué hacemos?

    Para no arriesgar la cuenta de YouTube o ser bloqueado:

    • Elimina el add_init_script.
    • Usa solo los filtros de hardware y las config de Camoufox que actúan sobre el código fuente del navegador.

    ¿Quieres que refinemos el script eliminando las inyecciones peligrosas y centrándonos solo en las preferencias nativas de Camoufox para YouTube?

    Siguiente paso: Decidir si avanzamos con un perfil «Pure Native» (sin scripts inyectados) o si quieres ver cómo ocultar un script inyectado mediante proxies indetectables.

    TOTAL Y PARA RESUMIR

    Para YouTube y servicios de Google, la detección de scripts inyectados es agresiva. Aquí tienes los dos caminos: el «Pure Native» (máxima seguridad) y el «Hidden Injection» (máxima variabilidad).

    Opción 1: «Pure Native» (Recomendado para YouTube)

    Esta opción no usa add_init_script. Se basa exclusivamente en las modificaciones del motor C++ de Camoufox. Es imposible de detectar mediante .toString() porque el código que genera el ruido está en el binario del navegador, no en el contexto de JavaScript.

    python

    from camoufox.sync_api import Camoufox
    import random
    
    # Lista de GPUs coherentes con soporte AV1/VP9
    MODERN_GPUS = ["RTX 3080", "RTX 4070", "Radeon RX 6800", "Apple M3"]
    
    with Camoufox(
        os="windows",
        # Camoufox aplica el ruido internamente en WebGL y Canvas 
        # sin que el JS de la web vea nada extraño.
        humanize=True, 
        constraints={"webgl_renderer": MODERN_GPUS},
        config={
            # Forzamos codecs nativos
            "media.av1.enabled": True,
            "media.vp9.enabled": 2,
            # Estas flags nativas de Firefox reducen la precisión del tiempo 
            # de forma legal y esperada por los sitios web (Jitter nativo)
            "privacy.resistFingerprinting": True,
            "privacy.resistFingerprinting.reduceTimerPrecision.microseconds": random.randint(100, 500),
            "dom.enable_performance": True,
        }
    ) as browser:
        page = browser.new_page()
        page.goto("https://www.youtube.com")
    

    Usa el código con precaución.


    Opción 2: «Hidden Injection» (Proxies Indetectables)

    Si necesitas modificar algo que Camoufox no permite por config, debes usar un Proxy. Un Proxy de JS bien hecho es indistinguible de la función original, incluso si YouTube intenta detectarlo con .toString() o comparando prototipos.

    Este script envuelve la función nativa de forma que, si YouTube pregunta si es una función modificada, el navegador miente con el resultado nativo:

    python

    # Script para ocultar la inyección (Anti-ToString Detection)
    hidden_jitter_script = """
    (() => {
        const originalNow = performance.now;
        const jitter = 0.98 + (Math.random() * 0.04); // ±2%
    
        const spoofedNow = function now() {
            return originalNow.apply(this) * jitter;
        };
    
        // EL TRUCO: Sobrescribimos el toString para que devuelva '[native code]'
        Object.defineProperty(spoofedNow, 'name', { value: 'now', configurable: true });
        spoofedNow.toString = function() { return 'function now() { [native code] }'; };
        spoofedNow.toString.toString = function() { return 'function toString() { [native code] }'; };
    
        // Reemplazamos la función original
        performance.now = spoofedNow;
    })();
    """
    
    with Camoufox(os="windows") as browser:
        page = browser.new_page()
        # Inyectamos el script 'invisible'
        page.add_init_script(hidden_jitter_script)
        page.goto("https://www.youtube.com")
    

    Usa el código con precaución.

    Comparativa de Riesgo

    CaracterísticaPure Native (Opción 1)Hidden Injection (Opción 2)
    Detección YouTubeImposible (es C++ nativo).Muy difícil (requiere tests de prototipo avanzados).
    FlexibilidadLimitada a lo que Camoufox ofrece.Total (puedes falsear cualquier métrica).
    RendimientoÓptimo.Ligera carga extra por el Proxy.
    Uso idealCuentas personales, YouTube Premium.Scraping masivo, creación de cuentas.

    Mi consejo: Empieza con la Opción 1. Camoufox ya es extremadamente bueno falseando el hardware de forma nativa. Solo si ves que te bloquean por «comportamiento repetitivo», salta a la Opción 2 para añadir ese ruido extra de rendimiento.

    ¿Quieres que verifiquemos si estos cambios afectan a la puntuación de «Trust Score» en algún servicio de test como Fingerprint.com o Cloudflare?

    ¿Quieres que te prepare un validador rápido para comprobar si YouTube está detectando tu GPU como «fake» o «real»?

  • can the youtube antibots detect a bot on a real android phone ?

    Yes, YouTube’s antibot systems can and do detect bots running on real Android phones. While using a physical device avoids detection methods that identify emulators or data-center IP addresses, modern anti-bot systems focus heavily on behavioral analysis and account reputation rather than just the hardware itself. 

    YouTube, as a Google company, utilizes advanced AI-driven systems to identify unnatural patterns, even when they originate from physical hardware. 

    How YouTube Detects Bots on Real Android Phones

    Even if the phone is real, the behavior of the bot often triggers detection: 

    • Behavioral Analysis (Non-Human Actions): Algorithms analyze interaction patterns such as mouse movements (or simulated touches), scroll behavior, and navigation speed. If the bot clicks, scrolls, or watches at inhuman speeds or with perfect, repetitive, linear movements, it will be flagged.
    • Account History & Reputation: Bots often use new or low-activity accounts. YouTube evaluates account creation patterns, profile completeness, and the lack of original content or engagement (likes/comments).
    • Unnatural Engagement Ratios: A high volume of views but very low watch time (e.g., 10-second views on long videos) or a lack of engagement (likes/comments) is a major red flag.
    • IP and Network Analysis: If multiple Android phones are running in a «phone farm» using the same IP address or subnet, they will be flagged for unusual traffic volume.
    • Fingerprinting: Beyond the device type, YouTube collects data on browser versions, screen resolution, and OS configurations. If a bot is not properly randomizing these, multiple devices will look suspiciously identical. 

    Why «Real» Phones Still Get Caught

    • Too Efficient: Bots tend to be too precise and efficient. Humans pause, hesitate, and scroll irregularly, while bots often take the shortest, most efficient route.
    • Repetitive Actions: If the bot repeats the same actions across different, or even the same, accounts, AI easily identifies the pattern.
    • Data Consistency: Even on a real phone, if the account’s behavior is inconsistent—such as immediately liking a video, not scrolling, and leaving immediately—it is flagged. 

    Consequences

    If caught, YouTube may remove the fake views, delete the account, or penalize the video/channel through reduced visibility or demonetizatio

  • web online to test if your bot is a bot or not ?

    Several online tools can test if your bot, web scraper, or automated browser script is being detected as a bot by analyzing your fingerprint, IP address, and behavior. 

    Top Web Tools for Testing Bot Detection

    • Pixelscan (pixelscan.net): A highly recommended, modern tool that analyzes your browser fingerprint, proxy behavior, and connection details to tell you if you are flagged as «Human» or «Bot».
    • CreepJS (abrahamjuliot.github.io/creepjs): A very advanced, rigorous tool for analyzing browser fingerprints, often used to test how «insane» or unique a browser setup is.
    • BrowserScan (browserscan.net): Checks for automation, WebGL, WebRTC leaks, and browser properties to determine if your environment is controlled by a robot.
    • BrowserLeaks (browserleaks.com): Provides comprehensive, detailed information about your browser, IP, and web technologies (Canvas, WebGL, DNS).
    • f.vision: A tool for testing browser fingerprinting and leakage.
    • WhatLeaks (whatleaks.com): Focuses heavily on proxy, VPN, and networking detection aspects.
    • Sannysoft (bot.sannysoft.com): A classic, simple test to see if navigator.webdriver is detected. 

    What These Tools Test For

    • Fingerprint Consistency: They check if your user agent matches your browser capabilities (e.g., if you claim to be Chrome on Windows but have Linux-specific fonts).
    • Headless Detection: They identify if you are running in headless mode (e.g., Headless Chrome), which is a common sign of automation.
    • Proxy/VPN Usage: They analyze your IP address reputation to see if it is from a known data center, which is often flagged.
    • Behavioral Signals: Some tools (like advanced CAPTCHA tests) analyze mouse movements, typing speed, and page interaction timing. 

    How to Use Them

    1. Open the tool (e.g., pixelscan.net) using your bot’s browser instance (Puppeteer, Selenium, Playwright).
    2. Navigate to the site.
    3. Read the «Bot Detected» or «Human Detected» status to identify which parameters are giving you away
  • DB Tuning Pt1 SP etc

    Hei, or hi, see below screen and the main Stored Procedure that the BOTs will check for. I hope you like it, or not.

    as said, the SP

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[SERVERS.BOTS.INSTANCES.SelectOrCreateAndSelect] (
    	  @Bot_Name NVarChar(8) =  N'WinForms'
    	, @OS NVarChar(16), @OS_ID int = NULl
    	, @Server_Serial nvarchar(64), @Server_MachineName NVarChar(32), @Server_Language NChar(2) = N'es'
    	, @Server_PhysicalCores tinyInt, @Server_LogicalCores tinyint, @Server_PhysicalCoresMaxMhz tinyInt
    	, @Server_ID int = NULL
    	, @Settings_Bots_Instances_MaxMinsOfInactivity tinyInt = NULL
    	, @Language nchar(2) = NULL, @Country nchar(4) = NULL
    
    ) 
    AS
    BEGIN
    	SET NOCOUNT ON
    	DECLARE @Bot_ID tinyINT;
    	DECLARE @Bot_Instance_ID INT; 
    	DECLARE @Server_MaxBotInstances TinyINT;
    	SET @OS_ID = (SELECT TOP 1 [OS.ID] FROM dbo.[OS] AS O WHERE O.[OS] = @OS)
    	IF EXISTS (
    		SELECT * FROM
    		dbo.[Servers] AS S WHERE S.[Server.MachineName] = @Server_MachineName
    	)
    		BEGIN
    			SELECT TOP 1 @Server_ID = [Server.ID], @Server_MaxBotInstances = [Server.MaxBotInstances] FROM dbo.[Servers] AS S WHERE S.[Server.MachineName] = @Server_MachineName AND S.[Server.Active] = 1
    		END
    	ELSE
    		BEGIN
    			INSERT INTO dbo.[Servers] ([OS.ID], [Server.MachineName], [Server.Language],[Server.PhysicalCores], [Server.LogicalCores], [Server.PhysicalCoresMaxMhz] ) VALUES (@OS_ID, @Server_MachineName,@Server_Language,@Server_PhysicalCores,@Server_LogicalCores, @Server_PhysicalCoresMaxMhz )
    			SET @Server_ID = (SELECT SCOPE_IDENTITY())
    			SET @Server_MaxBotInstances = (SELECT [Server.MaxBotInstances]  FROM dbo.[SERVERS] AS S WHERE S.[Server.ID] = @Server_ID )
    		END;
    	
    	-- Buscar instancia de de ultima fecha al menos 6 horas desde ahora que no tenga actividad
    	SET @Settings_Bots_Instances_MaxMinsOfInactivity = (SELECT TOP 1 [Settings.Bots.Instances.MaxMinsOfInactivity] FROM dbo.[SETTINGS] AS STT WHERE STT.[Setting.IsDefault] = 1 ORDER BY STT.[Setting.ID] DESC)
    	SET @Bot_ID = (SELECT [Bot.ID] FROM dbo.[BOTS] AS B WHERE B.[Bot.Name] = @Bot_Name )
    
    
    	--VER SI EXISTE INSTANCIA O SE DEBE CREAR
    	IF EXISTS(
    		SELECT * FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    		INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    		INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    		INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    		WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
    		AND SBI.[Server.ID] = @Server_ID
    		AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    	)
    		BEGIN
    			SELECT @Bot_Instance_ID = BI.[Bot.Instance.ID]
    			FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    			INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    			INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    			INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    			WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
    			AND SBI.[Server.ID] = @Server_ID
    			AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    		END
    	ELSE
    		BEGIN
    		-- NO EXISTE NINGUNA INSTANCIA, DEBE CREARSE PUES, SIEMPRE Y CUANDO NO NOS SOBREPASEMOS DE INSTANCIAS POR SERVIDOR
    			DECLARE @ActualInstances tinyINT = 0;
    			--CHECKEAR QUE NO SE HAYA SOBREPASADO, O IGUALADO EL LIMITE DE MAX INSTANCIAS POR SERVER
    			SELECT @ActualInstances = COUNT(*)
    			FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    			INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    			INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    			INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    			WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
    			AND SBI.[Server.ID] = @Server_ID
    			AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    			IF @ActualInstances  >=  @Server_MaxBotInstances 
    				BEGIN
    					RETURN SELECT -4
    				END
    			ELSE
    				BEGIN
    					--CREAR INSTANCIA: BOTSINSTANCES, SERVER.BOT.INSTANCES
    					INSERT INTO dbo.[BOTS.INSTANCES]
    					([Bot.ID], [IP.ID] )
    					VALUES
    					(@Bot_ID, 
    					
    						(
    							SELECT TOP 1 [IP.ID] FROM [IPS] AS I WHERE NOT I.[IP.ID]  IN (
    								SELECT BI.[IP.ID] FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    								INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
    								INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
    								INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    								WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 
    								AND B.[Bot.Name] = @Bot_Name 
    								AND SBI.[Server.ID] = @Server_ID
    								AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())
    
    							) AND I.[Country] = ISNULL(@Country, I.[Country]) 
    							  AND LEFT(I.[Country],2) = ISNULL(@language, LEFT(I.[Country],2))
    						
    						)
    					
    					)
    
    					SET @Bot_Instance_ID = (SELECT SCOPE_IDENTITY())
    
    				
    				END
    		END
    
    		IF NOT EXISTS (SELECT * FROM  dbo.[SERVERS.BOTS.INSTANCES] WHERE [Server.ID] = @Server_ID AND [Bot.Instance.ID] = @Bot_Instance_ID )
    		BEGIN
    			INSERT INTO  dbo.[SERVERS.BOTS.INSTANCES] ([Server.ID],  [Bot.Instance.ID] ) VALUES ( @Server_ID, @Bot_Instance_ID)
    		END
    
    
    		SELECT * FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
    		INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
    		INNER JOIN dbo.[OS] AS O ON O.[OS.ID] = S.[OS.ID] 
    			INNER JOIN dbo.[BOTS.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID] 
    		INNER JOIN dbo.[IPS] AS I ON I.[IP.ID] = BI.[IP.ID] 
    		INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID] 
    		INNER JOIN dbo.[ACCOUNTS] AS A ON A.[Account.ID] = BI.[Account.ID]
    		INNER JOIN dbo.[ACCOUNTS.KEYWORDS] AS AK ON AK.[Account.ID] = A.[Account.ID]
    		
    		WHERE SBI.[Bot.Instance.ID] = @Bot_Instance_ID AND S.[Server.ID] = @Server_ID AND S.[Server.Active] = 1 AND BI.[Bot.Instance.Active] = 1
    		
    
    		--PENDIENTE: COMO RELACIONAR UN ACCOUNT Y UNOS HUMANS, CON LA INSTANCIA DEL BOT ACTUAL ?
    			-- PONER Account.Id en Bot.Instancias ? SI
    				-- Y PARA ELLO HACER CUENTA ACCOUNTS (la actual devices.account renombrarla) y en vez de poner account id como property de devices o de server.bla bla, ponerla como propiedad de bot.instanes
    
    		--una vez finalizado, pegar en doninam y luego testear y actualizar doninam si fuere el caso
    
    
    
    
    END
    

  • Programming a BOT

    Either a BOT for Winforms, WPF, Android or whataver

    First, when the bot is loading (so when OnLoad event gets fired) it must know if he already exist (in database) or if it must request a new creation.

    This will be done by calling a T-SQL Stored Procedure we will create for

    This will check, based on the OS and Name of the computer or device where its been deployed (Server.ID or Device.ID for physical devices),

    if NOT exist any bot.instance created, then

    creates one, while there will be no more than MaxBotInstances for this server

    if exists one (order by LastOperationDate asc (older first) where Active = true, and at least 12 hours of inactivity has been passed, cause a bot cannot be more than 12 hourts with inactivity.. more on this later eg. if only one url to go for, then at least 6 hours must be passed between reloads, according to youtube tests)

    RETURNS

    Bot.Instance.ID

  • Database Diagram Part 1

    The software and the machines

    diagram doninam database part 1

    v 087d

  • What a bot says currently about us

    Asked today a few hours ago to Today is 26 January 2026 here in a Spoken Spanish Country

    https://www.kimi.com/chat/d5rojj3bpakb79h967lg

    ’ll fetch the content from that URL and look for the DIY, no-purchase method.The page is short, but it already tells the whole story: the “do-it-yourself, no-buy” method promoted on doninam.com is to build your own view-bot network—rent servers + proxies, write code that emulates human watch sessions, and bypass YouTube’s anti-bot defences.
    In other words, it’s a programming-heavy, black-hat route that deliberately violates YouTube’s Terms of Service. If you want the details you’ll have to follow the author’s future posts (he only teases the concept so far), but the takeaway is clear: there is no legitimate “free“ trick inside—just an invitation to code your own fake traffic, with all the usual risks (detection, termination, possible legal action).