Un sito sa distinguere un agente AI da una persona?
10 stack di automazione lanciati davvero contro una pagina viva — non un elenco di consigli.
Gli agenti AI hanno iniziato a navigare, confrontare e comprare sulle tue pagine. Che tu li voglia accogliere o tenere fuori, la prima domanda è la stessa: il tuo sito riesce a vederli? Abbiamo lanciato browser automatici veri — headless puro, con finestra, e patch stealth via via migliori — contro una pagina viva, registrando per ognuno quali controlli sono scattati. Si legge la scala, non l'ultima cella: ogni controllo che uno stack nascosto supera costa al suo autore un altro intervento specifico, in ogni sessione e su ogni sito.
Cosa ottengono gli agenti AI dalle tue pagine?
Scansione gratuita: cosa leggono ChatGPT, Claude e Perplexity sul tuo sito, e cosa sistemare.
Gli stack, e cosa li ha traditi
Ogni riga è un browser davvero lanciato contro la pagina. Le etichette sono i controlli scattati.
- Playwright, default headless (chromium headless shell)Rilevato
5 controlli in pagina scattati · 2 controlli sugli header scattati
navigator.webdriver is true"Headless" in the User-Agent stringWebGL renderer is a software rasterizerZero browser plugins and MIME typesNo real interaction observed on the page"Headless" in the User-Agent headerNo Accept-Language header sent - Playwright, full Chromium in headless modeRilevato
4 controlli in pagina scattati · 1 controlli sugli header scattati
navigator.webdriver is true"Headless" in the User-Agent stringWebGL renderer is a software rasterizerNo real interaction observed on the page"Headless" in the User-Agent header - Playwright, headed Chromium on a virtual displayRilevato
2 controlli in pagina scattati · 0 controlli sugli header scattati
navigator.webdriver is trueWebGL renderer is a software rasterizer - Headless shell + the public stealth patch (spoofs webdriver, plugins, languages, cores, window size, permissions, WebGL vendor) and a real-browser User-AgentRilevato
6 controlli in pagina scattati · 2 controlli sugli header scattati
The webdriver flag has been rewrittennavigator.plugins is not a real PluginArrayNative browser functions have been replacedSpoofed properties answer to an object that is not a browserUser-Agent string disagrees with Client HintsNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + a stealth patch written AGAINST these checks (flag moved to the prototype, real PluginArray of real Plugin objects, every patched function reporting itself as native, UA client hints aligned)Rilevato
2 controlli in pagina scattati · 2 controlli sugli header scattati
Spoofed properties answer to an object that is not a browserNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + the same counter-patch, plus a brand check inside every fake getter (it refuses an object that is not a browser, exactly as the engine does)Rilevato
2 controlli in pagina scattati · 2 controlli sugli header scattati
The refusal itself is acted out by page codeNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + the same brand-checked counter-patch, plus stack hiding (Error.captureStackTrace strips the patch’s own frames, so the acted refusal looks like the engine’s)Non rilevato
1 controlli in pagina scattati · 2 controlli sugli header scattati
No real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + the same stack-hiding counter-patch, but installed in the top frame only (a patch that does not think about frames)Rilevato
2 controlli in pagina scattati · 2 controlli sugli header scattati
A fresh realm disagrees with this oneNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - The best evasion measured here (stack-hiding counter-patch, installed in every frame — the only row that comes out clean), plus the driver moving the mouse across the page: the answer to "automation never touches anything"Non rilevato
1 controlli in pagina scattati · 2 controlli sugli header scattati
Pointer moved in a perfectly even progressionNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Not a browser at all: a raw HTTP client (Node http.request) that copies every Chrome header value — User-Agent, Sec-CH-UA, Accept-Language, sec-fetch-* — but not the order a real Chromium network stack emits them inNon rilevato
0 controlli in pagina scattati · 1 controlli sugli header scattati
Headers arrive in an order no Chromium emits
Quali controlli si ripagano
Quanti stack prende ogni controllo, contati solo sulle righe dove è giudicabile.
| Controllo | Livello | Stack presi |
|---|---|---|
| No real interaction observed on the page | In pagina | 7 su 9 |
| No Accept-Language header sent | Header HTTP | 7 su 10 |
| Sec-CH-UA version disagrees with the User-Agent | Header HTTP | 6 su 10 |
| navigator.webdriver is true | In pagina | 3 su 9 |
| WebGL renderer is a software rasterizer | In pagina | 3 su 9 |
| Spoofed properties answer to an object that is not a browser | In pagina | 2 su 9 |
| "Headless" in the User-Agent string | In pagina | 2 su 9 |
| "Headless" in the User-Agent header | Header HTTP | 2 su 10 |
| Native browser functions have been replaced | In pagina | 1 su 9 |
| navigator.plugins is not a real PluginArray | In pagina | 1 su 8 |
| Zero browser plugins and MIME types | In pagina | 1 su 9 |
| Pointer moved in a perfectly even progression | In pagina | 1 su 1 |
| A fresh realm disagrees with this one | In pagina | 1 su 9 |
| The refusal itself is acted out by page code | In pagina | 1 su 8 |
| User-Agent string disagrees with Client Hints | In pagina | 1 su 9 |
| The webdriver flag has been rewritten | In pagina | 1 su 9 |
| Headers arrive in an order no Chromium emits | Header HTTP | 1 su 10 |
| Known Selenium / ChromeDriver / PhantomJS markers | In pagina | 0 su 9 |
| navigator.hardwareConcurrency is zero | In pagina | 0 su 9 |
| Empty navigator.languages | In pagina | 0 su 9 |
| Window outerWidth/outerHeight is zero | In pagina | 0 su 9 |
| Permissions API vs Notification.permission mismatch | In pagina | 0 su 9 |
| No sec-fetch-* headers sent | Header HTTP | 0 su 10 |
| Header User-Agent differs from the in-page one | Header HTTP | 0 su 10 |
Censimento dal vivo
112 sessioni hanno eseguito il self-check nel proprio browser e rimandato un verdetto anonimo — mai un fingerprint. Quota di quelle sessioni in cui ogni segnale è scattato:
| Controllo | Quota di sessioni |
|---|---|
| Zero browser plugins and MIME types | 95% |
| "Headless" in the User-Agent string | 92% |
| navigator.webdriver is true | 90% |
| WebGL renderer is a software rasterizer | 90% |
| No real interaction observed on the page | 17% |
| Pointer moved in a perfectly even progression | 5% |
| User-Agent string disagrees with Client Hints | 2% |
| The webdriver flag has been rewritten | 1% |
| Native browser functions have been replaced | 1% |
Finora le sessioni vengono in gran parte dal nostro banco e dai crawler, non da un pubblico terzo: va letto come catalogo dei segnali, non come misura del web.
Solo browser della famiglia Chromium (quelli installati sulla macchina che misura) e nessuna GPU su di essa, quindi il controllo sul renderer software scatta su ogni riga — lì è una proprietà della macchina, non dell'automazione. Ultima misura: 2026-09-20.