This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Monday, 08 December 2025
स्कॉपर्स वास्तविक उपयोगकर्ताओं की नकल करने के लिए AI का प्रयोग शुरू करने के बारे में हैं, इसलिए मैंने एक बोट डिटेक्टर बनाया जो सीखता है
प्रमुख संकल्पना: व्यवहारिक रूटिंग यह एक नया वर्ग सक्षम करता है - जहां पारदर्शी , समायोज्य | " |teams \ " detectors और सीखने वाली प्रणालियों को सीखा गया व्यवहार पैटर्नों पर आधारित प्रतिक्रियात्मक रूप से ट्रैफिक को मार्ग दिखाता है YARP गेटवेबॉट्स कभी भी आपके बैकएण्ड तक नहीं पहुँचते
बोट पता लगाना आधुनिक वेब इंजीनियरिंग में सबसे कठिन समस्याओं में से एक है
इसलिए नहीं क्योंकि बॉट्स अधिक स्मार्ट हो गया - लेकिन इसलिए AI ने वास्तविक उपयोगकर्ता व्यवहार को अनुकरण करने के लिए इसे क्षुद्र बना दिया:
वाणिज्यिक समाधान इस समस्या को हल करता है, लेकिन वे1 महंगा होते हैं।
मैं कुछ अलग करना चाहता था
तो मैंने बनाया mostlylucid.botdetection के लिए एक मॉड्यूलर learning bot detection engine
यह सरल शुरू हुआ और फिर बहुत अधिक रोचक चीज़ में विकसित हो गया
यह एक वास्तविक है
एक scraper spoofs:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120
वैध दिखता है
लेकिन यह भूल जाता है एक हेडर Chrome हमेशा भेजता है:
Sec-Fetch-Mode
और इसके Accept-Language हेडर नहीं matches claimed locale
और अनुरोध दर स्पष्ट रूप से स्वचालित है
एक संकेत ठीक है
सिस्टम इसे milliseconds के नीचे चिह्नित करता है
यह संपूर्ण डिजाइन का आधार है एक बड़े पर निर्भर नहीं करें
इस परियोजना के मूल में-,, यह वास्तव में bot पता लगाने के बारे में नहीं है।
आधुनिक scrapers अधिक अनुकूल जीवों की तरह व्यवहार करते हैं। वे सीखते हैं।
यहां का दर्शन सरल है।
यह सिस्टम पारदर्शी होने के लिए बनाया गया है।
कई छोटे डिटेक्टरों के माध्यम से अनुरोध प्रवाह
इसे एक हवाई अड्डे सुरक्षा जांच बिंदु के रूप में सोचें
flowchart TB
subgraph Request["Incoming Request"]
R[HTTP Request]
end
subgraph FastPath["Fast Path (< 100ms)"]
UA[User-Agent Check]
HD[Header Analysis]
IP[Datacenter IP Lookup]
RT[Rate Anomalies]
HE[Heuristic Model]
end
subgraph SlowPath["Slow Path (Async Learning)"]
LLM[LLM Reasoning]
Learn[Weight Learning]
end
subgraph Output["Decision"]
Score[Risk Score 0-1]
Action[Allow / Throttle / Block]
end
R --> UA & HD & IP & RT
UA & HD & IP & RT --> HE
HE --> Score --> Action
HE -.-> LLM -.-> Learn
Learn -.->|updates weights| HE
style FastPath stroke:#10b981,stroke-width:2px
style SlowPath stroke:#6366f1,stroke-width:2px
style Output stroke:#f59e0b,stroke-width:2px
समक्रमिक रूप से चलाता है
यह पकड़ता है 80% bots instantly
पृष्ठभूमि में चलाता है
यह अनुकूलन bots - सबसे अधिक लोगों को पकड़ता है सोचना वे उपयोक्ता पर "regex के साथ पकड़ रहे हैं
dotnet add package Mostlylucid.BotDetection
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBotDetection();
var app = builder.Build();
app.UseBotDetection();
app.Run();
यह है
| जाँचें | क्या यह पाता है |
|---|---|
| उपयोगकर्ता-अभिकर्ता ज्ञात बॉट्स | |
| शीर्षिका | गुम सुरक्षा शीर्षिकाएँ |
| आईपी क्लाउड होस्ट जो अपने को गृह उपयोगकर्ता बनाते हैं | |
| दर | स्वचालन बर्स्ट्स |
| सुसंगतता Chrome के बिना |
सटीकता स्लीपर विशेषता है - आधुनिक बोट स्पॉफ कर सकते हैं एक संकेत लेकिन आमतौर पर क्रॉस में असफल
यहाँ'\s क्या एक वास्तविक पता लगाने की तरह दिखता है -\ यह चलाने के डेमो से है fastpath नीति (सभी डिटेक्टर समांतर में हैंM SK1 उत्पादन में, अधिकांश अनुरोध केवल 2-3 डिटेटर सहमत हो जाने के बाद जल्दी बाहर निकलते हैं
{
"policy": "fastpath",
"isBot": false,
"isHuman": true,
"humanProbability": 0.8,
"botProbability": 0.2,
"confidence": 0.76,
"riskBand": "Low",
"recommendedAction": { "action": "Allow", "reason": "Low risk (probability: 20%)" },
"processingTimeMs": 50.7,
"detectorsRan": ["UserAgent", "Ip", "Header", "ClientSide", "Behavioral", "Heuristic", "VersionAge", "Inconsistency"],
"detectorCount": 8,
"earlyExit": false
}
डिटेक्टर 8 में चलाया गया एकाधिक साक्ष्य स्रोतों में समानांतर निष्पादन
प्रत्येक डिटेक्टर एक भारित प्रभाव का योगदान करता है
| डिटेक्टर | प्रभाव | वज़न | МSK3 | भारित | ||||
|---|---|---|---|---|---|---|---|---|
| उपयोक्ता अभिकर्ता अभिकर्ता सामान्य दिखाई देता है | ||||||||
| शीर्षिका हेडर सामान्य दिखाई देते हैं | ||||||||
| व्यवहारिक अनुरोध पैटर्न सामान्य दिखाई देते हैं | ||||||||
| शल्यचिकित्सा | -0.77 | 2.0 | -1.54 मानव संभावना | |||||
| क्लाइंट साइड फ़िंगरप्रिंट वैध प्रतीत होता है | ||||||||
| संस्करण आयु ब्राउज़र | ||||||||
| असंगतता कोई हेडर नहीं | ||||||||
| आईपी स्थानीय होस्ट dev में तटस्थ |
ह्रासीय डिटेक्टर यहाँ पर प्रभावी है - यहM SK1 इसकी भारित 2x और मानव विश्वास को प्राप्त करने के लिए उपयोग किया गया \16 विशेषताएँ
प्रत्येक डिटेक्टर संकेतों का उत्सर्जन करता है जो ह्रासीय मॉडल में फीड करता है
{
"ua.is_bot": false,
"ua.raw": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
"ip.is_local": true,
"ip.address": "::1",
"header.has_accept_language": true,
"header.has_accept_encoding": true,
"header.count": 16,
"fingerprint.integrity_score": 1,
"behavioral.anomaly": false,
"heuristic.prediction": "human",
"heuristic.confidence": 0.77,
"versionage.analyzed": true
}
ये संकेत समय पर बने रहते हैं और सीखने वाली प्रणाली को प्रशिक्षित करते हैं
अंतिम निर्णय के लिए श्रेणी के आधार पर कुल प्राप्तियां
श्रेणी | अंक | | | भार || | नोट्स |----------|-------|--------|-------| | हेरिस्टिक | | | \ -1.54 | МSK3 | {\displaystyle \mathcal {4 | & quot;|,& quot ; सबसे मजबूत मानव संकेत | उपयोगकर्ता अभिकर्ता हेडर व्यवहारिक क्लाइंटसाइड संस्करण आयु असंगतता आईपी
कुल भारित अंक → मजबूत मानव संकेत
नोट यह डेमो है
fastpathऐसी नीति जो चलती है सभी दृश्यता के लिए डिटेक्टर . आरंभिक आउट सक्षम होने वाले वास्तविक उत्पादन में के तहत 10ms. यह यहाँ है क्योंकि डेमो मोड आरंभिक आउट को सभी योगदानों को दिखाने के लिए अक्षम करता है
तुलना के लिए, यहाँ demo नीति - LLM तर्क सहित पूरी पाइपलाइन असहमत होना:
{
"policy": "demo",
"isBot": false,
"isHuman": true,
"humanProbability": 0.87,
"botProbability": 0.13,
"confidence": 1.0,
"botType": "Scraper",
"riskBand": "Low",
"recommendedAction": { "action": "Allow", "reason": "Low risk (probability: 13%)" },
"processingTimeMs": 1370,
"aiRan": true,
"detectorsRan": ["UserAgent", "Ip", "Header", "ClientSide", "Behavioral",
"VersionAge", "Inconsistency", "Heuristic", "HeuristicLate", "Llm"],
"detectorCount": 10
}
सेकंड में 10 детектор - एलएलएम चला और असहमत गुर्दे के साथ
| डिटेक्टर | प्रभाव | वज़न | МSK3 | भारित | ||||
|---|---|---|---|---|---|---|---|---|
| एलएलएम | +0.85 | 2.5 | +2.13 à¤à¥à¤°à¥à¤ | |||||
| ग्रीष्मकालीन सभी प्रमाणों के साथ मानव | ||||||||
| शल्यचिकित्सा मानव संभाव्यता | ||||||||
| उपयोक्ता अभिकर्ता अभिकर्ता सामान्य दिखाई देता है | ||||||||
| शीर्षिका हेडर सामान्य दिखाई देते हैं | ||||||||
| व्यवहारिक अनुरोध पैटर्न सामान्य दिखाई देते हैं | ||||||||
| क्लाइंट साइड कोई अंगुली छाप नहीं | ||||||||
| संस्करण आयु ब्राउज़र | ||||||||
| असंगतता कोई हेडर नहीं | ||||||||
| आईपी स्थानीय होस्ट |
यह दिलचस्प मामला है - एलएलएम इसे एक संभावित बोट के रूप में चिह्नित किया जबकि सभी स्थिर डिटेक्टरों ने कहा मानव
{
"ai.prediction": "bot",
"ai.confidence": 0.85,
"ai.learned_pattern": "Browser string suggests Chrome, common in bots. Presence of cookies and a specific referer also points to a potential bot."
}
LLM का तर्क एक सिग्नल के रूप में रिकॉर्ड किया जाता है जो सीखने की प्रणाली में फिर से फीड करता है
सूचना
दो बार हियूरिस्टिक रन सभी डिटेक्टरों से पहले - आरंभिक ( सभी प्रमाणों के बाद ) & #44; और बाद में ( & #39; दोनों ने कहा कि ""\human"\ with '88%\ confidence.\
एलएलएम असहमति इसका भारित प्रभाव आंशिक रूप से हीरिस्टिक प्रतिकूल होता है
कोई औठाछाप नहीं ClientSide ने returned 0 because JS hadn
अंतिम निर्णय: अनुमति दें LLM के साथ भी संदिग्धता के साथ-साथ संयुक्त साक्ष्य मानव के पक्ष में है botType: "Scraper" फ्लैग का अर्थ है यह देख रहा है
श्रेणी विभाजन तनाव को दर्शाता है
श्रेणी | अंक | | | भार || | नोट्स |----------|-------|--------|-------| | शल्यचिकित्सा Strong human signal | | एआई LLM का कहना है कि बोट उपयोगकर्ता अभिकर्ता हेडर व्यवहारिक क्लाइंटसाइड संस्करण आयु असंगतता आईपी
कुल भारित अंक मानव जीतता है, लेकिन एलएलएम का मतभेद चिह्नित किया गया है
प्रमुख अंतर्दृष्टि जब वे असहमत होते हैं, तब प्रमाणों को भारित किया जाता है और बहुसंख्यक जीतता है, लेकिन अल्पसंख्यक राय सीखने के लिए रिकॉर्ड की जाती है
महत्वपूर्ण यह verbose आउटपुट डेमो है।
X-Bot-Confidence,X-Bot-RiskBand, आदिcontext.IsBot()जाँच करें. पूरा JSON त्रुटि सच्याना और अनुकूलन के लिए है
if (context.IsBot())
return Results.StatusCode(403);
var score = context.GetBotConfidence(); // 0.0–1.0
var risk = context.GetRiskBand(); // Low/Elevated/Medium/High
app.MapGet("/api/data", Secret).BlockBots();
app.MapGet("/sitemap.xml", Sitemap)
.BlockBots(allowVerifiedBots: true);
जोखिम स्तर कार्य का मार्गदर्शन करते हैं
जोखिम | विश्वसनीयता | -------- | ---------- | ------------------ | कम | उन्नयनित | | 0.3–0.5 | || | लॉग | / | दर मध्यम उच्च
आवश्यक नहीं है - लेकिन उन्नत स्वचालन पकड़ने के लिए उपयोगी
सिस्टम में एक हियूरिस्टिक डिटेक्टर शामिल है जो गतिशील रूप से सीखे हुए वजनों के साथ लॉजिस्टिक रिग्रेसन का प्रयोग करता है
विशिष्ट लंबितता 1–5ms
{
"BotDetection": {
"AiDetection": {
"Heuristic": {
"Enabled": true,
"LoadLearnedWeights": true,
"EnableWeightLearning": true
}
}
}
}
विशेषताएँ गतिशील रूप से निकाली जाती हैं - नए पैटर्न स्वचालित रूप से डिफ़ॉल्ट वजन प्राप्त करते हैं और समय के साथ सीखते हैं अपने यातायात
evasive bots को पकड़ता है जो तेजी से नियमों के लिए दिखते हैं ओलामाCity name (optional, probably does not need a translation) स्थानीय LLM निष्कर्ष के लिए.
ollama pull gemma3:1b
{
"BotDetection": {
"AiDetection": {
"Provider": "Ollama",
"Ollama": { "Model": "gemma3:1b" }
}
}
}
AI है असफल-safe यदि यह नीचे हो जाता है तो -
स्थिर ब्लॉक सूची अस्थिर हो जाती है तो यह प्रणाली सीखता है
flowchart LR
N[Neutral] -->|repeated bad activity| S[Suspect]
S -->|confirmed| B[Blocked]
B -->|no activity| S
S -->|stays clean| N
style B stroke:#ef4444,stroke-width:2px
style S stroke:#eab308,stroke-width:2px
style N stroke:#10b981,stroke-width:2px
पैटर्न समय के साथ टूटते हैं
टूटने के बिना आप हमेशा के लिए वैध उपयोगकर्ताओं को अवरोधित करें
{
"BotDetection": {
"Learning": {
"Enabled": true,
"ScoreDecayTauHours": 168,
"GcEligibleDays": 90
}
}
}
वहाँ’ भी है डोकर-पहली YARP उल्टी प्रॉक्सी जो खोज चलाता है पहले अनुरोध आपके एप्लिकेशन पर चिपकते हैं
flowchart LR
I[Internet] --> G[YARP Gateway]
G -->|Human| App[Your App]
G -->|Search Engine Bot| App
G -->|Malicious| Block[403]
इसे एक लाइन में चलाएँ
docker run -p 80:8080 \
-e DEFAULT_UPSTREAM=http://your-app:3000 \
scottgal/mostlylucid.yarpgateway
पर काम करता है
अनुकूल रूटिंग के लिए
services:
gateway:
image: scottgal/mostlylucid.yarpgateway
volumes:
- ./yarp.json:/app/config/yarp.json
{
"BotDetection": {
"BotThreshold": 0.7,
"BlockDetectedBots": true,
"EnableAiDetection": true,
"Learning": { "Enabled": true },
"PathPolicies": {
"/api/login": "strict",
"/sitemap.xml": "allowVerifiedBots"
}
}
}
यह भाग है अगले भागों को गहराई में खोना
भावी रोडमैप
अगर आप एक बोट डिटेक्टर चाहते हैं तो आप कर सकते है समझना, बढ़ाना, और कहीं भी चलानायह श्रृंखला आपके लिए है
गैर लाइसेंस – सार्वजनिक डोमेन. आप चाहें जिस तरह इस्तेमाल करें
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.