chore: добавлена поддержка решения капчи hcaptcha на формах

This commit is contained in:
protokey committed 2026-09-11 22:42:34 +04:00
1 parent 89b4dd2677
commit f5871710ab
9 files changed
+186 -32

No files matched your search

+21 -8
View File
@@ -2,6 +2,7 @@ import asyncio
from playwright.async_api import Page
from captcha import load_captcha
from engine.schemas import ActionRequest
_actions: dict = {}
@@ -13,54 +14,66 @@ def register(fun) -> None:
@register
async def fill(page: Page, act: ActionRequest) -> str | None:
async def fill(page: Page, act: ActionRequest, **kwargs) -> str | None:
assert act.selector
assert act.value
await page.fill(act.selector, act.value)
@register
async def delay(page: Page, act: ActionRequest) -> str | None:
async def captcha(page: Page, act: ActionRequest, captcha_key: str, **kwargs) -> str | None:
assert act.selector
assert act.value
assert captcha_key
captcha_solver = load_captcha(captcha_key, act.value)
await captcha_solver.solve(act.selector, page)
@register
async def delay(page: Page, act: ActionRequest, **kwargs) -> str | None:
assert act.value
await asyncio.sleep(int(act.value))
@register
async def mouse_move(page: Page, act: ActionRequest) -> str | None:
async def mouse_move(page: Page, act: ActionRequest, **kwargs) -> str | None:
assert act.selector
element = await page.query_selector(act.selector)
await element.hover(scroll="auto")
@register
async def click(page: Page, act: ActionRequest) -> str | None:
async def click(page: Page, act: ActionRequest, **kwargs) -> str | None:
assert act.selector
element = await page.query_selector(act.selector)
await element.click()
@register
async def inner_html(page: Page, act: ActionRequest) -> str | None:
async def inner_html(page: Page, act: ActionRequest, **kwargs) -> str | None:
assert act.selector
element = await page.query_selector(act.selector)
return await element.inner_html()
@register
async def wait_for(page: Page, act: ActionRequest) -> str | None:
async def wait_for(page: Page, act: ActionRequest, **kwargs) -> str | None:
assert act.selector
assert 1 <= act.timeout <= 7200
await page.wait_for_selector(act.selector, timeout=act.timeout * 1000)
async def execute(page: Page, actions: list[ActionRequest]) -> list[dict]:
async def execute(page: Page, actions: list[ActionRequest], captcha: str | None = None) -> list[dict]:
actions_result = []
ctx = {
"captcha_key": captcha,
}
for act in actions:
new_line = {
"type": act.type,
}
try:
result = await _actions[act.type](page, act)
result = await _actions[act.type](page, act, **ctx)
except Exception as e:
new_line["ok"] = False
new_line["result"] = str(e)
+7 -1
View File
@@ -20,8 +20,14 @@ class SolveRequest(BaseModel):
"""
url: str
proxy: str
actions: list[ActionRequest]
timeout: int | None = None
screen: str = "1280x720"
user_agent: str | None = None
actions: list[ActionRequest]
html: bool = False
captcha: str | None = None
captcha_selector: str | None = None
captcha_type: str | None = None