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 antidetect 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 primiți î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 dumneavoastră 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 versiunea 2 a 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; vedeți
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 antidetect / 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. Tratați bot.type ca pe o etichetă după
care ramificați 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 antidetect 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ți
î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ăriți-l împreună cu restul, în loc să acționați 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 puneți 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 antidetect (bot.antidetectScore, 0..100) | Pro și peste |
| Coduri de motiv, bloc comportamental | Business și peste |
| Detectarea DevTools | Business și peste |
Scorul antidetect este încă în curs de calibrare.
bot.antidetectScoreeste raportat pentru ca să îl puteți observa și să vă ajustați propria politică — tratați-l ca pe o intrare în decizia dumneavoastră 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ă bazați-vă pe verdictele de automatizare, headless, agenți AI, antidetect, 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ți 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 dumneavoastră, acționați 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.visitorId, 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ă citiți bot.type defensiv,
în loc să îl faceți obligatoriu în schema dumneavoastră.
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ă observați falsuri pozitive, examinați bot.type (și reasons începând cu
Business) pentru a înțelege ce clasă de observație s-a declanșat, apoi ajustați-vă
politica. Vedeți Depanare pentru cauzele obișnuite.