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

Autor: admin

  • Proxies can be detected

    resume if you ask «can js know if you’re behind a proxy ?»

    google shows

    JavaScript cannot directly access your system’s proxy settings or network configuration due to browser security sandboxing. However, JS can be used to infer that you are behind a proxy through several indirect technical methods

    1. WebRTC IP Leakage

    JavaScript can use the WebRTC API (specifically RTCPeerConnection) to bypass your proxy and discover your «real» local or public IP address. If the IP detected via WebRTC differs from the IP making the HTTP request, the site knows a proxy or VPN is in use. 

    2. Network Latency Analysis (TCP Handshake)

    Sites can compare the time it takes for a JavaScript-initiated request (like a WebSocket message) to reach their server against the initial TCP handshake time. 

    • Normal: Handshake and JS request have similar latencies.
    • Proxy Detect: The TCP handshake happens between the server and the proxy, while the JS request must travel the full distance from your browser, through the proxy, to the server. This discrepancy flags proxy usage. 

    3. Timezone and Geolocation Mismatches

    JS can check your local system time (Intl.DateTimeFormat) and browser language settings. If your system clock is set to London (GMT) but your IP address shows you are in New York (EST), it is a strong indicator of a proxy or location-spoofing tool. 

    4. Detecting HTTP Headers

    While JS itself can’t see the headers of the request it is currently running in, it can make a fetch request to an endpoint (like httpbin.org) that echoes back the headers. Many proxies automatically inject headers like: 

    • X-Forwarded-For
    • Via
    • X-Client-IP 

    5. Advanced Fingerprinting 

    Modern anti-bot scripts (like Cloudflare or Akamai) use JS to collect dozens of data points about your hardware, fonts, and browser behavior. They compare this «fingerprint» against databases of known proxy data centers. If your browser fingerprint matches a profile typically associated with automated scripts or data center IPs, you will be flagged. 

    SO, I will be examining those factors, be aware that some are not true at all

    example: https://stackoverflow.com/questions/19767589/how-to-detect-a-proxy-using-javascript this said can detect a proxy, but it does not

    ANY WAY: THINGS TO CONSIDER

    Use the bots on same country (time zone) where the IPs you’ll use are located. So do not use say USA IP’s if your Virtual machines are located on say GErmaby

  • Saved on wayback machine

    In order for its long term availability, as for the truth must be preserved

    https://web.archive.org/web/20260120172129/https://www.doninam.com/

  • Human Emulation Scroll

    To be a litle more difficult, cause, in emulating cursor (previous article) the target website (so youtube) does not know if any code was injected (as no one code was injected) cause the Bot app emulate the cursor, easy, but, in scrolling, some sources says to use , where N = bla bla

    browser.ExecuteScriptAsync("window.scroll(0,N);");

    but , say to IA «can js detect browser.ExecuteScriptAsync»

    results in

    JavaScript cannot directly detect the execution of a browser.ExecuteScriptAsync call because this method is part of the host application’s API (such as WebView2 or CefSharp) and operates outside the standard JavaScript environment. 

    However, a script can indirectly detect its own injection or «presence» using the following methods:

    1. Self-Identification via State

    If the host application uses ExecuteScriptAsync to set a global variable, standard JavaScript can check for that variable’s existence. 

    • Detection logic: if (window.myInjectionFlag) { ... }

    2. Monitoring DOM or Event Changes

    Since ExecuteScriptAsync is often used to modify the DOM or trigger events, JavaScript can use a MutationObserver to watch for unexpected changes that did not originate from the page’s original scripts. 

    3. Stack Trace Analysis

    In some environments, if a script is executed via an external command, the Error().stack property might reveal a unique trace (e.g., <anonymous> or specific internal wrappers), though this is highly implementation-specific and unreliable for robust detection. 

    4. Communication Back to Host

    The most common way for JavaScript to «acknowledge» an external script execution is to use host-provided bridges like:

    • WebView2: window.chrome.webview.postMessage().
    • CefSharp: CefSharp.PostMessage() or bound objects. 

    For more details on implementing these interfaces, see the official documentation for WebView2 APIs or the CefSharp WebBrowserExtensions

    so, 2 things

    May my app can use a non injected script, say to scrollgthe browser instance ? if not, then ooohh need to test

    So I ask the following (while listen to Im looking at gthe windows Stieve vai):

    can js detect is u use oin winformn a webview2 with Document.Window.ScrollTo(0, 0) ?

    which results in:

    In 2026, JavaScript running inside a WebView2 control can detect the fact that a scroll occurred, but it cannot inherently distinguish whether that scroll was caused by a WinForms Document.Window.ScrollTo(0, 0) command or a user’s manual action. 

    How JS Detects the Scroll

    • The scroll Event: Whenever the scroll position changes—whether programmatically via C# or manually by a user—the JavaScript scroll event fires.
    • The scrollend Event: Modern browsers (including the Edge/Chromium engine used by WebView2) support scrollend, which fires when any scroll animation completes. 

    SO, js , so youtube, cannot detect using this last method, if our app is a bot or not, so OK, camon men

    So code, to record a human real scrolls, to put on database

    UNFORTUNATELY, WebView2 does not allow to scroll without injecting JS, and the old WebBrowser does, but it is not supported on loading many websites, including youtube, that they reject tyo show, if this old browser is used.


    So, 2 opcions, use other control or scroll by moving the mouse (not emulating the scroll wheel), eyy eyyy, wait a moment, am I said Scroll wheel ??? let me checkl if I can control mouse scroll wheel ??

    I’ve got this code

    Imports System.Runtime.InteropServices
    
    Public Class Form1
        Private WithEvents Tmr As New Timer With {.Interval = 2000}
    
        Private Const MOUSEEVENTF_WHEEL As Integer = &H800 'The amount of movement is specified in mouseData.
        Private Const MOUSEEVENTF_HWHEEL As Integer = &H1000 'Not available for 2000 or XP
    
        <DllImport("user32.dll", EntryPoint:="mouse_event")> _
        Private Shared Sub mouse_event(ByVal dwFlags As UInteger, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As UInteger)
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
            Tmr.Start()
        End Sub
    
        Private Sub Tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Tmr.Tick
            MouseScroll(False, 10) 'scrolls Down 10 wheel clicks
            'MouseScroll(True, 1) 'scrolls Up 1 wheel click
        End Sub
    
        Private Sub MouseScroll(ByVal up As Boolean, ByVal clicks As Integer)
            If up Then
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)
            Else
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -(clicks * 120), 0)
            End If
        End Sub
    End Class

    Does it work ?

    And now, how can I record a human natural scroll ? to later port to playback ?

    YES, in winforms, there’s the _MouseWheel Event

    say

    Private Sub WebView2_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    
    e.delta 
    
    End Sub

    So I need to make my own recorder / playback for

    ERROR: On the VB.bnet applicartion seems that the event handler of WebView2.MouseWheel is not fired, oops

    Victor

    Unfortunately, the current latest version of the WebView2 1.0.674-prerelease don’t support MouseWhell events too. If is possible to download and run examples from https://github.com/MicrosoftEdge/WebView2Samples.

    Hey its get fired but with no url loaded

    Lets see over the entire form, no it does not work, soo

    We have a problem MIKE

    Well not at all, as the Winform allows (yes) to catch the e.delta on scrolls, thaen I can record like if i was on the webview2, just to grab some human movements, them the question is

    Will I be able to apply those recorded events (scroll) on the webview2, lets see

    YESSSSSS, DONEEE

    It was a litle bit trciky, cause, hmnn let me show the code used

    following is the unfinished code, but does what it is needed, so to get actions based on 10 ms timer, to get 0 = no scroll, +120 = scrollup or -120 = scroll down

    VB.NET Winforms 4.7 CODE

    #Region "Imports"
    Imports System.Security.Policy
    Imports Microsoft.Web.WebView2.WinForms
    Imports System.Runtime.InteropServices
    Imports System.Runtime.CompilerServices 'Required to load low level Win DLL's
    #End Region
    Public Class ScrollRecPlay
    #Region "OS DLL"
        Private Const MOUSEEVENTF_WHEEL As Integer = &H800 'The amount of movement is specified in mouseData.
        Private Const MOUSEEVENTF_HWHEEL As Integer = &H1000 'Not available for 2000 or XP
        <DllImport("user32.dll", EntryPoint:="mouse_event")>
        Private Shared Sub mouse_event(ByVal dwFlags As UInteger, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As UInteger)
        End Sub
    #End Region
    #Region "Variables"
        Private WithEvents TiRec As New Timer With {.Interval = 50} : Private WithEvents TiPlay As New Timer With {.Interval = 50}
        Private LastScrollDelta As Integer
    #End Region
    #Region "Buttons"
        Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click
            WebView21.Source = New Uri(txtUrl.Text)
        End Sub
        Private Sub btnRec_Click(sender As Object, e As EventArgs) Handles btnRec.Click
            TxtValues.Text = ""
            btnRec.Enabled = False : BtnStop.Enabled = True
            TiRec.Enabled = True
        End Sub
        Private Sub BtnStop_Click(sender As Object, e As EventArgs) Handles BtnStop.Click
            btnRec.Enabled = True : btnPlay.Enabled = True : TiRec.Enabled = False
        End Sub
        Private Sub btnPlay_Click(sender As Object, e As EventArgs) Handles btnPlay.Click
            'mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)
            Me.Text = "Be Sure "
            btnPlay.Enabled = False
            TiPlay.Enabled = True
    
        End Sub
    #End Region
    #Region "Timers"
        Private Sub TiRec_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TiRec.Tick
            TxtValues.Text = TxtValues.Text & "," & LastScrollDelta
            LastScrollDelta = 0
        End Sub
        Private Sub TiPlay_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TiPlay.Tick
            MouseScroll(False, 100)
            Me.Text = "done"
        End Sub
    #End Region
    #Region "WebView2"
    
    #End Region
    #Region "Functions"
        Private Sub MouseScroll(ByVal up As Boolean, ByVal clicks As Integer)
            If up Then
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)
            Else
                mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -(clicks * 120), 0)
            End If
        End Sub
    
    #End Region
    
    
        Private Sub ScrollRecPlay_MouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel
            If Not btnPlay.Enabled = False Then 'to not get fired if playback (which will call to scroll)
                LastScrollDelta = e.Delta
            End If
    
        End Sub
    
    
    
    End Class

    Note: the minimum effective interval is at 50 ms, so a bit far from those 10 ms but it should be ok, I think.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  • Human Emulation Mouse

    Ask to the IA (which it is best , to not use it)

    «create me an html with js, with a timer that, once first click on mouse, records the mouse coordinates (each 10 ms) relatives from the original mouse position just before the frst click on a mouse, in pixels, until a new click mouse happens, and once that, show the coordinates in form of text in a text like say : 0:0 (before or on first click), -10:5, +12:5, 1+22:21, etc where on comma delimiter is a step each 10 ms. Once finished, it will also show the screen size, but not the enite, just the portion of where this code is shown, say 500×350, then on the this click it will reproduce the mouse movement recorded on the screen, on the same screen itself. Be aware thaty if say during 5 seconds the mouse is recorded, then, as each step is recorded each 10 ms, then in this example must show 500 records»

    use https://jsfiddle.net/rwvad1n9/ <– ok

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Mouse Movement Recorder</title>
        <style>
            body { font-family: sans-serif; padding: 20px; overflow: hidden; background: #f4f4f9; }
            #status { font-weight: bold; margin-bottom: 10px; color: #333; }
            #output { 
                width: 100%; height: 150px; margin-top: 10px; 
                font-family: monospace; font-size: 12px; 
                background: white; border: 1px solid #ccc; overflow-y: auto; word-break: break-all;
            }
            #ghost-cursor {
                width: 12px; height: 12px; background: red; border-radius: 50%;
                position: absolute; pointer-events: none; display: none;
                box-shadow: 0 0 5px rgba(255,0,0,0.5); z-index: 9999;
            }
            .info { color: #666; font-size: 0.9em; }
        </style>
    </head>
    <body>
    
        <div id="status">Click anywhere to start recording...</div>
        <div class="info" id="screen-info"></div>
        <div id="output">Coordinates will appear here...</div>
        <div id="ghost-cursor"></div>
    
        <script>
            let state = 'WAITING'; // WAITING, RECORDING, FINISHED
            let startTime, timerInterval;
            let originX = 0, originY = 0;
            let currentMouseX = 0, currentMouseY = 0;
            let records = [];
    
            const statusEl = document.getElementById('status');
            const outputEl = document.getElementById('output');
            const screenEl = document.getElementById('screen-info');
            const ghost = document.getElementById('ghost-cursor');
    
            // Track current mouse position constantly to have it ready for the 10ms interval
            window.addEventListener('mousemove', (e) => {
                currentMouseX = e.clientX;
                currentMouseY = e.clientY;
            });
    
            window.addEventListener('click', (e) => {
                if (state === 'WAITING') {
                    startRecording(e);
                } else if (state === 'RECORDING') {
                    stopRecording();
                } else if (state === 'FINISHED') {
                    replayMovement();
                }
            });
    
            function startRecording(e) {
                state = 'RECORDING';
                statusEl.innerText = "RECORDING... Click again to stop.";
                
                // Set Origin (0:0)
                originX = e.clientX;
                originY = e.clientY;
                records = ["0:0"];
    
                // Start 10ms Timer
                timerInterval = setInterval(() => {
                    let relX = currentMouseX - originX;
                    let relY = currentMouseY - originY;
                    
                    // Format with plus sign for positive numbers as requested
                    let strX = relX >= 0 ? `+${relX}` : relX;
                    let strY = relY >= 0 ? `+${relY}` : relY;
                    
                    records.push(`${strX}:${strY}`);
                }, 10);
            }
    
            function stopRecording() {
                state = 'FINISHED';
                clearInterval(timerInterval);
                statusEl.innerText = "RECORDING FINISHED. Click again to REPLAY.";
                
                // Show recorded text
                outputEl.innerText = records.join(', ');
    
                // Show viewport size (portion where code is shown)
                const w = window.innerWidth;
                const h = window.innerHeight;
                screenEl.innerText = `Viewable Area: ${w}x${h} pixels | Total steps: ${records.length}`;
            }
    
            function replayMovement() {
                statusEl.innerText = "REPLAYING...";
                ghost.style.display = 'block';
                let index = 0;
    
                const replayInterval = setInterval(() => {
                    if (index >= records.length) {
                        clearInterval(replayInterval);
                        statusEl.innerText = "REPLAY FINISHED. Refresh to reset.";
                        ghost.style.display = 'none';
                        return;
                    }
    
                    // Parse "X:Y" format (handling the + sign)
                    let parts = records[index].split(':');
                    let relX = parseInt(parts[0]);
                    let relY = parseInt(parts[1]);
    
                    // Calculate absolute position based on original starting point
                    ghost.style.left = (originX + relX) + 'px';
                    ghost.style.top = (originY + relY) + 'px';
    
                    index++;
                }, 10);
            }
        </script>
    </body>
    </html>
    

    So, I use the code above to record some actions done by a real human (me) to insert into the database (table HUMAN.ACTIONS)

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  • Against the Youtube rules

    Or better know, check what Javascript can do, then programm the Human Behavior

    What Javascript can detect

    (so what the superbots will emulate to be against while complain with the tested youtube anti-artificial count-stats methodology)

    check https://blog.bitsrc.io/javascript-device-detection-bf75eb782fdf

    Say brand and model of his device, the resolution (current, as say a dekstop computer can change it, as opposed to a phone), O.S, bla bla, and most important, ¿Can detect JS so youtube, is a device is Bot based, or Human, based ? NO, not at all , if you do it well, but be aware, this will be a bit difficult for you, or not.

    see more articles about in this website

    be sure to check, human vs bot, to develop your bot, to catch the human

    https://irdeto.com/blog/visualize-evidence-to-catch-bots-with-confidence#:~:text=This%20is%20most%20obvious%20for,positions%20created%20by%20a%20human

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  • Database Arquitecture part II

    To be implemented later, when ready to start

    bellow a few ideas

    ORDERS

    • [ID].[User] FK ([ID].[User]) (USERS)
    • [ID].[URL] FK ([ID].[URL]) ([URLS])
    • [DEF].[URLS].[Kind].[Action] FK
    • [ID].[ORDERS] PK
    • [ORDERS].[HYBRID] Bit NULL nullable
      • NULL, then so order only for [URL]
      • FALSE, then so order only for [URL_Mobile]
      • TRUE, then, so order will execute both Dekstop & Mobile url’s
    • [ORDERS].[Created] Datetime2
    • [Amount] Int

    [PURCHASES]

    • [ID].[User] FK ([ID].[User]) (USERS)
    • [ID].[ORDERS] FK ([ID].[Order]) (ORDERS) NON UNIQUE
    • [ID].[Purchase] PK int UNIQUE FROM (ID_USER & ID_ORDER)

    [PURCHASES].[MONEY]

    • [ID].[Purchase] FK
    • [Money]
    • [Currency] Char(3)

    [Identifier tables]

    If using FK’s must be only FK’s from[DEF].Tables

    [DEF].[URLS].[Kind]

    :: Must be, in order to derive actions based on these

    • [ID].[DEF].[Kind] PK
    • [DEF].[URLS].[Kind].[Name]
      • Example: Youtube, twitch, kick, and newer kinds that may appear over the time

    [DEF].[URLS].[Kind].[Action]

    • [ID].[DEF].[Kind] FK
    • [ID].[DEF].[URLS].[Kind].[Action] PK TinyInt
    • [ID].[DEF].[URLS].[Kind].[Action].[Name] NVarChar(33)
      • Example: Play, Like, Unlike Comment, and other that may come to kind


    [DEF].[PRICES].[URLS]

    [DEF].[PRICES].[URLS].[PACKS]

    [DEF].[PRICES].[URLS].[PACKS].[ACTIONS]

    [DEF].[PRICES].[URLS].[PACKS].[ACTIONS]

    [DEF].[PRICES].[URLS].[PACKS].[ACTIONS].[Price]

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  • Database Arquitecture part I

    Database Arquitecture part I

    In this chapter I’m disposing my creation. This will contains the tables, and some SQL code in the form that I’m using within SP (stored procedures).

    NOTE: This applies for early version (v. 0.5).

    Latest version* are only available for purchase.


    Engine specs

    • Type of DB: SQL
    • Brand: Microsoft SQL Server Express
    • Model: Anyone since 2008 R2

    SQL NAMED INSTANCE:

    • SQLBOT

    DATABASE NAME

    • SUPERBOTS

    *for the tutorial purposes Im using an SQL 2005-2008 R2 compatible code (as that’s the one I was starting to hard–code for)

    THE TABLES

    [Main tables]

    IPS* *

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[IPS](
    	[IP.ID] [int] NOT NULL,
    	[IP] [nvarchar](10) NOT NULL,
    	[Country] [nchar](2) NOT NULL,
    	[IP.Created] [datetime2](7) NOT NULL,
    	[IP.Actived] [datetime2](7) NOT NULL,
    	[IP.Disabled] [datetime2](7) NULL,
     CONSTRAINT [PK_IPS] PRIMARY KEY CLUSTERED 
    (
    	[IP.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'If not True, then IP can be used' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'IPS', @level2type=N'COLUMN',@level2name=N'IP.Disabled'
    GO
    
    

    BOTS

    • [Bot.ID] Int PK
    • [Bot.Name] NVarChar(8)
      • example: Winform, App, UrlBased, Android, Iphone
    • [Bot.Physical] Bit 0

    USE [superbots]
    GO
    /****** Object:  Table [dbo].[BOTS]    Script Date: 13/01/2026 23:46:05 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[BOTS](
    	[Bot.ID] [int] NOT NULL,
    	[Bot.Name] [nvarchar](8) NULL,
    	[Bot.Physical] [bit] NOT NULL,
     CONSTRAINT [PK_BOTS] PRIMARY KEY CLUSTERED 
     (
    	[Bot.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    

    BOTS.INSTANCES

    • [Bot.ID] Int (FK :: [ID].[Bot])(BOTS))
    • [Bot.Instance.ID] BigInt PK
    • [Bot.Instance.Created] Datetime2
      • DEFAULT VALUE = GetDate() :: all [Created] on all tables, don’t forget
    • [Bot.Instance.Active] Bit 1

    USE [superbots]
    GO
    
    /****** Object:  Table [dbo].[BOTS.INSTANCES]    Script Date: 14/01/2026 0:20:18 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[BOTS.INSTANCES](
    	[Bot.ID] [int] NOT NULL,
    	[Bot.Instance.ID] [bigint] IDENTITY(1,1) NOT NULL,
    	[Bot.Instance.Created] [datetime2](7) NOT NULL,
    	[Bot.Instance.Active] [bit] NOT NULL,
     CONSTRAINT [PK_BOTS.INSTANCES] PRIMARY KEY CLUSTERED 
    (
    	[Bot.Instance.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES] ADD  CONSTRAINT [DF_BOTS.INSTANCES_Bot.Instance.Created]  DEFAULT (getdate()) FOR [Bot.Instance.Created]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES] ADD  CONSTRAINT [DF_BOTS.INSTANCES_Bot.Instance.Active]  DEFAULT ((0)) FOR [Bot.Instance.Active]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES]  WITH CHECK ADD  CONSTRAINT [FK_BOTS.INSTANCES_BOTS] FOREIGN KEY([Bot.ID])
    REFERENCES [dbo].[BOTS] ([Bot.ID])
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES] CHECK CONSTRAINT [FK_BOTS.INSTANCES_BOTS]
    GO
    

    BOTS.INSTANCES.DEVICES

    As a User may have a Phone, Tablet, Computer and Labtop

    USE [superbots]
    GO
    /****** Object:  Table [dbo].[BOTS.INSTANCES.DEVICES]    Script Date: 17/01/2026 11:19:57 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[BOTS.INSTANCES.DEVICES](
    	[Bot.Instance.ID] [bigint] NOT NULL,
    	[Device.ID] [int] NOT NULL,
    	[Bot.Instance.Device.ID] [int] IDENTITY(1,1) NOT NULL,
    	[Bot.Instance.Device.Created] [datetime2](7) NOT NULL,
     CONSTRAINT [PK_BOTS.INSTANCES.DEVICES] PRIMARY KEY CLUSTERED 
    (
    	[Bot.Instance.Device.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES] ADD  CONSTRAINT [DF_BOTS.INSTANCES.RESOLUTIONS_Bot.Instance.Resolution.IP.Asigned]  DEFAULT (getdate()) FOR [Bot.Instance.Device.Created]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES]  WITH CHECK ADD  CONSTRAINT [FK_BOTS.INSTANCES.DEVICES_BOTS.INSTANCES] FOREIGN KEY([Bot.Instance.ID])
    REFERENCES [dbo].[BOTS.INSTANCES] ([Bot.Instance.ID])
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES] CHECK CONSTRAINT [FK_BOTS.INSTANCES.DEVICES_BOTS.INSTANCES]
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'User may have 12 devices,but a maximum of 4 per day per url' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BOTS.INSTANCES.DEVICES', @level2type=N'COLUMN',@level2name=N'Bot.Instance.Device.ID'
    GO
    
    
    

    BOTS.INSTANCES.DEVICES.IPS

    USE [superbots]
    GO
    /****** Object:  Table [dbo].[BOTS.INSTANCES.DEVICES.IPS]    Script Date: 17/01/2026 11:20:52 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS](
    	[Bot.Instance.Device.ID] [int] IDENTITY(1,1) NOT NULL,
    	[IP.ID] [int] NOT NULL,
    	[Bot.Instance.Device.IP.ID] [int] NOT NULL,
    	[Bot.Instance.Device.IP.Asigned] [datetime2](7) NOT NULL,
     CONSTRAINT [PK_BOTS.INSTANCES.DEVICES.IPS] PRIMARY KEY CLUSTERED 
    (
    	[Bot.Instance.Device.IP.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS] ADD  CONSTRAINT [DF_BOTS.INSTANCES.IPS_Bot.IP.Asigned]  DEFAULT (getdate()) FOR [Bot.Instance.Device.IP.Asigned]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS]  WITH CHECK ADD  CONSTRAINT [FK_BOTS.INSTANCES.DEVICES.IPS_BOTS.INSTANCES.DEVICES] FOREIGN KEY([Bot.Instance.Device.ID])
    REFERENCES [dbo].[BOTS.INSTANCES.DEVICES] ([Bot.Instance.Device.ID])
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS] CHECK CONSTRAINT [FK_BOTS.INSTANCES.DEVICES.IPS_BOTS.INSTANCES.DEVICES]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS]  WITH CHECK ADD  CONSTRAINT [FK_BOTS.INSTANCES.DEVICES.IPS_BOTS.INSTANCES.DEVICES.IPS] FOREIGN KEY([Bot.Instance.Device.IP.ID])
    REFERENCES [dbo].[BOTS.INSTANCES.DEVICES.IPS] ([Bot.Instance.Device.IP.ID])
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS] CHECK CONSTRAINT [FK_BOTS.INSTANCES.DEVICES.IPS_BOTS.INSTANCES.DEVICES.IPS]
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS]  WITH CHECK ADD  CONSTRAINT [FK_BOTS.INSTANCES.DEVICES.IPS_IPS] FOREIGN KEY([IP.ID])
    REFERENCES [dbo].[IPS] ([IP.ID])
    GO
    
    ALTER TABLE [dbo].[BOTS.INSTANCES.DEVICES.IPS] CHECK CONSTRAINT [FK_BOTS.INSTANCES.DEVICES.IPS_IPS]
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Max 4 per day as according to stats, youtube counts a max of 4 views uniqeu per day per ip, of course, user may have a home IP used by his phone, tablet, computer and labtop' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BOTS.INSTANCES.DEVICES.IPS', @level2type=N'COLUMN',@level2name=N'Bot.Instance.Device.ID'
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Max 4 per day per DEVICE.ID ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'BOTS.INSTANCES.DEVICES.IPS', @level2type=N'COLUMN',@level2name=N'Bot.Instance.Device.IP.ID'
    GO
    
    
    
    CREATE TRIGGER TRG_BOTS_INSTANCES_DEVICES_IPS_DenyMoreThanOneEach4hrsperDevicePerIP
    ON [BOTS.INSTANCES.DEVICES.IPS]
    AFTER INSERT
    AS
    BEGIN
        IF EXISTS (
                SELECT 1
                FROM Inserted I
                JOIN  [BOTS.INSTANCES.DEVICES.IPS] B ON  (B.[Bot.Instance.Device.ID] = I.[Bot.Instance.Device.ID] AND B.[IP.ID] = I.[IP.ID])
                WHERE B.[Bot.Instance.Device.IP.Asigned] < DATEADD(hour, -6, GETDATE())        
        )
        BEGIN
            RAISERROR('No se puede insertar el registro:Bot.Instance.Device e IP son iguales y la fecha es anterior a hace 6 horas.', 16, 1);
            ROLLBACK TRANSACTION; 
            RETURN;
        END
    END;
    GO
    

    URLS

    [URL.ID] Int PK

    [URL.Desktop] NVarChar(256)

    [URL.Mobile] NVarChar(256)

    [URL.Tablet] NVarChar(256)

    USE [superbots]
    GO
    /****** Object:  Table [dbo].[URLS]    Script Date: 14/01/2026 22:48:07 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[URLS](
    	[URL.ID] [int] NOT NULL,
    	[URL.Desktop] [nvarchar](256) NULL,
    	[URL.Mobile] [nvarchar](256) NULL,
    	[URL.Tablet] [nvarchar](256) NULL,
    	[URL.Created] [datetime2](7) NOT NULL,
     CONSTRAINT [PK_URLS] PRIMARY KEY CLUSTERED 
    (
    	[URL.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[URLS] ADD  CONSTRAINT [DF_URLS_URL.Created]  DEFAULT (getdate()) FOR [URL.Created]
    GO
    

    (trigger :: at least one URL (desktop, mobile or tablet must be per record)

    CREATE TRIGGER [dbo].[TRG_URLS_OnIsert_Or_OnUpdate]
    ON [dbo].[URLS]
    AFTER INSERT, UPDATE
    AS
    BEGIN
        SET NOCOUNT ON;
        IF EXISTS (
            SELECT 1  FROM inserted
            WHERE ([URL.Desktop] IS NULL) AND ([URL.Mobile] IS NULL ) AND ([URL.Tablet] IS NULL)
        )
        BEGIN
            RAISERROR ('At least one type URL must be provided.', 16, 1);
            ROLLBACK TRANSACTION;
        END
    END;
    



    USERS

    USE [superbots]
    GO
    
    /****** Object:  Table [dbo].[USERS]    Script Date: 15/01/2026 16:02:59 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[USERS](
    	[User.ID] [int] IDENTITY(1,1) NOT NULL,
    	[User.Email] [nvarchar](32) NOT NULL,
    	[User.Created] [datetime2](7) NOT NULL,
    	[User.Enabled] [bit](0) NOT NULL,
     CONSTRAINT [PK_USERS] PRIMARY KEY CLUSTERED 
    (
    	[User.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[USERS] ADD  CONSTRAINT [DF_USERS_User.Created]  DEFAULT (getdate()) FOR [User.Created]
    GO
    
    ALTER TABLE [dbo].[USERS] ADD  CONSTRAINT [DF_USERS_User.Enabled]  DEFAULT ((0)) FOR [User.Enabled]
    GO
    

    (trigger to allow only valid emails)

    CREATE TRIGGER TRG_USERS_ValidateEmailFormat ON USERS
    AFTER INSERT, UPDATE
    AS
    BEGIN
        SET NOCOUNT ON;
        -- Check if any inserted/updated rows have an invalid email format
        IF EXISTS (
            SELECT 1 
            FROM USERS
            WHERE  1 = 1
              AND (
                -- Pattern: char + @ + char + . + at least 2 chars for TLD
                [User.Email] NOT LIKE '%_@_%_.__%' 
                -- Disallow specific common invalid characters
                OR [User.Email] LIKE '%[^a-z0-9@._-]%' ESCAPE '\'
                -- Disallow consecutive dots or @
                OR [User.Email] LIKE '%..%' 
                OR [User.Email] LIKE '%@%@%'
              )
        )
        BEGIN
            RAISERROR ('The Email format provided is invalid.', 16, 1);
            ROLLBACK TRANSACTION;
        END
    END;
    GO

    USERS.URLS

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[USERS.URLS](
    	[User.ID] [int] NOT NULL,
    	[URL.ID] [int] NOT NULL,
    	[User.URL.ID] [int] NOT NULL,
    	[User.URL.Created] [datetime2](7) NOT NULL,
    	[User.URL.Legitimated] [datetime2](7) NULL,
     CONSTRAINT [PK_USERS.URLS] PRIMARY KEY CLUSTERED 
    (
    	[User.URL.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[USERS.URLS] ADD  CONSTRAINT [DF_USERS.URLS_User.Url.Created]  DEFAULT (getdate()) FOR [User.URL.Created]
    GO
    
    ALTER TABLE [dbo].[USERS.URLS]  WITH CHECK ADD  CONSTRAINT [FK_USERS.URLS_URLS] FOREIGN KEY([URL.ID])
    REFERENCES [dbo].[URLS] ([URL.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.URLS] CHECK CONSTRAINT [FK_USERS.URLS_URLS]
    GO
    
    ALTER TABLE [dbo].[USERS.URLS]  WITH CHECK ADD  CONSTRAINT [FK_USERS.URLS_USERS] FOREIGN KEY([User.ID])
    REFERENCES [dbo].[USERS] ([User.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.URLS] CHECK CONSTRAINT [FK_USERS.URLS_USERS]
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Identifies, if an url is owned by the user. Web must verify via DNS records on that domain' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'USERS.URLS', @level2type=N'COLUMN',@level2name=N'User.URL.Legitimated'
    GO
    

    USERS.URLS.YOUTUBE

    Made to include the stats (of views, likes, comments, etc) when user created theURL

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[USERS.URLS.YOUTUBES](
    	[User.URL.ID] [int] NOT NULL,
    	[Views] [int] NOT NULL,
    	[Likes] [int] NOT NULL,
    	[Comments] [int] NOT NULL
    ) ON [PRIMARY]
    GO
    

    USERS.BOTS.INSTANCES

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[USERS.BOTS.INSTANCES](
    	[User.ID] [int] NOT NULL,
    	[Bot.Instance.ID] [bigint] NOT NULL,
    	[User.Bot.Instance.ID] [int] NOT NULL,
    	[User.Bot.Instance.Created] [datetime2](7) NOT NULL,
     CONSTRAINT [PK_USERS.BOTS.INSTANCES] PRIMARY KEY CLUSTERED 
    (
    	[User.Bot.Instance.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES] ADD  CONSTRAINT [DF_USERS.BOTS.INSTANCES_User.Bot.Instance.Created]  DEFAULT (getdate()) FOR [User.Bot.Instance.Created]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES]  WITH CHECK ADD  CONSTRAINT [FK_USERS.BOTS.INSTANCES_BOTS.INSTANCES] FOREIGN KEY([Bot.Instance.ID])
    REFERENCES [dbo].[BOTS.INSTANCES] ([Bot.Instance.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES] CHECK CONSTRAINT [FK_USERS.BOTS.INSTANCES_BOTS.INSTANCES]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES]  WITH CHECK ADD  CONSTRAINT [FK_USERS.BOTS.INSTANCES_USERS] FOREIGN KEY([User.ID])
    REFERENCES [dbo].[USERS] ([User.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES] CHECK CONSTRAINT [FK_USERS.BOTS.INSTANCES_USERS]
    GO
    

    USERS.BOTS.INSTANCES.URLS

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[USERS.BOTS.INSTANCES.URLS](
    	[User.Bot.Instance.ID] [int] NOT NULL,
    	[User.URL.ID] [int] NOT NULL,
    	[User.Bot.Instance.Url.ID] [int] NOT NULL,
    	[User.Bot.Instance.Url.Created] [datetime2](7) NOT NULL,
     CONSTRAINT [PK_USERS.BOTS.INSTANCES.URLS] PRIMARY KEY CLUSTERED 
    (
    	[User.Bot.Instance.Url.ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS] ADD  CONSTRAINT [DF_USERS.BOTS.INSTANCES.URLS_User.Bot.Instance.Url.Created]  DEFAULT (getdate()) FOR [User.Bot.Instance.Url.Created]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS]  WITH CHECK ADD  CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS_USERS.BOTS.INSTANCES] FOREIGN KEY([User.Bot.Instance.ID])
    REFERENCES [dbo].[USERS.BOTS.INSTANCES] ([User.Bot.Instance.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS] CHECK CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS_USERS.BOTS.INSTANCES]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS]  WITH CHECK ADD  CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS_USERS.URLS] FOREIGN KEY([User.URL.ID])
    REFERENCES [dbo].[USERS.URLS] ([User.URL.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS] CHECK CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS_USERS.URLS]
    GO
    
    
    


    USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS

    USE [superbots]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS](
    	[User.Bots.Instances.URL.ID] [int] NOT NULL,
    	[Action.Youtube.ID] [int] NOT NULL,
    	[User.Bots.Instances.URL.Actions.Youtube.Created] [datetime2](7) NOT NULL,
    	[User.Bots.Instances.URL.Actions.Youtube.Finished] [datetime2](7) NULL,
    	[Action.Youtube.ID.Result] [datetime2](7) NULL
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS] ADD  CONSTRAINT [DF_USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS_User.Bots.Instances.URL.Actions.Youtube.Ceated]  DEFAULT (getdate()) FOR [User.Bots.Instances.URL.Actions.Youtube.Created]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS]  WITH CHECK ADD  CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS_ACTIONS.YOUTUBE] FOREIGN KEY([Action.Youtube.ID])
    REFERENCES [dbo].[ACTIONS.YOUTUBE] ([Action.YouTube.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS] CHECK CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS_ACTIONS.YOUTUBE]
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS]  WITH CHECK ADD  CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS_USERS.BOTS.INSTANCES.URLS] FOREIGN KEY([User.Bots.Instances.URL.ID])
    REFERENCES [dbo].[USERS.BOTS.INSTANCES.URLS] ([User.Bot.Instance.URL.ID])
    GO
    
    ALTER TABLE [dbo].[USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS] CHECK CONSTRAINT [FK_USERS.BOTS.INSTANCES.URLS.YOUTUBE.ACTIONS_USERS.BOTS.INSTANCES.URLS]
    GO
    
    
    

    *So, be aware that the above code might not be updated as last version, but thats a clean indicator of what to do.


    Above code dated from the SUPERBOTS SQL v0.5

    ** IP’s must be uniques, non shared, better with unmetered / unlimited bandwidth.


    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  • The Tools

    The Tools

    First of all let me say that you can use other brand / model of software and OS, as the progtramming techniques may be applied to, so better use the best you know, altought the learning is always welcome.

    Please take a look at the ways you can pump up your videos, which I documented, so.


    IPS : UNIQUE / NON SHARED / UNLIMITED (non measured bandwidth).

    Say you developed a great bot which you can run multiple instances, or say you have a farm of devices (phones, tablets, etc..), or both.

    You need for each one to have an IP address, and most important, each one must have his own, to not be shared with the others in your project, and of course, with no other away from you.

    There are multiple providers out there with rent the so-called proxy ips, with pricing varying from a few dollars nper single unit to say 1 USD for a couple of thhousands.

    But hey, if you want a video to have say 1 million, Do you need 1 Million of IPs ?

    NO, unless you want 1 million to be stated on your video in 1 day.

    All depends on your money, target time, how many views you want your video to show, and very important, the limits define by google, which translate to around 3-5 views per day per unique IP

    Say at safe speak:

    1 IP = 3 view counts per day


    Database DB : whatever depending on your reach.

    You can use

    • SQL database (I use MS SQL Express)
    • Text file (I used on beggining)

    You’ll store the IPS, then devices (app/soft instances or real devices), URL’s (of your vides), Actions (say visit the url, playback a video, skip or accept the cookies banner, the ADS etc.) and thats basically.


    VIRTUAL MACHINES / REAL PHYSICAL DEVICES and a control area.

    As you ‘ll use, depending on your budged, following is an approach:

    Almost no $eco friendly mid tierwell for 1m / month/s / video
    V. Machines1 31050
    Real Devices110100500
    IP’s10501001000

    PROGRAMMING

    Thats the best part, the most important, you’ll need a software development, either using Microsoft languages, Linux, or whatever you like better. For this blog I am using .Net

    Winforms / WPF and or whatever , being used old .net (before .Net CORE <.. Which I don’t like due to the mandatory recompilations)

    HTML + Javascript + [ Server side (where to store Datase)]*

    • *for low budgets you dont need server side, just using text files is fine, but HTML & JS.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  • The Rules

    The Rules

    You have a great idea, something a bit different from the rest.

    You want to get thousands of views from people, perhaps you have a great service, product, business, or just a video channel you’re looking to earn enought money to .. cause you’re doing great videos, right ??

    Thats the first lesson you need to know. What for you, your videos might be good, may be poor for the viewers,

    But hey, this blog will not talk at all the above paragraphs, as this is a development blog, focusing on programming, and server techniques, but, first of all, in order the work you spend, take some ROI / profit, please check this rules, every time you’re recording, when you interpret, and when you’re editing, so :


    RULE # 1 : Do it yourself.

    Avoid third parties as much as possible. Do it yourself, you can.


    RULE # 2: Do it in a profesional manner.

    2. A) Buy new clothes, dress well, write scripts before performing behind the camera, and buy all the pro equipment your pocket can.

    Don’t need to buy last camera, or last car, or last hi tech microphone, just take a look at a bit older devices, can do almost as new ones, in a more affordable way.

    2. B) Update frequently a public website, where on submit content related to each video or stream you made.

    2. C) Publish a post on your channel, a few hours before, letting know that your new video is coming


    RULE # 3: There’s nothing free, you must invest.

    Depending on your budget. But, spend as low as your pocket’s possibilities.


    RULE # 4: Avoid AI as much as possible.

    That’s not intelligence, that’s an artificial, pristine decorated fashion, that, either on video, picture and voice, will not help you, on the end will damage your channel.

    Avoid creating miniatures, songs, or video clips IA generated


    RULE # 5: Be Unique. Atractive, but different.

    Do not imitate, innovate instead. Be your own.


    RULE # 6: What you are saying, demostrate on, prove it.

    What you want to express, in the way you know it, may not be interpreted the same way by others.


    RULE # 7: There’s no timeout.

    A popular Spanish refrain says «Las prisas son malas consejeras» which equals to say, take your time.


    RULE # 8: Filter

    If they ask for, or you think that your product or whatever, say may have many many requests, then filter, against your rules, if they not follow, clear them all.


    RULE # 9: TO NOT DISCLOSURE AT ALL


    RULE # 10: BOTH HUMANS AND BOTS CAN BE WRONG
    Making some mistakes, so above rules may change and not to be at all true.

    postdate: If they will take, be sure you’ll get from

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *