Puppeteer gets caught by anti-bots and captchas.
This one runs on an anti-detect Firefox with an undetected fingerprint, compatible with your existing Puppeteer code in Python.
How it works
Anti-bots ask two questions, and reCAPTCHA, hCaptcha and Cloudflare Turnstile score the answers. invisible_puppeteer answers yes to both.
1. Is this a real browser? Yes. It is Firefox, patched at the C++ source level.
- The browser fingerprint is set inside the engine, not injected into the page: navigator, screen, GPU/WebGL, canvas, fonts, audio, WebRTC, timezone, network. Headless or headed, the same values either way.
- No Chromium, no DevTools protocol and no JavaScript shim for a page to find.
2. Is a real person using it? Yes. The actions are humanized in the driver.
- Every click, hover and drag follows a natural mouse path with human timing, no teleporting cursor.
- Input goes through the browser's real input path, so the page sees trusted events.
Install
pip install invisible-puppeteer
python -m invisible_puppeteer fetch # one-time download of the patched Firefox, sha256-verified
Requires Python 3.11 or newer. Supported platforms: Windows x86_64 / ARM64 (the x86_64 engine, under Windows' own emulation), Linux x86_64 / arm64.
Usage
Puppeteer's API in Python, with no code changes. The same launch, Browser, Page and ElementHandle as pyppeteer, Puppeteer's Python port. If you already use it, switching is the import:
- from pyppeteer import launch
+ from invisible_puppeteer import launch
import asyncio
from invisible_puppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto("https://example.com")
await page.click("a") # the mouse arcs to the link
print("seed =", browser.seed) # log it to replay the run
await browser.close()
asyncio.run(main())
Every session gets a distinct fingerprint (GPU, audio, fonts, screen, ~200 fields). Do not install pyppeteer alongside it: this package already implements its API.
Options
browser = await launch(
seed=42, # same seed, same fingerprint, every run
proxy={"server": "socks5://host:1080", "username": "u", "password": "p"},
timezone="America/New_York", # default: derived from the proxy's exit IP
pin={"screen.width": 2560, "screen.height": 1440}, # force fields, the rest stays seed-derived
headless=True, # the default: hidden desktop, real rendering, same fingerprint as headed
userDataDir="./profile", # cookies and storage survive the run
)
Proxies can be socks5, socks4, http or https, and DNS goes through them too. The viewport defaults to the fingerprint's screen size instead of Puppeteer's 800x600. The fields you can pin are the same as in invisible_playwright: pinning.
CLI
invisible-puppeteer fetch # download the engine if missing, check every cached one, print the path
invisible-puppeteer version # wrapper, core and engine versions
Related projects
- invisible_playwright: the same engine with Playwright's API, and the guides on how detection works.
- invisible_selenium: the same engine with Selenium's API.
- invisible_playwright_mcp: the same engine for AI agents, over MCP.
- invisible_core: turns a seed into a fingerprint and the fingerprint into Firefox preferences. This package depends on an exact version of it.
- firefox_antidetect_patch: the C++ patches that build the browser.
Switching from another tool?
- pyppeteer: its own README says it is no longer maintained. What that means.
- puppeteer-extra-plugin-stealth: it patches the page from JavaScript, and its last substantive commit is from mid-2024. What that means.
Development
git clone https://github.com/feder-cr/invisible_puppeteer && cd invisible_puppeteer
uv venv && uv pip install -e ".[dev]"
uv run pytest -q # unit
uv run pytest -q -m e2e # against the real browser
License
MIT, see LICENSE. The Juggler client it drives the browser with lives in invisible-core, which carries two files taken from Playwright's driver under Apache-2.0. The patched Firefox binary is MPL-2.0, built from feder-cr/firefox_antidetect_patch.
Disclaimer
This project is for educational purposes only. It is provided as-is, with no warranties. I take no responsibility for how it is used. Use it at your own risk and in compliance with the laws of your jurisdiction.
Built by Federico Elia
Metadata
Release files for invisible-puppeteer 0.6.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| invisible_puppeteer-0.6.1.tar.gz | 84.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| invisible_puppeteer-0.6.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 150.1 kB
Release files / invisible_puppeteer-0.6.1.tar.gz
| Download URL | invisible_puppeteer-0.6.1.tar.gz |
|---|---|
| Size | 84.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c94ed110d3b4b45c63bf49aff733a7f24311eb87b67e48956d1b862e606fd9d9
|
|
BLAKE2b-256 checksum How to use checksums |
7eb91d6abff8b94b7b40b773476416e3ffff13d53ea5af9217d2004a930a54de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency logRelease files / invisible_puppeteer-0.6.1-py3-none-any.whl
| Download URL | invisible_puppeteer-0.6.1-py3-none-any.whl |
|---|---|
| Size | 65.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3faf69f3e0a5d33a24a7e3dad03861465963d38fd7232d256ba0042984e63dfb
|
|
BLAKE2b-256 checksum How to use checksums |
43433c15165461f7a4a2cb924980f478d4d0baebfdffb2cbc385d931da47982b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency log