Alpha constantly hits walls when browsing the web:
- Cloudflare challenges block automated requests
- Anti-bot fingerprinting detects headless Chrome
- Can't maintain logged-in sessions across platforms
- Can't interact with JS-rendered content (click, scroll, type)
web_fetchis text-only,browsertool has limited stealth
Build wolfbrowser β a stealth browser Python toolkit that lets Alpha browse like a human.
wolfbrowser/
βββ __init__.py # Public API
βββ browser.py # Core browser manager (start, stop, sessions)
βββ stealth.py # Anti-detection: fingerprint rotation, CDP patches
βββ interaction.py # Human-like: mouse movement, typing, scrolling
βββ session.py # Persistent sessions: cookies, localStorage, profiles
βββ extractor.py # Page data extraction: text, structured, screenshots
βββ cli.py # CLI interface for quick use
βββ profiles/ # Saved browser profiles (cookies, state)
Based on research from nodriver, camoufox, playwright-stealth:
- No Selenium/WebDriver traces β direct CDP protocol, no chromedriver binary
- navigator.webdriver = false β patch via CDP at page creation
- Realistic fingerprint β screen size, platform, plugins, WebGL renderer
- Randomized fingerprint rotation β different "device" each session
- Human-like headers β realistic User-Agent, Accept-Language, sec-ch-ua
- Timezone/locale matching β fingerprint matches claimed location
- Chrome runtime patches β window.chrome, Permission.query, etc.
- Mouse movement β bezier curve paths, not teleporting
- Typing β variable speed, occasional pauses, realistic WPM
- Scrolling β smooth scroll with variable speed, not instant jump
- Click delays β random micro-delays between actions
- Tab behavior β background tab creation, focus switching
- Save/load cookies β persist login state to JSON
- Profile directories β Chrome user data dirs for full state persistence
- Named sessions β
wolfbrowser.load("instagram")restores full logged-in state - Session rotation β switch between profiles for different identities
- Full page text β rendered DOM, not raw HTML
- Structured extraction β CSS selectors, XPath
- Screenshots β full page or element-specific
- PDF generation β save pages as PDF
- Table extraction β HTML tables to JSON/CSV
# Quick fetch with stealth
python -m wolfbrowser fetch "https://example.com" --output markdown
# Interactive session
python -m wolfbrowser session --profile instagram
# Screenshot
python -m wolfbrowser screenshot "https://example.com" --output page.png
# Extract specific data
python -m wolfbrowser extract "https://example.com" --selector "h1,h2,p"Foundation: nodriver (ultrafunkamsterdam)
- Why: Pure Python, async, CDP-direct (no Selenium), battle-tested against Cloudflare/Imperva
- We don't USE nodriver as a dependency β we study its approach and build our own
- Key insight: CDP (Chrome DevTools Protocol) directly, no chromedriver = no webdriver detection
Why not the others:
camoufox: Firefox-based, C++ level patches = can't extend easily, tied to Firefox releasesplaywright-stealth: JS injection = detectable by sophisticated WAFsundetected-chromedriver: Legacy, still uses Selenium underneath
Our edge: nodriver's CDP approach + our own fingerprint/interaction layers = minimal detection surface
- CDP connection layer (talk to Chrome directly via websocket)
- Stealth patches (run at page creation, before any site JS executes)
- Fingerprint generator (realistic, randomized per session)
- Human interaction helpers (mouse, keyboard, scroll)
- Session persistence (cookie save/load, profile management)
- Extraction helpers (text, screenshot, structured data)
- CLI wrapper
- Integration as OpenClaw skill
- Chrome/Chromium (already on ZionAlpha via Docker/host)
websockets(CDP communication)aiohttporhttpx(async HTTP for CDP discovery)- Standard library:
asyncio,json,pathlib,random,math
Based on bot.sannysoft.com and CreepJS tests:
- navigator.webdriver = undefined
- navigator.plugins length > 0
- navigator.languages populated
- window.chrome object present
- Permissions API not leaking
- WebGL renderer = realistic GPU string
- Canvas fingerprint varies naturally
- No
cdc_markers in DOM - User-Agent consistent with sec-ch-ua
- Screen dimensions match common resolutions
- Timezone matches locale/geolocation