Skip to main content

You know who I am

Project description

undetected-playwright

Usage

  1. Download PyPi package

    pip install -U undetected-playwright
    
  2. Donload dependencies

    playwright install --with-deps
    
  3. Quick started

    import webbrowser
    from datetime import datetime
    from pathlib import Path
    
    from playwright.sync_api import sync_playwright, Page
    
    from undetected_playwright import Tarnished
    
    
    def cache_screenshot(page: Page):
        _now = datetime.now().strftime("%Y-%m-%d")
        _suffix = f"-view-new-{datetime.now().strftime('%H%M%S')}"
        path = f"result/{_now}/sannysoft{_suffix}.png"
        page.screenshot(path=path, full_page=True)
    
        webbrowser.open(f"file://{Path(path).resolve()}")
    
    
    def main():
        # Chrome 112+
        args = ["--headless=new", "--dump-dom"]
    
        with sync_playwright() as p:
            browser = p.chromium.launch(args=args)
            context = browser.new_context(locale="en-US")
    
            # Injecting Context
            Tarnished.apply_stealth(context)
            page = context.new_page()
    
            page.goto("https://bot.sannysoft.com/", wait_until="networkidle")
            cache_screenshot(page)
    
            browser.close()
    
    
    if __name__ == "__main__":
        main()
    

Demo: SyncPlaywright Sannysoft

import logging
import sys
from datetime import datetime
from enum import Enum

from playwright.sync_api import sync_playwright, Page, Route

from undetected_playwright import Tarnished

logging.basicConfig(
    level=logging.DEBUG, stream=sys.stdout, format="%(asctime)s - %(levelname)s - %(message)s"
)


class ViewMode(str, Enum):
    new = "new"
    headless = "headless"
    headful = "headful"


def _hijacker(route: Route):
    logging.debug(f"{route.request.method} {route.request.url}")
    route.continue_()


def worker(page: Page, view_mode: ViewMode | None = None):
    logging.info(f"Worker started - {view_mode=}")

    page.route("**/*", _hijacker)
    page.goto("https://bot.sannysoft.com/", wait_until="networkidle")

    # Save screenshot
    _now = datetime.now().strftime("%Y-%m-%d")
    if view_mode:
        _suffix = f"-view-{view_mode}"
    else:
        _suffix = f"-view-{datetime.now().strftime('%H%M%S')}"
    page.screenshot(path=f"result/{_now}/sannysoft{_suffix}.png", full_page=True)

    logging.info(f"Worker finished - {view_mode=}")


def bytedance(view_mode: ViewMode):
    with sync_playwright() as p:
        match view_mode:
            case "new":
                args = ["--headless=new", "--dump-dom"]
                browser = p.chromium.launch(args=args)
            case "headless":
                browser = p.chromium.launch(headless=True)
            case _:
                browser = p.chromium.launch(headless=False)

        context = browser.new_context(locale="en-US")
        Tarnished.apply_stealth(context)

        page = context.new_page()
        worker(page, view_mode)

        browser.close()


def main():
    bytedance(ViewMode.new)
    bytedance(ViewMode.headful)
    bytedance(ViewMode.headless)


if __name__ == "__main__":
    main()

Demo: AsyncPlaywright CloudFlare

import asyncio
import logging
import sys
from datetime import datetime
from enum import Enum

from playwright.async_api import async_playwright, Page, Route

from undetected_playwright import Malenia

logging.basicConfig(
    level=logging.DEBUG, stream=sys.stdout, format="%(asctime)s - %(levelname)s - %(message)s"
)


class ViewMode(str, Enum):
    new = "new"
    headless = "headless"
    headful = "headful"


async def _hijacker(route: Route):
    logging.debug(f"{route.request.method} {route.request.url}")
    await route.continue_()


async def worker(page: Page, view_mode: ViewMode | None = None):
    logging.info(f"Worker started - {view_mode=}")

    await page.route("**/*", _hijacker)
    await page.goto("https://www.nowsecure.nl", wait_until="networkidle")

    # Just for demo
    await page.wait_for_timeout(8000)

    # Save screenshot
    _now = datetime.now().strftime("%Y-%m-%d")
    if view_mode:
        _suffix = f"-view-{view_mode}"
    else:
        _suffix = f"-view-{datetime.now().strftime('%H%M%S')}"
    await page.screenshot(path=f"result/{_now}/cloudflare{_suffix}.png", full_page=True)

    logging.info(f"Worker finished - {view_mode=}")


async def bytedance(view_mode: ViewMode):
    async with async_playwright() as p:
        match view_mode:
            case "new":
                args = ["--headless=new", "--dump-dom"]
                browser = await p.chromium.launch(args=args)
            case "headless":
                browser = await p.chromium.launch(headless=True)
            case _:
                browser = await p.chromium.launch(headless=False)

        context = await browser.new_context(locale="en-US")
        await Malenia.apply_stealth(context)

        page = await context.new_page()
        await worker(page, view_mode)

        await browser.close()


async def main():
    await bytedance(ViewMode.new)
    await bytedance(ViewMode.headful)
    await bytedance(ViewMode.headless)


if __name__ == "__main__":
    asyncio.run(main())

Reference

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

undetected_playwright-0.3.0.tar.gz (35.1 kB view details)

Uploaded Source

Built Distribution

undetected_playwright-0.3.0-py3-none-any.whl (55.6 kB view details)

Uploaded Python 3

File details

Details for the file undetected_playwright-0.3.0.tar.gz.

File metadata

  • Download URL: undetected_playwright-0.3.0.tar.gz
  • Upload date:
  • Size: 35.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.10.11 Windows/10

File hashes

Hashes for undetected_playwright-0.3.0.tar.gz
Algorithm Hash digest
SHA256 c476baf095eaea6ee320dd8739e83811da6006227fa9b2492a4e3a8c0cb2b315
MD5 d0f0f1e14e12508fac7542c80c99f43a
BLAKE2b-256 526a867b2fb3386e82f902e1d3da0be52266f854209f9f6a4b08b89b9d5d6f3f

See more details on using hashes here.

File details

Details for the file undetected_playwright-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for undetected_playwright-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dbcc76a6bfdd4ebc849a26c8f084355295ec415af316b1e4fd0a2a011397df92
MD5 e57073c88ee4ed72b63fe014e33b3b78
BLAKE2b-256 622687c3790c875d3331972ab0b809d4da0900793c26a700f007fed45d2ecf90

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page