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
Open the tool (e.g., pixelscan.net) using your bot’s browser instance (Puppeteer, Selenium, Playwright).
Navigate to the site.
Read the «Bot Detected» or «Human Detected» status to identify which parameters are giving you away
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)
’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).
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
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
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
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.
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:
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
ImportsSystem.Runtime.InteropServicesPublicClassForm1PrivateWithEventsTmrAsNewTimerWith {.Interval = 2000}PrivateConstMOUSEEVENTF_WHEELAsInteger = &H800'The amount of movement is specified in mouseData.PrivateConstMOUSEEVENTF_HWHEELAsInteger = &H1000'Not available for 2000 or XP <DllImport("user32.dll", EntryPoint:="mouse_event")> _PrivateSharedSubmouse_event(ByValdwFlagsAsUInteger, ByValdxAsInteger, ByValdyAsInteger, ByValdwDataAsInteger, ByValdwExtraInfoAsUInteger)EndSubPrivateSubForm1_Load(ByValsenderAsSystem.Object, ByValeAsSystem.EventArgs) HandlesMyBase.LoadMe.KeyPreview = TrueTmr.Start()EndSubPrivateSubTmr_Tick(ByValsenderAsObject, ByValeAsSystem.EventArgs) HandlesTmr.TickMouseScroll(False, 10) 'scrolls Down 10 wheel clicks'MouseScroll(True, 1) 'scrollsUp1wheelclickEndSubPrivateSubMouseScroll(ByValupAsBoolean, ByValclicksAsInteger)IfupThenmouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)Elsemouse_event(MOUSEEVENTF_WHEEL, 0, 0, -(clicks * 120), 0)EndIfEndSubEndClass
Does it work ?
And now, how can I record a human natural scroll ? to later port to playback ?
Unfortunately, the current latest version of the WebView21.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"ImportsSystem.Security.PolicyImportsMicrosoft.Web.WebView2.WinFormsImportsSystem.Runtime.InteropServicesImportsSystem.Runtime.CompilerServices'Required to load low level Win DLL's#EndRegionPublicClassScrollRecPlay#Region"OS DLL"PrivateConstMOUSEEVENTF_WHEELAsInteger = &H800'The amount of movement is specified in mouseData.PrivateConstMOUSEEVENTF_HWHEELAsInteger = &H1000'Not available for 2000 or XP <DllImport("user32.dll", EntryPoint:="mouse_event")>PrivateSharedSubmouse_event(ByValdwFlagsAsUInteger, ByValdxAsInteger, ByValdyAsInteger, ByValdwDataAsInteger, ByValdwExtraInfoAsUInteger)EndSub#EndRegion#Region"Variables"PrivateWithEventsTiRecAsNewTimerWith {.Interval = 50} : PrivateWithEventsTiPlayAsNewTimerWith {.Interval = 50}PrivateLastScrollDeltaAsInteger#EndRegion#Region"Buttons"PrivateSubbtnLoad_Click(senderAsObject, eAsEventArgs) HandlesbtnLoad.ClickWebView21.Source = NewUri(txtUrl.Text)EndSubPrivateSubbtnRec_Click(senderAsObject, eAsEventArgs) HandlesbtnRec.ClickTxtValues.Text = ""btnRec.Enabled = False : BtnStop.Enabled = TrueTiRec.Enabled = TrueEndSubPrivateSubBtnStop_Click(senderAsObject, eAsEventArgs) HandlesBtnStop.ClickbtnRec.Enabled = True : btnPlay.Enabled = True : TiRec.Enabled = FalseEndSubPrivateSubbtnPlay_Click(senderAsObject, eAsEventArgs) HandlesbtnPlay.Click'mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)Me.Text = "Be Sure "btnPlay.Enabled = FalseTiPlay.Enabled = TrueEndSub#EndRegion#Region"Timers"PrivateSubTiRec_Tick(ByValsenderAsObject, ByValeAsSystem.EventArgs) HandlesTiRec.TickTxtValues.Text = TxtValues.Text & "," & LastScrollDeltaLastScrollDelta = 0EndSubPrivateSubTiPlay_Tick(ByValsenderAsObject, ByValeAsSystem.EventArgs) HandlesTiPlay.TickMouseScroll(False, 100)Me.Text = "done"EndSub#EndRegion#Region"WebView2"#EndRegion#Region"Functions"PrivateSubMouseScroll(ByValupAsBoolean, ByValclicksAsInteger)IfupThenmouse_event(MOUSEEVENTF_WHEEL, 0, 0, (clicks * 120), 0)Elsemouse_event(MOUSEEVENTF_WHEEL, 0, 0, -(clicks * 120), 0)EndIfEndSub#EndRegionPrivateSubScrollRecPlay_MouseWheel(senderAsObject, eAsMouseEventArgs) HandlesMe.MouseWheelIfNotbtnPlay.Enabled = FalseThen'to not get fired if playback (which will call to scroll)LastScrollDelta = e.DeltaEndIfEndSubEndClass
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