업데이트로 돌아가기
New releaseAug 14, 2026

invisible_playwright v0.7.0

Playwright용 무료 안티탐지 브라우저 스텔스: 탐지되지 않는 헤드리스 Firefox 핑거프린트. Python 스크래핑, reCAPTCHA 및 봇 탐지 우회. 오픈 소스

공유
invisible_playwright, 안티 디텍트 Firefox에서 실행되는 Playwright. 애니메이션: Playwright에서 두 줄로 전환되는 스위치, 엔진 내부에 설정된 핑거프린트, 손처럼 움직이는 마우스, 그리고 통과하는 봇 테스트.

Playwright는 안티봇과 캡차에 탐지됩니다.
이 도구는 탐지되지 않는 핑거프린트를 갖춘 안티 디텍트 Firefox에서 실행되며, 기존 Playwright 코드와 호환됩니다.

invisible_playwright - 5/5 탐지 스위트 통과

작동 방식

안티봇은 두 가지 질문을 던지고, reCAPTCHA, hCaptcha, Cloudflare Turnstile이 그 답변을 채점합니다. invisible_playwright는 두 질문 모두에 "예"라고 답합니다.

1. 실제 브라우저인가? 그렇습니다. C++ 소스 수준에서 패치된 Firefox입니다.

  • 브라우저 핑거프린트는 페이지에 주입되는 것이 아니라 엔진 내부에서 설정됩니다: navigator, screen, GPU/WebGL, canvas, 폰트, 오디오, WebRTC, 타임존, 네트워크. 헤드리스든 헤디드든 값은 동일합니다.
  • JS 심(shim)도, 오버라이드도, 읽힐 만한 이음새도 없습니다.

2. 실제 사람이 사용 중인가? 그렇습니다. 동작은 드라이버에서 인간화됩니다.

  • 모든 클릭, 호버, 드래그는 인간적인 타이밍으로 자연스러운 마우스 경로를 따르며, 커서가 순간이동하지 않습니다.
  • 각 입력은 실제 마우스와 바이트 단위로 동일합니다: 실제 입력 소스, 압력, 신뢰할 수 있는 이벤트.

설치

Windows, PowerShell에서:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
uv init --python ">=3.11" my-project
cd my-project
uv add invisible-playwright
uv run invisible-playwright fetch      # one-time download, sha256-verified: 240 MB, about 550 MB unpacked

Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv init --python ">=3.11" my-project
cd my-project
uv add invisible-playwright
uv run invisible-playwright fetch      # one-time download, sha256-verified: 262 MB (x86_64) / 253 MB (arm64), about 550 MB unpacked

지원 플랫폼: Windows x86_64, Linux x86_64 / arm64.

그런 다음 아래 예제 중 하나를 my-project의 main.py로 저장하고 uv run main.py로 실행하세요.


사용법

세션별 무작위 지문

코드 변경 없이 Playwright의 API를 동기 및 비동기로 사용합니다. 동일한 객체, 동일한 호출, 동일한 반환 값입니다. 일부 표면은 범위 밖입니다 - 트레이싱, HAR, CDP, API 요청 컨텍스트 - 그리고 각각은 조용히 오작동하는 대신 그 이유를 설명하는 문장과 함께 거부합니다. 이미 Playwright를 사용하고 있다면, 전환은 두 줄이면 됩니다:

- from playwright.sync_api import sync_playwright
- with sync_playwright() as p:
-     browser = p.firefox.launch()
+ from invisible_playwright import InvisiblePlaywright
+ with InvisiblePlaywright() as browser:

모든 세션은 고유한 지문(GPU, 오디오, 폰트, 화면, 약 200개 필드)과 베지어 곡선 마우스 움직임을 갖습니다.

동기화

from invisible_playwright import InvisiblePlaywright

with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
    page = browser.new_page()
    page.goto("https://example.com")
    page.click("#submit")   # mouse arcs to the button on a Bezier curve

비동기

from invisible_playwright.async_api import InvisiblePlaywright

async with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
    page = await browser.new_page()
    await page.goto("https://example.com")
    await page.click("#submit")

browser 객체는 playwright.sync_api.Browser / playwright.async_api.Browser이며, 모든 Playwright 메서드가 그대로 작동합니다.

실행을 재현하기 위해 시드를 기록하세요:

