Python port of Xetera/ghost-cursor, for use with Pyppeteer and Playwright.
Generate realistic, human-like mouse movement data between coordinates or navigate between elements with Pyppeteer/Playwright like the definitely-not-robot you are.
pip install python_ghost_cursor
Generating movement data between 2 coordinates.
from python_ghost_cursor import path start = { "x": 220, "y": 402, } end = { "x": 902, "y": 1032, } route = path(start, end) # [ # { "x": 100, "y": 100 }, # { "x": 108.75573501957051, "y": 102.83608396351725 }, # { "x": 117.54686481838543, "y": 106.20019239793275 }, # { "x": 126.3749821408895, "y": 110.08364505509256 }, # { "x": 135.24167973152743, "y": 114.47776168684264 } # ... and so on # ]Usage with Pyppeteer:
import asyncio import pyppeteer from python_ghost_cursor.pyppeteer import create_cursor async def main(url): selector = "#sign-up button" browser = await pyppeteer.launch(headless=False) page = await browser.newPage() cursor = createCursor(page) await page.goto(url) await page.waitForSelector(selector) await cursor.click(selector) asyncio.run(main())Usage with Playwright (async):
import asyncio from playwright.async_api import async_playwright from python_ghost_cursor.playwright_async import create_cursor async def main(): async with async_playwright() as p: selector = "#sign-up button" browser = await p.chromium.launch(channel="chrome", headless=False) page = await browser.new_page() cursor = create_cursor(page) await page.goto(url) await page.wait_for_selector(selector) await cursor.click(selector) asyncio.run(main())Usage with Playwright (sync):
from playwright.sync_api import sync_playwright from python_ghost_cursor.playwright_sync import create_cursor def main(): with sync_playwright() as p: selector = "#sign-up button" browser = p.chromium.launch(channel="chrome", headless=False) page = browser.new_page() cursor = create_cursor(page) page.goto(url) page.wait_for_selector(selector) cursor.click(selector) main()The original repo gives a description of some of the cool features, along with a good explanation of how it works.