{
  "schemaVersion": "1.0",
  "item": {
    "slug": "stealth-browser",
    "name": "Stealth Browser",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Mayuqi-crypto/stealth-browser",
    "canonicalUrl": "https://clawhub.ai/Mayuqi-crypto/stealth-browser",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/stealth-browser",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=stealth-browser",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/cf_bypass.py",
      "scripts/login_session.py",
      "scripts/proxy_rotate.py",
      "scripts/session_manager.py",
      "scripts/smart_login.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/stealth-browser"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/stealth-browser",
    "agentPageUrl": "https://openagent3.xyz/skills/stealth-browser/agent",
    "manifestUrl": "https://openagent3.xyz/skills/stealth-browser/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/stealth-browser/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Stealth Browser Automation",
        "body": "Silent, undetectable web automation combining multiple anti-detection layers."
      },
      {
        "title": "Quick Login Workflow (IMPORTANT)",
        "body": "When user asks to login to any website:\n\nOpen in headed mode (visible browser for manual login):\n\npython scripts/stealth_session.py -u \"https://target.com/login\" -s sitename --headed\n\nUser logs in manually in the visible browser\n\n\nSave session after login confirmed:\n\npython scripts/stealth_session.py -u \"https://target.com\" -s sitename --headed --save\n\nFuture use - load saved session (headless):\n\npython scripts/stealth_session.py -u \"https://target.com\" -s sitename --load\n\nSessions stored in: ~/.clawdbot/browser-sessions/<sitename>.json"
      },
      {
        "title": "1. 先静默后显示",
        "body": "优先使用 headless 模式静默尝试\n如果失败或需要验证码，再切换到 headed 显示模式\n避免打扰用户操作"
      },
      {
        "title": "2. 断点续传",
        "body": "长任务使用 task_runner.py 管理状态：\n\nfrom task_runner import TaskRunner\ntask = TaskRunner('my_task')\ntask.set_total(100)\nfor i in items:\n    if task.is_completed(i):\n        continue  # 跳过已完成\n    # 处理...\n    task.mark_completed(i)\ntask.finish()"
      },
      {
        "title": "3. 超时处理",
        "body": "默认单页超时: 30秒\n长任务每50项保存一次进度\n失败自动重试3次"
      },
      {
        "title": "4. 记录尝试",
        "body": "所有登录尝试记录在: ~/.clawdbot/browser-sessions/attempts.json"
      },
      {
        "title": "Architecture",
        "body": "┌─────────────────────────────────────────────────────┐\n│                  Stealth Browser                     │\n├─────────────────────────────────────────────────────┤\n│  Layer 1: Anti-Detection Engine                      │\n│  - puppeteer-extra-plugin-stealth                   │\n│  - Browser fingerprint spoofing                     │\n│  - WebGL/Canvas/Audio fingerprint masking           │\n├─────────────────────────────────────────────────────┤\n│  Layer 2: Challenge Bypass                          │\n│  - Cloudflare Turnstile/JS Challenge               │\n│  - hCaptcha / reCAPTCHA integration                │\n│  - 2Captcha / Anti-Captcha API                     │\n├─────────────────────────────────────────────────────┤\n│  Layer 3: Session Persistence                       │\n│  - Cookie storage (JSON/SQLite)                    │\n│  - localStorage sync                               │\n│  - Multi-profile management                        │\n├─────────────────────────────────────────────────────┤\n│  Layer 4: Proxy & Identity                         │\n│  - Rotating residential proxies                    │\n│  - User-Agent rotation                             │\n│  - Timezone/Locale spoofing                        │\n└─────────────────────────────────────────────────────┘"
      },
      {
        "title": "Install Core Dependencies",
        "body": "npm install -g puppeteer-extra puppeteer-extra-plugin-stealth\nnpm install -g playwright\npip install undetected-chromedriver DrissionPage"
      },
      {
        "title": "Optional: CAPTCHA Solvers",
        "body": "Store API keys in ~/.clawdbot/secrets/captcha.json:\n\n{\n  \"2captcha\": \"YOUR_2CAPTCHA_KEY\",\n  \"anticaptcha\": \"YOUR_ANTICAPTCHA_KEY\",\n  \"capsolver\": \"YOUR_CAPSOLVER_KEY\"\n}"
      },
      {
        "title": "Optional: Proxy Configuration",
        "body": "Store in ~/.clawdbot/secrets/proxies.json:\n\n{\n  \"rotating\": \"http://user:pass@proxy.provider.com:port\",\n  \"residential\": [\"socks5://ip1:port\", \"socks5://ip2:port\"],\n  \"datacenter\": \"http://dc-proxy:port\"\n}"
      },
      {
        "title": "1. Stealth Session (Python - Recommended)",
        "body": "# scripts/stealth_session.py - use for maximum compatibility\nimport undetected_chromedriver as uc\nfrom DrissionPage import ChromiumPage\n\n# Option A: undetected-chromedriver (Selenium-based)\ndriver = uc.Chrome(headless=True, use_subprocess=True)\ndriver.get(\"https://nowsecure.nl\")  # Test anti-detection\n\n# Option B: DrissionPage (faster, native Python)\npage = ChromiumPage()\npage.get(\"https://cloudflare-protected-site.com\")"
      },
      {
        "title": "2. Stealth Session (Node.js)",
        "body": "// scripts/stealth.mjs\nimport puppeteer from 'puppeteer-extra';\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth';\n\npuppeteer.use(StealthPlugin());\n\nconst browser = await puppeteer.launch({\n  headless: 'new',\n  args: [\n    '--disable-blink-features=AutomationControlled',\n    '--disable-dev-shm-usage',\n    '--no-sandbox'\n  ]\n});\n\nconst page = await browser.newPage();\nawait page.goto('https://bot.sannysoft.com'); // Verify stealth"
      },
      {
        "title": "Open Stealth Page",
        "body": "# Using agent-browser with stealth profile\nagent-browser --profile ~/.stealth-profile open https://target.com\n\n# Or via script\npython scripts/stealth_open.py --url \"https://target.com\" --headless"
      },
      {
        "title": "Bypass Cloudflare",
        "body": "# Automatic CF bypass with DrissionPage\nfrom DrissionPage import ChromiumPage\n\npage = ChromiumPage()\npage.get(\"https://cloudflare-site.com\")\n# DrissionPage waits for CF challenge automatically\n\n# Manual wait if needed\npage.wait.ele_displayed(\"main-content\", timeout=30)\n\nFor stubborn Cloudflare sites, use FlareSolverr:\n\n# Start FlareSolverr container\ndocker run -d --name flaresolverr -p 8191:8191 ghcr.io/flaresolverr/flaresolverr\n\n# Request clearance\ncurl -X POST http://localhost:8191/v1 \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"cmd\":\"request.get\",\"url\":\"https://cf-protected.com\",\"maxTimeout\":60000}'"
      },
      {
        "title": "Solve CAPTCHAs",
        "body": "# scripts/solve_captcha.py\nimport requests\nimport json\nimport time\n\ndef solve_recaptcha(site_key, page_url, api_key):\n    \"\"\"Solve reCAPTCHA v2/v3 via 2Captcha\"\"\"\n    # Submit task\n    resp = requests.post(\"http://2captcha.com/in.php\", data={\n        \"key\": api_key,\n        \"method\": \"userrecaptcha\",\n        \"googlekey\": site_key,\n        \"pageurl\": page_url,\n        \"json\": 1\n    }).json()\n    \n    task_id = resp[\"request\"]\n    \n    # Poll for result\n    for _ in range(60):\n        time.sleep(3)\n        result = requests.get(f\"http://2captcha.com/res.php?key={api_key}&action=get&id={task_id}&json=1\").json()\n        if result[\"status\"] == 1:\n            return result[\"request\"]  # Token\n    return None\n\ndef solve_hcaptcha(site_key, page_url, api_key):\n    \"\"\"Solve hCaptcha via Anti-Captcha\"\"\"\n    resp = requests.post(\"https://api.anti-captcha.com/createTask\", json={\n        \"clientKey\": api_key,\n        \"task\": {\n            \"type\": \"HCaptchaTaskProxyless\",\n            \"websiteURL\": page_url,\n            \"websiteKey\": site_key\n        }\n    }).json()\n    \n    task_id = resp[\"taskId\"]\n    \n    for _ in range(60):\n        time.sleep(3)\n        result = requests.post(\"https://api.anti-captcha.com/getTaskResult\", json={\n            \"clientKey\": api_key,\n            \"taskId\": task_id\n        }).json()\n        if result[\"status\"] == \"ready\":\n            return result[\"solution\"][\"gRecaptchaResponse\"]\n    return None"
      },
      {
        "title": "Persistent Sessions",
        "body": "# scripts/session_manager.py\nimport json\nimport os\nfrom pathlib import Path\n\nSESSIONS_DIR = Path.home() / \".clawdbot\" / \"browser-sessions\"\nSESSIONS_DIR.mkdir(parents=True, exist_ok=True)\n\ndef save_cookies(driver, session_name):\n    \"\"\"Save cookies to JSON\"\"\"\n    cookies = driver.get_cookies()\n    path = SESSIONS_DIR / f\"{session_name}_cookies.json\"\n    path.write_text(json.dumps(cookies, indent=2))\n    return path\n\ndef load_cookies(driver, session_name):\n    \"\"\"Load cookies from saved session\"\"\"\n    path = SESSIONS_DIR / f\"{session_name}_cookies.json\"\n    if path.exists():\n        cookies = json.loads(path.read_text())\n        for cookie in cookies:\n            driver.add_cookie(cookie)\n        return True\n    return False\n\ndef save_local_storage(page, session_name):\n    \"\"\"Save localStorage\"\"\"\n    ls = page.evaluate(\"() => JSON.stringify(localStorage)\")\n    path = SESSIONS_DIR / f\"{session_name}_localStorage.json\"\n    path.write_text(ls)\n    return path\n\ndef load_local_storage(page, session_name):\n    \"\"\"Restore localStorage\"\"\"\n    path = SESSIONS_DIR / f\"{session_name}_localStorage.json\"\n    if path.exists():\n        data = path.read_text()\n        page.evaluate(f\"(data) => {{ Object.entries(JSON.parse(data)).forEach(([k,v]) => localStorage.setItem(k,v)) }}\", data)\n        return True\n    return False"
      },
      {
        "title": "Silent Automation Workflow",
        "body": "# Complete silent automation example\nfrom DrissionPage import ChromiumPage, ChromiumOptions\n\n# Configure for stealth\noptions = ChromiumOptions()\noptions.headless()\noptions.set_argument('--disable-blink-features=AutomationControlled')\noptions.set_argument('--disable-dev-shm-usage')\noptions.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')\n\npage = ChromiumPage(options)\n\n# Navigate with CF bypass\npage.get(\"https://target-site.com\")\n\n# Wait for any challenges\npage.wait.doc_loaded()\n\n# Interact silently\npage.ele(\"@id=username\").input(\"user@email.com\")\npage.ele(\"@id=password\").input(\"password123\")\npage.ele(\"@type=submit\").click()\n\n# Save session for reuse\npage.cookies.save(\"~/.clawdbot/browser-sessions/target-site.json\")"
      },
      {
        "title": "Proxy Rotation",
        "body": "# scripts/proxy_rotate.py\nimport random\nimport json\nfrom pathlib import Path\n\ndef get_proxy():\n    \"\"\"Get random proxy from pool\"\"\"\n    config = json.loads((Path.home() / \".clawdbot/secrets/proxies.json\").read_text())\n    proxies = config.get(\"residential\", [])\n    return random.choice(proxies) if proxies else config.get(\"rotating\")\n\n# Use with DrissionPage\noptions = ChromiumOptions()\noptions.set_proxy(get_proxy())\npage = ChromiumPage(options)"
      },
      {
        "title": "User Input Required",
        "body": "To complete this skill, provide:\n\nCAPTCHA API Keys (optional but recommended):\n\n2Captcha key: https://2captcha.com\nAnti-Captcha key: https://anti-captcha.com\nCapSolver key: https://capsolver.com\n\n\n\nProxy Configuration (optional):\n\nResidential proxy provider credentials\nOr list of SOCKS5/HTTP proxies\n\n\n\nTarget Sites (for pre-configured sessions):\n\nWhich sites need login persistence?\nWhat credentials should be stored?"
      },
      {
        "title": "Files Structure",
        "body": "stealth-browser/\n├── SKILL.md\n├── scripts/\n│   ├── stealth_session.py      # Main stealth browser wrapper\n│   ├── solve_captcha.py        # CAPTCHA solving utilities\n│   ├── session_manager.py      # Cookie/localStorage persistence\n│   ├── proxy_rotate.py         # Proxy rotation\n│   └── cf_bypass.py            # Cloudflare-specific bypass\n└── references/\n    ├── fingerprints.md         # Browser fingerprint details\n    └── detection-tests.md      # Sites to test anti-detection"
      },
      {
        "title": "Testing Anti-Detection",
        "body": "# Run these to verify stealth is working:\npython scripts/stealth_open.py --url \"https://bot.sannysoft.com\"\npython scripts/stealth_open.py --url \"https://nowsecure.nl\"\npython scripts/stealth_open.py --url \"https://arh.antoinevastel.com/bots/areyouheadless\"\npython scripts/stealth_open.py --url \"https://pixelscan.net\""
      },
      {
        "title": "Integration with agent-browser",
        "body": "For simple tasks, use agent-browser with a persistent profile:\n\n# Create stealth profile once\nagent-browser --profile ~/.stealth-profile --headed open https://login-site.com\n# Login manually, then close\n\n# Reuse authenticated session (headless)\nagent-browser --profile ~/.stealth-profile snapshot\nagent-browser --profile ~/.stealth-profile click @e5\n\nFor Cloudflare or CAPTCHA-heavy sites, use Python scripts instead."
      },
      {
        "title": "Best Practices",
        "body": "Always use headless: 'new' not headless: true (less detectable)\nRotate User-Agents matching browser version\nAdd random delays between actions (100-500ms)\nUse residential proxies for sensitive targets\nSave sessions after successful login\nTest on bot.sannysoft.com before production use"
      }
    ],
    "body": "Stealth Browser Automation\n\nSilent, undetectable web automation combining multiple anti-detection layers.\n\nQuick Login Workflow (IMPORTANT)\n\nWhen user asks to login to any website:\n\nOpen in headed mode (visible browser for manual login):\npython scripts/stealth_session.py -u \"https://target.com/login\" -s sitename --headed\n\n\nUser logs in manually in the visible browser\n\nSave session after login confirmed:\n\npython scripts/stealth_session.py -u \"https://target.com\" -s sitename --headed --save\n\nFuture use - load saved session (headless):\npython scripts/stealth_session.py -u \"https://target.com\" -s sitename --load\n\n\nSessions stored in: ~/.clawdbot/browser-sessions/<sitename>.json\n\n执行策略 (IMPORTANT)\n1. 先静默后显示\n优先使用 headless 模式静默尝试\n如果失败或需要验证码，再切换到 headed 显示模式\n避免打扰用户操作\n2. 断点续传\n\n长任务使用 task_runner.py 管理状态：\n\nfrom task_runner import TaskRunner\ntask = TaskRunner('my_task')\ntask.set_total(100)\nfor i in items:\n    if task.is_completed(i):\n        continue  # 跳过已完成\n    # 处理...\n    task.mark_completed(i)\ntask.finish()\n\n3. 超时处理\n默认单页超时: 30秒\n长任务每50项保存一次进度\n失败自动重试3次\n4. 记录尝试\n\n所有登录尝试记录在: ~/.clawdbot/browser-sessions/attempts.json\n\nArchitecture\n┌─────────────────────────────────────────────────────┐\n│                  Stealth Browser                     │\n├─────────────────────────────────────────────────────┤\n│  Layer 1: Anti-Detection Engine                      │\n│  - puppeteer-extra-plugin-stealth                   │\n│  - Browser fingerprint spoofing                     │\n│  - WebGL/Canvas/Audio fingerprint masking           │\n├─────────────────────────────────────────────────────┤\n│  Layer 2: Challenge Bypass                          │\n│  - Cloudflare Turnstile/JS Challenge               │\n│  - hCaptcha / reCAPTCHA integration                │\n│  - 2Captcha / Anti-Captcha API                     │\n├─────────────────────────────────────────────────────┤\n│  Layer 3: Session Persistence                       │\n│  - Cookie storage (JSON/SQLite)                    │\n│  - localStorage sync                               │\n│  - Multi-profile management                        │\n├─────────────────────────────────────────────────────┤\n│  Layer 4: Proxy & Identity                         │\n│  - Rotating residential proxies                    │\n│  - User-Agent rotation                             │\n│  - Timezone/Locale spoofing                        │\n└─────────────────────────────────────────────────────┘\n\nSetup\nInstall Core Dependencies\nnpm install -g puppeteer-extra puppeteer-extra-plugin-stealth\nnpm install -g playwright\npip install undetected-chromedriver DrissionPage\n\nOptional: CAPTCHA Solvers\n\nStore API keys in ~/.clawdbot/secrets/captcha.json:\n\n{\n  \"2captcha\": \"YOUR_2CAPTCHA_KEY\",\n  \"anticaptcha\": \"YOUR_ANTICAPTCHA_KEY\",\n  \"capsolver\": \"YOUR_CAPSOLVER_KEY\"\n}\n\nOptional: Proxy Configuration\n\nStore in ~/.clawdbot/secrets/proxies.json:\n\n{\n  \"rotating\": \"http://user:pass@proxy.provider.com:port\",\n  \"residential\": [\"socks5://ip1:port\", \"socks5://ip2:port\"],\n  \"datacenter\": \"http://dc-proxy:port\"\n}\n\nQuick Start\n1. Stealth Session (Python - Recommended)\n# scripts/stealth_session.py - use for maximum compatibility\nimport undetected_chromedriver as uc\nfrom DrissionPage import ChromiumPage\n\n# Option A: undetected-chromedriver (Selenium-based)\ndriver = uc.Chrome(headless=True, use_subprocess=True)\ndriver.get(\"https://nowsecure.nl\")  # Test anti-detection\n\n# Option B: DrissionPage (faster, native Python)\npage = ChromiumPage()\npage.get(\"https://cloudflare-protected-site.com\")\n\n2. Stealth Session (Node.js)\n// scripts/stealth.mjs\nimport puppeteer from 'puppeteer-extra';\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth';\n\npuppeteer.use(StealthPlugin());\n\nconst browser = await puppeteer.launch({\n  headless: 'new',\n  args: [\n    '--disable-blink-features=AutomationControlled',\n    '--disable-dev-shm-usage',\n    '--no-sandbox'\n  ]\n});\n\nconst page = await browser.newPage();\nawait page.goto('https://bot.sannysoft.com'); // Verify stealth\n\nCore Operations\nOpen Stealth Page\n# Using agent-browser with stealth profile\nagent-browser --profile ~/.stealth-profile open https://target.com\n\n# Or via script\npython scripts/stealth_open.py --url \"https://target.com\" --headless\n\nBypass Cloudflare\n# Automatic CF bypass with DrissionPage\nfrom DrissionPage import ChromiumPage\n\npage = ChromiumPage()\npage.get(\"https://cloudflare-site.com\")\n# DrissionPage waits for CF challenge automatically\n\n# Manual wait if needed\npage.wait.ele_displayed(\"main-content\", timeout=30)\n\n\nFor stubborn Cloudflare sites, use FlareSolverr:\n\n# Start FlareSolverr container\ndocker run -d --name flaresolverr -p 8191:8191 ghcr.io/flaresolverr/flaresolverr\n\n# Request clearance\ncurl -X POST http://localhost:8191/v1 \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"cmd\":\"request.get\",\"url\":\"https://cf-protected.com\",\"maxTimeout\":60000}'\n\nSolve CAPTCHAs\n# scripts/solve_captcha.py\nimport requests\nimport json\nimport time\n\ndef solve_recaptcha(site_key, page_url, api_key):\n    \"\"\"Solve reCAPTCHA v2/v3 via 2Captcha\"\"\"\n    # Submit task\n    resp = requests.post(\"http://2captcha.com/in.php\", data={\n        \"key\": api_key,\n        \"method\": \"userrecaptcha\",\n        \"googlekey\": site_key,\n        \"pageurl\": page_url,\n        \"json\": 1\n    }).json()\n    \n    task_id = resp[\"request\"]\n    \n    # Poll for result\n    for _ in range(60):\n        time.sleep(3)\n        result = requests.get(f\"http://2captcha.com/res.php?key={api_key}&action=get&id={task_id}&json=1\").json()\n        if result[\"status\"] == 1:\n            return result[\"request\"]  # Token\n    return None\n\ndef solve_hcaptcha(site_key, page_url, api_key):\n    \"\"\"Solve hCaptcha via Anti-Captcha\"\"\"\n    resp = requests.post(\"https://api.anti-captcha.com/createTask\", json={\n        \"clientKey\": api_key,\n        \"task\": {\n            \"type\": \"HCaptchaTaskProxyless\",\n            \"websiteURL\": page_url,\n            \"websiteKey\": site_key\n        }\n    }).json()\n    \n    task_id = resp[\"taskId\"]\n    \n    for _ in range(60):\n        time.sleep(3)\n        result = requests.post(\"https://api.anti-captcha.com/getTaskResult\", json={\n            \"clientKey\": api_key,\n            \"taskId\": task_id\n        }).json()\n        if result[\"status\"] == \"ready\":\n            return result[\"solution\"][\"gRecaptchaResponse\"]\n    return None\n\nPersistent Sessions\n# scripts/session_manager.py\nimport json\nimport os\nfrom pathlib import Path\n\nSESSIONS_DIR = Path.home() / \".clawdbot\" / \"browser-sessions\"\nSESSIONS_DIR.mkdir(parents=True, exist_ok=True)\n\ndef save_cookies(driver, session_name):\n    \"\"\"Save cookies to JSON\"\"\"\n    cookies = driver.get_cookies()\n    path = SESSIONS_DIR / f\"{session_name}_cookies.json\"\n    path.write_text(json.dumps(cookies, indent=2))\n    return path\n\ndef load_cookies(driver, session_name):\n    \"\"\"Load cookies from saved session\"\"\"\n    path = SESSIONS_DIR / f\"{session_name}_cookies.json\"\n    if path.exists():\n        cookies = json.loads(path.read_text())\n        for cookie in cookies:\n            driver.add_cookie(cookie)\n        return True\n    return False\n\ndef save_local_storage(page, session_name):\n    \"\"\"Save localStorage\"\"\"\n    ls = page.evaluate(\"() => JSON.stringify(localStorage)\")\n    path = SESSIONS_DIR / f\"{session_name}_localStorage.json\"\n    path.write_text(ls)\n    return path\n\ndef load_local_storage(page, session_name):\n    \"\"\"Restore localStorage\"\"\"\n    path = SESSIONS_DIR / f\"{session_name}_localStorage.json\"\n    if path.exists():\n        data = path.read_text()\n        page.evaluate(f\"(data) => {{ Object.entries(JSON.parse(data)).forEach(([k,v]) => localStorage.setItem(k,v)) }}\", data)\n        return True\n    return False\n\nSilent Automation Workflow\n# Complete silent automation example\nfrom DrissionPage import ChromiumPage, ChromiumOptions\n\n# Configure for stealth\noptions = ChromiumOptions()\noptions.headless()\noptions.set_argument('--disable-blink-features=AutomationControlled')\noptions.set_argument('--disable-dev-shm-usage')\noptions.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')\n\npage = ChromiumPage(options)\n\n# Navigate with CF bypass\npage.get(\"https://target-site.com\")\n\n# Wait for any challenges\npage.wait.doc_loaded()\n\n# Interact silently\npage.ele(\"@id=username\").input(\"user@email.com\")\npage.ele(\"@id=password\").input(\"password123\")\npage.ele(\"@type=submit\").click()\n\n# Save session for reuse\npage.cookies.save(\"~/.clawdbot/browser-sessions/target-site.json\")\n\nProxy Rotation\n# scripts/proxy_rotate.py\nimport random\nimport json\nfrom pathlib import Path\n\ndef get_proxy():\n    \"\"\"Get random proxy from pool\"\"\"\n    config = json.loads((Path.home() / \".clawdbot/secrets/proxies.json\").read_text())\n    proxies = config.get(\"residential\", [])\n    return random.choice(proxies) if proxies else config.get(\"rotating\")\n\n# Use with DrissionPage\noptions = ChromiumOptions()\noptions.set_proxy(get_proxy())\npage = ChromiumPage(options)\n\nUser Input Required\n\nTo complete this skill, provide:\n\nCAPTCHA API Keys (optional but recommended):\n\n2Captcha key: https://2captcha.com\nAnti-Captcha key: https://anti-captcha.com\nCapSolver key: https://capsolver.com\n\nProxy Configuration (optional):\n\nResidential proxy provider credentials\nOr list of SOCKS5/HTTP proxies\n\nTarget Sites (for pre-configured sessions):\n\nWhich sites need login persistence?\nWhat credentials should be stored?\nFiles Structure\nstealth-browser/\n├── SKILL.md\n├── scripts/\n│   ├── stealth_session.py      # Main stealth browser wrapper\n│   ├── solve_captcha.py        # CAPTCHA solving utilities\n│   ├── session_manager.py      # Cookie/localStorage persistence\n│   ├── proxy_rotate.py         # Proxy rotation\n│   └── cf_bypass.py            # Cloudflare-specific bypass\n└── references/\n    ├── fingerprints.md         # Browser fingerprint details\n    └── detection-tests.md      # Sites to test anti-detection\n\nTesting Anti-Detection\n# Run these to verify stealth is working:\npython scripts/stealth_open.py --url \"https://bot.sannysoft.com\"\npython scripts/stealth_open.py --url \"https://nowsecure.nl\"\npython scripts/stealth_open.py --url \"https://arh.antoinevastel.com/bots/areyouheadless\"\npython scripts/stealth_open.py --url \"https://pixelscan.net\"\n\nIntegration with agent-browser\n\nFor simple tasks, use agent-browser with a persistent profile:\n\n# Create stealth profile once\nagent-browser --profile ~/.stealth-profile --headed open https://login-site.com\n# Login manually, then close\n\n# Reuse authenticated session (headless)\nagent-browser --profile ~/.stealth-profile snapshot\nagent-browser --profile ~/.stealth-profile click @e5\n\n\nFor Cloudflare or CAPTCHA-heavy sites, use Python scripts instead.\n\nBest Practices\nAlways use headless: 'new' not headless: true (less detectable)\nRotate User-Agents matching browser version\nAdd random delays between actions (100-500ms)\nUse residential proxies for sensitive targets\nSave sessions after successful login\nTest on bot.sannysoft.com before production use"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Mayuqi-crypto/stealth-browser",
    "publisherUrl": "https://clawhub.ai/Mayuqi-crypto/stealth-browser",
    "owner": "Mayuqi-crypto",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/stealth-browser",
    "downloadUrl": "https://openagent3.xyz/downloads/stealth-browser",
    "agentUrl": "https://openagent3.xyz/skills/stealth-browser/agent",
    "manifestUrl": "https://openagent3.xyz/skills/stealth-browser/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/stealth-browser/agent.md"
  }
}