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

+31 -21
View File
@@ -1,7 +1,6 @@
import json
import logging
import uuid
from datetime import datetime
from pathlib import Path
from typing import Annotated
from urllib.parse import urlsplit
@@ -16,6 +15,7 @@ from fastapi import Response
from playwright.async_api import ProxySettings
from ua_parser import user_agent_parser
import captcha
from engine import actions
from engine.schemas import SolveRequest
@@ -80,7 +80,9 @@ async def solve(
response: Response,
session_id: Annotated[str | None, Cookie()] = None
):
logger.info("Incoming payload: %s", payload)
api_key = request.headers.get('X-API-Key')
logger.info("Incoming payload: [%s] %s", session_id, payload)
global BROWSER_SLOTS
if BROWSER_SLOTS <= 0:
@@ -91,57 +93,65 @@ async def solve(
else:
BROWSER_SLOTS -= 1
api_key = request.headers.get('X-API-Key')
if not session_id:
session_id = str(uuid.uuid4())
response.set_cookie("session_id", session_id)
logger.info("Setup new session with session_id: %s", session_id)
scr_w, scr_h = payload.screen.split("x")
scr_size = int(scr_w), int(scr_h)
# TODO: распарс proxy-урл и заполнение объекта
# proxy = ProxySettings(socks5://host:port, username, password)
proxy = None
proxy = parse_proxy(payload.proxy)
user_data_dir = Path(__file__).parent / f"../extra/user_data_dir/{session_id}"
if not user_data_dir.exists():
user_data_dir.mkdir(parents=True)
ctx_opts = {
# "locale": payload.locale,
# "timezone": payload.time_zone
}
config = load_or_create_identity(user_data_dir, user_agent=payload.user_agent, **ctx_opts)
config = load_or_create_identity(user_data_dir, user_agent=payload.user_agent)
ctx_opts = {**config["context_options"], "config": config["config"]}
if payload.captcha:
# "dl.formRow:nth-child(3) > dd:nth-child(2) > div:nth-child(1)"
# hcaptcha
# rucaptcha api_key
captcha_solver = captcha.load_captcha(
payload.captcha,
payload.captcha_type
)
else:
captcha_solver = None
async with AsyncCamoufox(
persistent_context=True,
user_data_dir=user_data_dir,
proxy=proxy,
window=scr_size,
i_know_what_im_doing=True,
geoip=True,
**ctx_opts,
) as camoufo:
await camoufo.add_init_script(config["init_script"])
page = camoufo.pages[0] if camoufo.pages else await camoufo.new_page()
page.set_default_timeout(30_000)
await page.goto(url=payload.url)
actions_result = await actions.execute(page, payload.actions)
# if captcha_solver:
# assert payload.captcha_selector
# await captcha_solver.solve(payload.captcha_selector, page)
actions_result = await actions.execute(page, payload.actions, payload.captcha)
status = not "error" in actions_result[-1]
error = ["Something error", None][status]
cookies = await camoufo.cookies()
html = await page.inner_html('html')
await page.screenshot(
path=(
f"/home/sokol/PycharmProjects/WebRoboApi/extra/screenshots/"
f"{datetime.timestamp(datetime.now())}.png"
)
)
# await page.screenshot(
# path=(
# f"/home/sokol/PycharmProjects/WebRoboApi/extra/screenshots/"
# f"{datetime.timestamp(datetime.now())}.png"
# )
# )
BROWSER_SLOTS += 1
result = {
"status": ["err", "ok"][status],
"user_agent": ctx_opts["user_agent"],
"cookies": cookies,
"actions": actions_result,
}