Make your playwright instance stealthy
Project description
playwright_stealth
Transplanted from puppeteer-extra-plugin-stealth, with some improvements. Don't expect this to bypass anything but the simplest of bot detection methods. Consider this a proof-of-concept starting point.
This is a fork. I've merged some of the outstanding PRs, added some features, and cleaned up the API surface. See the changelog. The latest major version includes breaking changes.
Install
Install from PyPi:
$ pip install playwright-stealth
Example Usage
Recommended Usage
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import Stealth
async def main():
# This is the recommended usage. All pages created will have stealth applied:
async with Stealth().use_async(async_playwright()) as p:
browser = await p.chromium.launch()
page = await browser.new_page()
webdriver_status = await page.evaluate("navigator.webdriver")
print("from new_page: ", webdriver_status)
different_context = await browser.new_context()
page_from_different_context = await different_context.new_page()
different_context_status = await page_from_different_context.evaluate("navigator.webdriver")
print("from new_context: ", different_context_status)
asyncio.run(main())
Specifying config options and applying evasions manually to an entire context
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import Stealth, ALL_EVASIONS_DISABLED_KWARGS
async def advanced_example():
# Custom configuration with specific languages
custom_languages = ("fr-FR", "fr")
stealth = Stealth(
navigator_languages_override=custom_languages,
init_scripts_only=True
)
async with async_playwright() as p:
browser = await p.chromium.launch()
context = await browser.new_context()
await stealth.apply_stealth_async(context)
# Test stealth on multiple pages
page_1 = await context.new_page()
page_2 = await context.new_page()
# Verify language settings
for i, page in enumerate([page_1, page_2], 1):
is_mocked = await page.evaluate("navigator.languages") == custom_languages
print(f"Stealth applied to page {i}: {is_mocked}")
# Example of selective evasion usage
no_evasions = Stealth(**ALL_EVASIONS_DISABLED_KWARGS)
single_evasion = Stealth(**{**ALL_EVASIONS_DISABLED_KWARGS, "navigator_webdriver": True})
print("Total evasions (none):", len(no_evasions.script_payload))
print("Total evasions (single):", len(single_evasion.script_payload))
asyncio.run(advanced_example())
Todo
- make this work with playwright.launch_persistent_context
- the difficult because sometimes we sniff the UA if an override isn't provided, and this is difficult to do when launch_persistent_context is launched
- sec-platform (we have navigator_platform)
- docs
A set of Test results
playwright with stealth
playwright without stealth
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
playwright_stealth-2.0.0.tar.gz
(25.7 kB
view details)
Built Distribution
File details
Details for the file playwright_stealth-2.0.0.tar.gz
.
File metadata
- Download URL: playwright_stealth-2.0.0.tar.gz
- Upload date:
- Size: 25.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.10.9 Linux/6.15.2-arch1-1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
4f44d416d4226689895a4d1cfb40e8d137216c0c9710ea8f84bae2dbf1186fc5
|
|
MD5 |
9393a6d9206ac98b14c67ab15a1eddcf
|
|
BLAKE2b-256 |
b050e008cc2d9f01e351d69f0bb0f394882c517611eec0ee3d5f8dd8535ce719
|
File details
Details for the file playwright_stealth-2.0.0-py3-none-any.whl
.
File metadata
- Download URL: playwright_stealth-2.0.0-py3-none-any.whl
- Upload date:
- Size: 32.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.10.9 Linux/6.15.2-arch1-1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
9eb3af1fd21619aac9fdd13a4a08141ed67159ac6310a94f7d2f758ba0cbe179
|
|
MD5 |
8c0266e886c01e491cee2754bfd5b3b5
|
|
BLAKE2b-256 |
b94ec37ac19cea166a97de3a9690ad5ba340b3f4f4fcd5bf8237cedb2c2c7076
|