Googleキャプチャを含むボット検出をバイパスするPlaywrightスキル。
Claude Code skill to bypass bot detection using
rebrowser-playwrightwith 8 stealth patches.
npx skills add greekr4/playwright-bot-bypass
Tested against Blue Ribbon Survey — a site with active bot protection:
| Metric | Stealth (this skill) | Normal Playwright |
|---|---|---|
| HTTP Status | 200 OK | 403 Forbidden |
navigator.webdriver | undefined | true |
navigator.plugins | 3 (patched) | 0 (detected) |
navigator.languages | [ko-KR, ko, en-US, en] | [en-US] |
outerWidth - innerWidth | 16 (real chrome) | 0 (headless) |
chrome.runtime | Present | Missing |
| WebGL Renderer | Apple M2 (real GPU) | SwiftShader (software) |
| User-Agent | Clean Chrome | HeadlessChrome |
| Standard Playwright (Detected) | rebrowser-playwright (Bypassed) |
|---|---|
![]() | ![]() |
| # | Patch | Bypasses |
|---|---|---|
| 1 | navigator.webdriver removal | All bot detectors |
| 2 | chrome.runtime object | Cloudflare, sannysoft |
| 3 | navigator.plugins (3 plugins) | Cloudflare Bot Management |
| 4 | navigator.languages (ko-KR, en) | Akamai (cross-checks HTTP header) |
| 5 | Permissions API normalization | PerimeterX |
| 6 | hardwareConcurrency / deviceMemory | Advanced fingerprinters |
| 7 | outerWidth / outerHeight offset | Headless detection |
| 8 | Canvas fingerprint noise | Cloudflare Turnstile |
Plus: --disable-blink-features=AutomationControlled, --no-sandbox, real Chrome via channel: 'chrome'
npm init -y && npm install rebrowser-playwright
import { createStealthBrowser, humanDelay, humanType, simulateMouseMovement } from './scripts/stealth-template.mjs';
const { browser, page } = await createStealthBrowser();
try {
await page.goto('https://example.com');
await simulateMouseMovement(page); // Natural mouse movement
await humanType(page, 'input', 'query'); // Human-like typing
await humanDelay(300, 800);
} finally {
await browser.close();
}
createStealthBrowser({
headless: false, // Required for stealth (default)
viewport: { width: 1280, height: 800 },
locale: 'ko-KR', // Browser locale
storageState: './session.json', // Cookie persistence
proxy: { server: 'http://proxy:8080' } // Proxy support
});
import { chromium } from 'rebrowser-playwright';
const browser = await chromium.launch({
headless: false,
channel: 'chrome',
args: ['--disable-blink-features=AutomationControlled', '--no-sandbox']
});
const context = await browser.newContext({
locale: 'ko-KR',
extraHTTPHeaders: { 'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7' }
});
await context.addInitScript(() => {
delete Object.getPrototypeOf(navigator).webdriver;
// ... see SKILL.md for full patch list
});
const page = await context.newPage();
try {
await page.goto('https://google.com');
} finally {
await browser.close();
}
pip install undetected-chromedriver
import undetected_chromedriver as uc
driver = uc.Chrome() # auto-detects Chrome version
driver.get('https://google.com')
Python
playwright-stealthonly patches at JS level — WebGL still shows SwiftShader. Useundetected-chromedriverinstead.
| Environment | bot.sannysoft.com | Google Search | bluer.co.kr |
|---|---|---|---|
| Standard Playwright | Detected | CAPTCHA | 403 |
| rebrowser-playwright (this) | Pass | Works | 200 |
| playwright-stealth (Python) | Pass | CAPTCHA | - |
| undetected-chromedriver | Pass | Works | - |
skills/playwright-bot-bypass/
scripts/
stealth-template.mjs # Reusable stealth factory (all examples import this)
bot-detection-test.mjs # Verify bypass at bot.sannysoft.com
examples/
stealth-google-search.mjs # Google search without CAPTCHA
ab-test.mjs # Side-by-side detected vs stealth
stealth-twitter-scrape.mjs # Twitter/X profile scraping
package.json # Dependencies (type: module)
marketplace.json
SKILL.md # Full documentation for Claude Code agents
.mjs)headless: false)| Problem | Fix |
|---|---|
ERR_MODULE_NOT_FOUND | Run npm install rebrowser-playwright in your script directory |
| Browser not opening | Verify Chrome: /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version |
| WebGL shows SwiftShader | Confirm import is from rebrowser-playwright, not playwright |
| Still getting detected | Add simulateMouseMovement() and humanDelay() between actions |
| Process hangs | Ensure browser.close() is in a finally block |
MIT
互換性
トピック