fix: ложный status ok и падение без captcha_type

- без captcha_type шаг антибота пропускается, на неизвестный тип — понятная ошибка
- wait_for и pass_challenge при неудаче падают, а не возвращают текст ошибки как результат
- status "err" ставится по упавшему действию (раньше проверялся несуществующий ключ error)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
protokeyandClaude Opus 5.5 committed 2026-10-12 13:55:36 +04:00
1 parent c54500b178
commit df108dae3f
4 files changed
+13 -8

No files matched your search

+4
View File
@@ -31,6 +31,10 @@ async def pass_challenges(
success_locator: str | None = None, success_locator: str | None = None,
detect_locator: str | None = None, detect_locator: str | None = None,
timeout_ms=120_000) -> ChallengeOutcome: timeout_ms=120_000) -> ChallengeOutcome:
if not antibot_name:
# провайдер не указан — антибот не проходим, сразу к действиям
return ChallengeOutcome(True, reason="antibot not requested")
# установка дедлайна # установка дедлайна
deadline = time.monotonic() + timeout_ms / 1000 deadline = time.monotonic() + timeout_ms / 1000
+2 -1
View File
@@ -29,4 +29,5 @@ async def select_one(page: Page, provider_name: str, **kwargs) -> AntiBotProvide
provider.configure(**kwargs) provider.configure(**kwargs)
return provider return provider
else: else:
raise ProviderNotDetected() known = ", ".join(p.provider for p in _detectors)
raise ProviderNotDetected(f"unknown captcha_type {provider_name!r}, expected one of: {known}")
+3 -4
View File
@@ -74,10 +74,7 @@ async def inner_html(page: Page, act: ActionRequest, **kwargs) -> str | None:
async def wait_for(page: Page, act: ActionRequest, **kwargs) -> str | None: async def wait_for(page: Page, act: ActionRequest, **kwargs) -> str | None:
assert act.selector assert act.selector
assert 1 <= act.timeout <= 7200 assert 1 <= act.timeout <= 7200
try: await page.wait_for_selector(act.selector, timeout=act.timeout * 1000)
await page.wait_for_selector(act.selector, timeout=act.timeout * 1000)
except Exception as e:
return str(e)
@register @register
@@ -92,6 +89,8 @@ async def pass_challenge(
success_locator=act.selector or success_locator, success_locator=act.selector or success_locator,
detect_locator=detect_locator detect_locator=detect_locator
) )
if not result.cleared:
raise Exception(f"challenge not passed: {result.reason}")
return result.reason return result.reason
+4 -3
View File
@@ -135,12 +135,13 @@ async def solve(
except Exception as e: except Exception as e:
traceback.print_exc() traceback.print_exc()
result_payload = { result_payload = {
"error": str(e), "error": str(e) or type(e).__name__,
"status": False "status": False
} }
else: else:
status = not "error" in result["actions"][-1] failed = [a for a in result["actions"] if a.get("ok") is False]
error = ["Something error", None][status] status = not failed
error = None if status else f"{failed[0]['type']}: {failed[0].get('result')}"
result_payload = { result_payload = {
"status": ["err", "ok"][status], "status": ["err", "ok"][status],