feature!: добавлен обход claudflare
не кликает!
This commit is contained in:
1 parent
40e5d046a9
commit
f1ed6edc7a
12 files changed
+171
-64
No files matched your search
@@ -1,3 +1,4 @@
|
||||
from .hcaptcha import SolverHCaptcha
|
||||
from .recaptcha import SolverReCaptcha
|
||||
from .turnstile import SolverTurnstile
|
||||
from .base import load_captcha
|
||||
@@ -68,6 +68,10 @@ class Captcha:
|
||||
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__():
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
"""
|
||||
|
||||
<div id="cf-turnstile" class="cf-turnstile" data-sitekey="3x00000000000000000000FF">
|
||||
<div>
|
||||
<div></div>
|
||||
<input type="hidden" name="cf-turnstile-response" id="cf-chl-widget-a3ptc_response">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Кликабельный чекбокс Cloudflare рендерит в закрытом shadow DOM — туда лезть
|
||||
не нужно и бессмысленно. sitekey и поле для ответа лежат в обычном DOM
|
||||
контейнера, поэтому решаем через API 2captcha и просто подставляем токен.
|
||||
"""
|
||||
import logging
|
||||
|
||||
from .base import Captcha, Page
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
logger.addHandler(logging.StreamHandler())
|
||||
|
||||
|
||||
class SolverTurnstile(Captcha):
|
||||
ctype = "cloudflare"
|
||||
|
||||
async def solve(self, selector, page: Page):
|
||||
container = page.locator(selector)
|
||||
await container.wait_for()
|
||||
|
||||
site_key = await container.get_attribute("data-sitekey")
|
||||
|
||||
response_input = container.locator('input[name="cf-turnstile-response"]')
|
||||
await response_input.wait_for(state="attached")
|
||||
|
||||
code = await self.turnstile(page.url, site_key)
|
||||
|
||||
await response_input.evaluate((
|
||||
"(el, value) => {"
|
||||
"el.value = value;"
|
||||
"el.dispatchEvent(new Event('input', {bubbles: true}));"
|
||||
"el.dispatchEvent(new Event('change', {bubbles: true}));"
|
||||
"}"
|
||||
), code)
|
||||
return code
|
||||
Reference in new issue
Block a user