skills/playwright-bot-bypass/SKILL.md
This skill should be used when the user asks to "bypass bot detection", "avoid CAPTCHA", "stealth browser automation", "undetected playwright", "bypass Google bot check", "rebrowser-playwright", or needs to automate websites that detect and block bots.
npx skillsauth add greekr4/playwright-bot-bypass playwright-bot-bypassInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Bypass bot detection systems using rebrowser-playwright with stealth techniques. This approach successfully passes bot detection tests like bot.sannysoft.com and enables automation on sites with aggressive bot protection (Google, Cloudflare, etc.).
Standard Playwright/Puppeteer exposes several automation signatures:
| Detection Point | Standard Playwright | This Solution |
|-----------------|---------------------|---------------|
| WebDriver property | navigator.webdriver = true | Removed |
| WebGL Renderer | SwiftShader (software) | Real GPU (Apple M2, etc.) |
| User Agent | Contains "HeadlessChrome" | Clean Chrome UA |
| Chrome runtime | Missing properties | Complete chrome.runtime |
npm install rebrowser-playwright
import { chromium } from 'rebrowser-playwright';
const browser = await chromium.launch({
headless: false,
channel: 'chrome' // Use real Chrome browser
});
const context = await browser.newContext();
// Remove WebDriver property
await context.addInitScript(() => {
delete Object.getPrototypeOf(navigator).webdriver;
});
const page = await context.newPage();
await page.goto('https://example.com');
Drop-in replacement for playwright that patches automation detection:
The navigator.webdriver property is the most common detection method:
await context.addInitScript(() => {
delete Object.getPrototypeOf(navigator).webdriver;
});
Always use channel: 'chrome' to launch the user's installed Chrome:
chromium.launch({
headless: false,
channel: 'chrome'
});
See examples/stealth-google-search.mjs for a complete working example that:
Verify bypass effectiveness at https://bot.sannysoft.com:
node scripts/bot-detection-test.mjs
All items should show green (passed).
scripts/bot-detection-test.mjs - Test bot detection statusscripts/stealth-template.mjs - Reusable stealth browser templateexamples/stealth-google-search.mjs - Google search without CAPTCHAexamples/ab-test.mjs - Compare detected vs stealth side-by-sideexamples/stealth-twitter-scrape.mjs - Twitter/X profile scraping without loginheadless: false (headed mode)channel: 'chrome')Python playwright-stealth cannot fully bypass bot detection.
| Environment | bot.sannysoft.com | Google Search | |-------------|-------------------|---------------| | Node.js rebrowser-playwright | ✅ Pass | ✅ Works | | Python playwright-stealth | ✅ Pass | ❌ CAPTCHA |
Why?
rebrowser-playwright: Chromium binary-level patch → uses real GPUplaywright-stealth: JavaScript-level patch only → SwiftShader exposedundetected-chromedriver fully bypasses bot detection in Python!
| Library | bot.sannysoft.com | Google Search | |---------|-------------------|---------------| | playwright-stealth | ✅ Pass | ❌ CAPTCHA | | undetected-chromedriver | ✅ Pass | ✅ Works! |
pip install undetected-chromedriver
import undetected_chromedriver as uc
# Check your Chrome version at chrome://version
driver = uc.Chrome(version_main=133)
driver.get("https://www.google.com")
search_box = driver.find_element("name", "q")
search_box.send_keys("your search query")
search_box.submit()
version_main matching your Chrome versionchrome://versionFor Electron/Node.js apps, call Node.js script from Python:
import subprocess
result = subprocess.run(['node', 'stealth-script.mjs', query], capture_output=True)
rebrowser-playwright, not playwrightchannel: 'chrome' is setaddInitScript runs before navigation# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --version
# Linux
google-chrome --version
This happens with regular playwright. Confirm import is from rebrowser-playwright:
// Correct
import { chromium } from 'rebrowser-playwright';
// Wrong - will be detected
import { chromium } from 'playwright';
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.