sf = InvisiblePlaywright()
with sf as browser:
    print("seed =", sf.seed)
    # ...

재현 가능한 지문

with InvisiblePlaywright(seed=42) as browser:
    ...   # same GPU, same canvas hash, same audio context, every run

프록시

proxy = {
    "server": "socks5://gate.example.com:1080",
    "username": "user",
    "password": "pass",
}
with InvisiblePlaywright(proxy=proxy) as browser:
    ...

지원되는 스킴: socks5, socks4, http, https. DNS는 기본적으로 프록시를 통해 라우팅되며, 로컬 유출은 없습니다.

시간대

브라우저 시간대는 timezone=을 따릅니다:

# default: timezone is auto-derived from the egress IP (proxy egress if a
# proxy is set, otherwise the host's own public IP)
with InvisiblePlaywright(proxy=proxy) as browser:
    ...

# explicit IANA zone always wins, the only way to force a specific zone
with InvisiblePlaywright(proxy=proxy, timezone="America/New_York") as browser:
    ...

특정 지문 필드 고정하기

기본적으로 모든 값은 seed에서 파생됩니다. 나머지는 seed에서 파생된 상태로 특정 값만 강제하려면:

with InvisiblePlaywright(
    seed=42,
    pin={
        "gpu.renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0, D3D11)",
        "gpu.vendor":   "Google Inc. (AMD)",
        "screen.width":  2560,
        "screen.height": 1440,
        "hardware.concurrency": 16,
    },
) as browser:
    ...

GPU pin은 자유 문자열을 설정하는 대신 검증된 페르소나 중 하나를 선택합니다. 그 이유는 약 81개의 getParameter 값과 확장 목록이 렌더러 이름과 함께 전달되며, 탐지기가 이를 렌더러 이름과 교차 검증하기 때문입니다. 풀이 보유하지 않은 이름을 지정하면 예외가 발생하며, 오류 메시지에 보유 중인 이름들이 나열됩니다.

고정 가능한 키의 전체 목록, 고정이 베이지안 샘플러와 상호작용하는 방식, 그리고 일반적인 패턴은 **docs/pinning.md**에 있습니다.


CLI

설치되는 명령은 하이픈이 포함된 invisible-playwright입니다. python -m invisible_playwright도 동일하게 작동하며 PATH에 아무것도 필요로 하지 않습니다.

invisible-playwright fetch    # download the engine if missing, check every cached
                              # one against the seal, print the path
invisible-playwright version  # wrapper, core and engine versions, and where the
                              # engine is cached

문서, 가이드 및 비교

스크립트보다 프롬프트를 선호한다면. 이 페이지는 Python 라이브러리로서의 엔진입니다. 코드를 작성하지 않고 사용하는 두 가지 방법이 있으며, 둘 다 한 줄입니다. 이미 가지고 있는 MCP 클라이언트(Claude Code, Claude Desktop, Cursor)에서 claude mcp add stealth -- uvx aihawk를 실행하거나 MCP 서버 페이지를 참고하세요. 또는 인터페이스와 모델이 포함되어 OpenRouter 키만 있으면 되는 uvx aihawk ui --openrouter-key sk-or-...를 사용하거나 AIHawk를 참고하세요. 내부 엔진은 동일하며, 두 번째는 첫 번째의 클라이언트입니다.

모든 내용은 **위키**에서 더 잘 읽히고 검색 가능하며, 하나의 평면적인 목록 대신 네 개의 섹션으로 구성되어 있습니다:

  • 문서 - 설치, 일반 Playwright에서 두 줄로 전환하는 방법, 프록시/시간대 구성, 특정 필드 고정, CLI.
  • 가이드 - 탐지가 실제로 어떻게 작동하는지, 일곱 그룹으로 나누어 설명합니다: 브라우저 아이덴티티, canvas/WebGL/폰트/ 오디오, 네트워크와 WebRTC, 자동화 계층, AI 에이전트, 소스에서 설명하는 탐지기 자체, 그리고 테스트.
  • 비교 - Camoufox, Patchright, nodriver, playwright-stealth와의 비교, 그리고 일반적으로 Chromium보다 Firefox를 선택하는 이유.
  • 통합 - Scrapy, Crawlee, Robot Framework, CodeceptJS, 테스트 러너, Playwright MCP, 그리고 맞지 않는 프레임워크를 이름으로 명시합니다.

카테고리