Get a custom token and verify its score using a temporary browser.
(
self,
website_url: str,
website_key: str,
verify_url: str,
action: str = "homepage",
enterprise: bool = False,
)
| 2467 | self.note_idle() |
| 2468 | |
| 2469 | async def get_custom_score( |
| 2470 | self, |
| 2471 | website_url: str, |
| 2472 | website_key: str, |
| 2473 | verify_url: str, |
| 2474 | action: str = "homepage", |
| 2475 | enterprise: bool = False, |
| 2476 | ) -> Dict[str, Any]: |
| 2477 | """Get a custom token and verify its score using a temporary browser.""" |
| 2478 | async with self._semaphore: |
| 2479 | self._solve_inflight += 1 |
| 2480 | max_retries = 3 |
| 2481 | |
| 2482 | try: |
| 2483 | for attempt in range(max_retries): |
| 2484 | playwright = None |
| 2485 | browser = None |
| 2486 | context = None |
| 2487 | try: |
| 2488 | started_at = time.time() |
| 2489 | playwright, browser, context = await self._create_browser(manage_slot_pid=False) |
| 2490 | payload = await self._execute_custom_captcha( |
| 2491 | context=context, |
| 2492 | website_url=website_url, |
| 2493 | website_key=website_key, |
| 2494 | action=action, |
| 2495 | verify_url=verify_url, |
| 2496 | enterprise=enterprise, |
| 2497 | ) |
| 2498 | |
| 2499 | if isinstance(payload, dict) and payload.get("token"): |
| 2500 | self._solve_count += 1 |
| 2501 | payload.setdefault("token_elapsed_ms", int((time.time() - started_at) * 1000)) |
| 2502 | debug_logger.log_info( |
| 2503 | f"[BrowserCaptcha] Token-{self.token_id} in-page score verification succeeded ({(time.time()-started_at)*1000:.0f}ms)" |
| 2504 | ) |
| 2505 | return payload |
| 2506 | |
| 2507 | self._error_count += 1 |
| 2508 | debug_logger.log_warning( |
| 2509 | f"[BrowserCaptcha] Token-{self.token_id} in-page score attempt {attempt+1}/{max_retries} failed" |
| 2510 | ) |
| 2511 | except Exception as e: |
| 2512 | self._error_count += 1 |
| 2513 | debug_logger.log_error( |
| 2514 | f"[BrowserCaptcha] Token-{self.token_id} in-page score browser error: {type(e).__name__}: {str(e)[:200]}" |
| 2515 | ) |
| 2516 | finally: |
| 2517 | await self._close_browser( |
| 2518 | playwright, |
| 2519 | browser, |
| 2520 | context, |
| 2521 | browser_pid=self._extract_browser_pid(browser), |
| 2522 | clear_slot_pid=False, |
| 2523 | ) |
| 2524 | |
| 2525 | if attempt < max_retries - 1: |
| 2526 | await asyncio.sleep(1) |