fix: добавление обхода для recaptcha
This commit is contained in:
1 parent
b77f25d3cd
commit
4cc068a616
5 files changed
+130
-49
No files matched your search
+24
-28
@@ -1,16 +1,8 @@
|
||||
"""
|
||||
|
||||
dl.formRow:nth-child(3) > dd:nth-child(2) > div:nth-child(1)
|
||||
<div data-xf-init="h-captcha" data-sitekey="83433494-1c9f-446b-85c3-e27b8b7375e1" data-invisible="">
|
||||
|
||||
iframe[data-hcaptcha-widget-id="0dm47zf0gn8t"]
|
||||
|
||||
textarea[id="g-recaptcha-response-0dm47zf0gn8t"]
|
||||
textarea[id="h-captcha-response-0dm47zf0gn8t"]
|
||||
|
||||
|
||||
Модуль для решения капчи от reCaptcha.
|
||||
"""
|
||||
import logging
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
|
||||
from .base import Captcha, Page
|
||||
|
||||
@@ -23,31 +15,35 @@ class SolverReCaptcha(Captcha):
|
||||
ctype = "recaptcha"
|
||||
|
||||
async def solve(self, selector, page: Page):
|
||||
# TODO: реализовать решение капчи
|
||||
"""
|
||||
|
||||
#recaptcha-token
|
||||
<input type="hidden" id="recaptcha-token" value="03AFcWeA616y0mA8rDFLMgCol7SoloUIVOOwzuqE50zb1Ft93vP_i2o...">
|
||||
|
||||
#g-recaptcha-response
|
||||
<textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid rgb(193, 193, 193); margin: 10px 25px; padding: 0px; resize: none; display: none;"></textarea>
|
||||
|
||||
:param selector:
|
||||
:param page:
|
||||
:return:
|
||||
"""
|
||||
div_container = page.locator(selector)
|
||||
await div_container.wait_for()
|
||||
|
||||
if not div_container:
|
||||
return None
|
||||
|
||||
site_key = await div_container.get_attribute("data-sitekey")
|
||||
is_invisible = bool(await div_container.get_attribute("data-invisible"))
|
||||
site_key_input_element = page.locator("iframe[title='reCAPTCHA']")
|
||||
src_value = await site_key_input_element.get_attribute("src")
|
||||
url_splitted = urlparse(src_value)
|
||||
query_params = parse_qs(url_splitted.query)
|
||||
site_key = query_params["k"][0]
|
||||
|
||||
iframe = div_container.locator("iframe:nth-child(1)")
|
||||
await iframe.wait_for()
|
||||
textarea_id_postfix = await iframe.get_attribute("data-hcaptcha-widget-id")
|
||||
textarea_element = page.locator("#g-recaptcha-response")
|
||||
|
||||
textarea_g = await page.query_selector(f"#g-recaptcha-response-{textarea_id_postfix}")
|
||||
textarea_h = await page.query_selector(f"#h-captcha-response-{textarea_id_postfix}")
|
||||
code = await self.recaptcha(page.url, site_key)
|
||||
|
||||
code = await self.recaptcha(page.url, site_key, is_invisible)
|
||||
await textarea_g.evaluate((
|
||||
"(el, value) => {"
|
||||
"el.value = value;"
|
||||
"el.dispatchEvent(new Event('input', {bubbles: true}));"
|
||||
"}"
|
||||
), code)
|
||||
await textarea_h.evaluate((
|
||||
await textarea_element.evaluate((
|
||||
"(el, value) => {"
|
||||
"el.value = value;"
|
||||
"el.dispatchEvent(new Event('input', {bubbles: true}));"
|
||||
@@ -55,7 +51,7 @@ class SolverReCaptcha(Captcha):
|
||||
), code)
|
||||
return None
|
||||
|
||||
async def recaptcha(self, url, site_key, is_invisible):
|
||||
resp = self._solver.recaptcha(site_key, url, invisible=is_invisible)
|
||||
async def recaptcha(self, url, site_key):
|
||||
resp = self._solver.recaptcha(site_key, url)
|
||||
logger.debug(f"recaptcha response: {resp}")
|
||||
return resp["code"]
|
||||
Reference in new issue
Block a user