import asyncio from patchright.async_api import Page from twocaptcha import TwoCaptcha class Captcha: ctype = "captcha" def __init__(self, api_key: str): self._api_key: str = api_key self._solver = TwoCaptcha(api_key) def get_balance(self) -> float: return self._solver.balance() async def solve(self, selector: str, page: Page) -> str: raise NotImplementedError() async def _run(self, fun, /, *args, **kwargs): resp = await asyncio.to_thread(fun, *args, **kwargs) return resp["code"] async def hcaptcha(self, url, site_key, is_invisible): resp = await self._run(self._solver.hcaptcha, site_key, url, invisible=is_invisible) return resp async def recaptcha(self, url, site_key): resp = await self._run(self._solver.recaptcha, site_key, url) return resp async def turnstile(self, url, site_key): resp = await self._run(self._solver.turnstile, site_key, url) return resp def load_captcha(key, captcha_type) -> Captcha: for cls in Captcha.__subclasses__(): if cls.ctype == captcha_type: break else: raise Exception("Invalid captcha type") return cls(key)