Detectarea boților din TRACIO identifică browsere automatizate, instrumente headless și atacuri scriptate folosind o arhitectură pe două straturi: colectarea pe partea de client, în agentul de browser, și analiza pe partea de server. Acoperă framework-urile de automatizare uzuale, browserele headless, agenții AI de navigare și browserele anti-detect cu falsuri pozitive aproape de zero, punând totodată automat pe lista de permisiuni crawlerele legitime ale motoarelor de căutare.
Agentul de browser rulează un set amplu de verificări și raportează rezultatele
acestora. Pe server, rezultatele sunt ponderate într-un scor de bot, iar scorul se
mapează la un verdict. Un număr mic de indicatori lipsiți de ambiguitate sunt
decisivi prin ei înșiși și impun un verdict bot, indiferent de restul.
Ce verificări rulează, cum sunt ponderate și unde se află pragurile nu sunt publicate — la niciun plan. Documentarea lor le-ar spune operatorilor de boți exact ce să schimbe pentru a trece de protecție. Ce primești în schimb este verdictul, o etichetă de tip de bot și — începând cu Business — coduri de motiv care numesc clasa de observație din spatele deciziei.
Fiecare identificare poartă un verdict de bot. Ajunge la tine ca
bot.result în payload-ul webhook-ului și ca result.bot în
SDK-ul de client.
| Rezultat | Descriere |
|---|---|
human | Niciun indicator de automatizare găsit. Și crawlerele verificate se rezolvă la human. |
bot | Automatizare sau acces scriptat detectat. Îl însoțește o etichetă bot.type. |
uncertain | Semnale mixte sau slabe — nici clar uman, nici clar automatizat. |
Aceasta se mapează la câmpul de business decision.action (real, fake sau
suspicious) folosit în tot dashboard-ul și în payload-ul webhook-ului.
Verdictul este însoțit de bot.score. În versiunile 2 și 3 ale payload-ului de webhook este
un număr zecimal 0..100 — exact numărul pe care dashboard-ul îl arată pentru acea
vizită. (În schema înghețată a versiunii 1 este o fracție 0..1; vezi
Webhooks.)
bot.type este prezent atunci când rezultatul este bot. Este fie numele unui bot
sau runtime recunoscut, fie o familie, atunci când numirea verificării concrete
ar dezvălui mecanismul intern al detectorului:
bot.type | Semnificație |
|---|---|
playwright, jsdom, electron | A fost identificat runtime-ul de automatizare numit |
browser_use, claude_computer_use, skyvern, genspark, fellou | A fost identificat agentul AI de navigare numit |
automation | Instrumente de automatizare, fără a numi verificarea concretă |
headless | Un browser care rulează fără interfață de utilizator |
antidetect | Un build anti-detect / de falsificare a amprentei |
extension | O extensie de browser care conduce automatizarea, un proxy sau un VPN |
privacy_browser | Un build de browser întărit pentru confidențialitate (de exemplu Mullvad Browser) |
other | Detectat, dar în afara vocabularului publicat |
Lista este închisă prin proiectare: o verificare adăugată mâine în detector apare ca
other, în loc să îi scape numele intern. Tratează bot.type ca pe o etichetă după
care ramifici decizia, nu ca pe un enum exhaustiv de validat — în timp se adaugă
runtime-uri noi cu nume propriu.
Pe planurile Business și Enterprise, payload-ul webhook-ului poartă un array
reasons — cel mult opt intrări, sortate după importanță. Un cod numește clasa de
observație, niciodată verificarea din spatele ei:
| Cod | Ce înseamnă |
|---|---|
automation_signature | Urme ale instrumentelor de automatizare |
headless_browser | Un browser fără interfață de utilizator |
anonymous_browser | Un build întărit pentru confidențialitate sau anti-detect deghizat în banal |
privacy_hardening | Setări agresive de confidențialitate |
behavior_anomaly | Tipare de interacțiune neumane |
fingerprint_tampering | Valori care ar trebui să concorde între ele nu concordă |
environment_anomaly | Mediul de execuție este inconsecvent pe plan intern |
identity_mismatch | Identitatea declarată nu se potrivește cu ceea ce se observă |
virtual_environment | Un emulator în locul hardware-ului fizic |
strong_automation_evidence | Indicatori de bot lipsiți de ambiguitate — decisivi prin ei înșiși |
detection_signal | Alte verificări care s-au declanșat |
severity este high, medium sau low și reprezintă ponderea din verdict pe
care o explică această clasă la această vizită — nu o proprietate fixă a codului.
Același cod poate sosi ca high la o vizită și ca low la alta, deci nu îl păstra
în cache ca pe o constantă.
privacy_hardening merită o atenție aparte: se declanșează atât pentru vizitatori
obișnuiți preocupați de confidențialitate, cât și pentru încercări de eludare.
Cântărește-l împreună cu restul, în loc să acționezi numai pe baza lui.
virtual_environment provine din detectarea emulatoarelor. Pe web nu există un verdict
separat „rulează sub un hypervisor”: indiciile pe care le poate vedea un browser — un
randator software generic, un număr neobișnuit de mic de nuclee — apar la fel de des pe
mașini obișnuite fără driver de GPU și în sesiuni de desktop la distanță, așa că nu le
transformăm într-un verdict pe care ar trebui să îl pui la îndoială.
| Funcționalitate | Disponibilitate |
|---|---|
| Detectarea automatizării, headless și a agenților AI | Toate planurile |
| Listă de permisiuni pentru crawlere verificate | Toate planurile |
| Detectarea emulatoarelor | Toate planurile |
Indicatori anti-detect (bot.antidetect_score, 0..100) | Pro și peste |
| Coduri de motiv, bloc comportamental | Business și peste |
| Detectarea DevTools | Business și peste |
Scorul anti-detect este încă în curs de calibrare.
bot.antidetect_scoreeste raportat pentru ca să îl poți observa și să îți ajustezi propria politică — tratează-l ca pe o intrare în decizia ta de risc, nu ca pe un motiv de sine stătător pentru a bloca.
Verificările specifice mobilului nu sunt eficace pe web. Detectarea de root, jailbreak, aplicații clonate/duale și Frida depinde de semnale native de mobil pe care un browser nu le poate colecta. TRACIO livrează doar SDK-uri de browser, așa că bazează-te pe verdictele de automatizare, headless, agenți AI, anti-detect, emulator și comportamentale, care sunt pe deplin active pe web.
Boții buni cunoscuți sunt recunoscuți după user-agent și apoi verificați față de IP-ul care se conectează: o interogare DNS inversă pe IP, o verificare că hostname-ul rezultat aparține domeniului operatorului și o interogare directă care confirmă că se rezolvă înapoi la același IP. Aceasta este procedura de verificare pe care o publică înșiși operatorii crawlerelor.
| Crawler | Domenii verificate |
|---|---|
.googlebot.com, .google.com | |
| Bing | .search.msn.com |
| Apple | .applebot.apple.com |
| Yahoo | .crawl.yahoo.net |
| Yandex | .yandex.com, .yandex.net, .yandex.ru |
| DuckDuckGo | .duckduckgo.com |
Un crawler verificat se rezolvă la human. O cerere care pretinde a fi Googlebot în
timp ce IP-ul ei aparține demonstrabil altcuiva este clasificată drept bot — o
interogare pur și simplu absentă sau expirată nu este tratată ca dovadă de
falsificare.
Dinamica interacțiunii — mișcarea cursorului, cadența tastaturii, derularea —
alimentează verdictul ca dovadă a prezenței unui om, nu a faptului care om este.
Începând cu Business, agregatul este livrat în blocul behavior al webhook-ului:
{ "behavior": { "score": 87, "verdict": "human", "confidence": 0.92 }}score merge de la 0..100 (mai mare = mai uman), verdict este human,
uncertain sau bot, iar confidence (0..1) arată pe câte dovezi se sprijină
verdictul — o vizită scurtă cu două mișcări de cursor obține aici un scor mic chiar și
atunci când verdictul pare decisiv.
Blocul este prezent numai atunci când scorarea comportamentală chiar a rulat pentru acea vizită. Un bloc lipsă înseamnă „fără date”, niciodată „nimic suspect” — nu citi absența lui ca pe un semnal curat.
SDK-ul de client expune un boolean de conveniență, result.bot.detected, plus un
confidence pe o scară 0..100:
const result = await tracio.getResult()
if (result.bot.detected) { console.warn(`Bot detected (confidence ${result.bot.confidence})`) showCaptcha() return}
await login(credentials)Pe serverul tău, acționează pe baza livrării webhook-ului.
Verdictul de bot se află în obiectul bot — bot.result și bot.type:
// `event` is the webhook delivery body (/docs/webhooks)app.post("/webhook/tracio", async (req, res) => { const event = req.body
if (event.bot?.result === "bot") { await db.blockedRequests.insert({ visitorId: event.visitor_id, botType: event.bot.type, ip: event.ip, timestamp: new Date(), }) }
res.status(200).send("OK")})Valorile zero și cele goale sunt omise din payload, așa că citește bot.type defensiv,
în loc să îl faci obligatoriu în schema ta.
Detectarea boților din TRACIO este proiectată pentru falsuri pozitive aproape de zero, însă există cazuri-limită:
| Scenariu | Risc | Atenuare |
|---|---|---|
Extensii de browser care modifică navigator | Scăzut | Validarea încrucișată între multe verificări previne declanșarea de una singură |
| Software corporativ de securitate | Foarte scăzut | Clasificarea drept headless cere dovezi care se coroborează |
| Instrumente de accesibilitate | Niciunul | API-urile de accesibilitate nu alimentează detectarea boților |
| Utilizatori de VPN/proxy | Niciunul | Indicatorii de rețea sunt urmăriți separat de verdictul de bot |
Dacă observi falsuri pozitive, examinează bot.type (și reasons începând cu
Business) pentru a înțelege ce clasă de observație s-a declanșat, apoi ajustează-ți
politica. Vezi Depanare pentru cauzele obișnuite.