Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/dekryptlabs/dlbrowser/stealth-scrapingnpx skills add DekryptLabs/dlbrowser --skill stealth-scrapinggit clone --depth 1 https://github.com/DekryptLabs/dlbrowserWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/dekryptlabs/dlbrowser/stealth-scraping)<a href="https://agentmods.dev/skills/dekryptlabs/dlbrowser/stealth-scraping"><img src="https://agentmods.dev/badge/skills/dekryptlabs/dlbrowser/stealth-scraping.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00080 | $0.05443 |
| Opus 5 | $0.00040 | $0.02721 |
| Sonnet 5 | $0.00016 | $0.01089 |
| Haiku 4.5 | $0.00008 | $0.00544 |
Grade A, and why
stealth-scraping scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 489 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Stealth Scraping Patterns
curl_cffi — TLS Fingerprint Impersonation
curl_cffi impersonates Chrome's exact TLS ClientHello bytes. Most WAFs that reject httpx/requests accept curl_cffi transparently.
from curl_cffi import requests as curl_requests
# Correct: proxy=URL (singular string), impersonate=specific version
session = curl_requests.AsyncSession(
impersonate="chrome131", # Use: chrome120, chrome124, chrome131 (NOT chrome133 — unsupported)
proxy=PROXY_URL, # Singular string, NOT a dict
timeout=20.0,
)
Common mistake: proxies={"http": url, "https": url} — WRONG. Use proxy=url (singular).
Common mistake: impersonate="chrome133" — NOT supported by curl_cffi. Use chrome120, chrome124, or chrome131.
playwright-stealth — Correct API
from playwright.async_api import async_playwright
from playwright_stealth import Stealth
stealth = Stealth()
# ... create context ...
await stealth.apply_stealth_async(context)
NOT from playwright_stealth import stealth_async — that import doesn't exist.
Block Detection Heuristics
CRITICAL: Strip <script> and <style> tags BEFORE checking block patterns. Many legitimate news sites embed reCAPTCHA/Cloudflare JavaScript that contains strings like "captcha", "recaptcha", "challenge-platform" — these are false positives, not actual blocks.
import re
# Patterns that indicate REAL block pages (after JS/CSS stripping)
BLOCK_PATTERNS = [
"access denied",
"verify you are human",
"enable javascript and cookies",
"theme-beta",
"rate limited",
"too many requests",
"just a moment",
"cf-browser-verification",
"enable javascript to run this app",
"bot detection",
"automated access",
"your request originates from an undeclared automated tool",
"please verify you are a human",
"security check",
"ddos protection",
]
# Context-dependent: only match on short pages (<2000 chars)
CONTEXT_BLOCK_PATTERNS = ["blocked", "robot"]
def _is_blocked(text: str) -> bool:
if not text:
return True
# STRIP JS/CSS FIRST — this is the #1 fix for false positives
cleaned = re.sub(r'<script[^>]*>.*?</script>', '', text, flags=re.DOTALL | re.IGNORECASE)
cleaned = re.sub(r'<style[^>]*>.*?</style>', '', cleaned, flags=re.DOTALL | re.IGNORECASE)
cleaned_lower = cleaned.lower()
for pattern in BLOCK_PATTERNS:
if pattern in cleaned_lower:
return True
if len(text) < 2000:
visible_text = re.sub(r'<[^>]+>', '', cleaned).lower()
visible_text = re.sub(r'\s+', ' ', visible_text).strip()
for pattern in CONTEXT_BLOCK_PATTERNS:
if pattern in visible_text:
return True
if len(text) < 500:
stripped = re.sub(r'<[^>]+>', '', text)
stripped = re.sub(r'[{};:.\\-_=+#/\\|@!~*()\[\]"\'<>,0-9\\s]', '', stripped)
if len(stripped) < 50:
return True
return False
What ships with it
16 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- references/block-detection-js-false-positives.md 2.5 KB
- references/block-detection-lessons.md 2.2 KB
- references/block-detection-patterns.md 2.5 KB
- references/browser-engine-architecture.md 3.1 KB
- references/cache-patterns.md 3.2 KB
- references/curl_cffi-vs-playwright.md 2.2 KB
- references/duckduckgo-parsing.md 1.2 KB
- references/pydantic-validation-pitfalls.md 1.1 KB
- references/research-audit-mode.md 1.1 KB
- references/rss-source-discovery.md 5.1 KB
- references/scrapeops-enterprise-codebase.md 5.5 KB
- references/search-engine-url-extraction.md 1.5 KB
- references/service-patterns.md 3.1 KB
- references/source-discovery-architecture.md 2.5 KB
- references/tavily-source-discovery.md 2.3 KB
- references/watchfiles-reload-issues.md 2.0 KB
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 489 lines · 80 tokens per session scan A bc7708c0484c
stealth-scraping is a skill published in the GitHub repository DekryptLabs/dlbrowser (1 stars, last pushed 1mo ago), licensed MIT. It adds 80 tokens to every session and 5,443 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
x402
Set up Browser Use Cloud payments with x402 — pay per request from a crypto wallet (USDC on Base mainnet), no signup or API key. Two setups it works out up front — "just use it" (set up a wallet so you or Claude Code can run cloud browser tasks paid from the wallet — Claude writes and runs throwaway scripts, nothing…
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work.
remote-browser
Controls an isolated Browser Use Cloud browser from a sandboxed machine with the current Browser Use CLI.
cloud
Documentation reference for using Browser Use Cloud — the hosted API and SDK for browser automation. Use this skill whenever the user needs help with the Cloud REST API (v2, v3, or v4), browser-use-sdk (Python or TypeScript), X-Browser-Use-API-Key authentication, cloud sessions, browser profiles, profile sync, CDP…
Agent Browser Automation
Fast Rust-based headless browser automation CLI with Node.js fallback for AI agents, featuring navigation, clicking, typing, snapshots, and structured commands optimized for agent workflows.
imprint-google-flights-live-audit
Audit and repair generated Google Flights Imprint tools. Use when validating Google Flights search, calendar, booking, airline/bag filters, one-way, round-trip, multi-city, or open-jaw behavior; when investigating selectiontoken or selectedflights producer-consumer contracts; or when live audit results are slow…