From 22f8aedaa49f6ec04d5b7f9c90169042b0dbcb8d Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Sat, 29 Nov 2025 09:51:10 +0100 Subject: [PATCH] feat: Add centralized search configuration for sites, proxies, and user agents, and create browserless service module. --- app/core/search_config.py | 13 ++++++++++++ app/services/browserless_service.py | 31 ++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/app/core/search_config.py b/app/core/search_config.py index 9d9082b..f041384 100644 --- a/app/core/search_config.py +++ b/app/core/search_config.py @@ -203,4 +203,17 @@ COOKIE_ACCEPT_SELECTORS = [ "button:has-text('Accepter tout')", "button:has-text('Accepter')", "button:has-text('J\\'accepte')", + # Promotional Popups / Modals + ".modal-close", + ".close-modal", + ".popup-close", + "button[aria-label='Close']", + "button[aria-label='Fermer']", + ".js-modal-close", + "div[class*='popup'] button[class*='close']", + "div[class*='modal'] button[class*='close']", + # Specific Gifi/Discount popups + ".popin-close", + "#popin-close", + "a.close-popin", ] diff --git a/app/services/browserless_service.py b/app/services/browserless_service.py index 2d3d668..74963d9 100644 --- a/app/services/browserless_service.py +++ b/app/services/browserless_service.py @@ -120,15 +120,28 @@ class BrowserlessService: except Exception: pass - async def handle_cookie_banners(self, page: Page): - """Attempt to close cookie banners""" + async def handle_popups(self, page: Page): + """Attempt to close cookie banners and popups""" try: - for selector in COOKIE_ACCEPT_SELECTORS: - if await page.locator(selector).first.is_visible(timeout=200): - await page.locator(selector).first.click() - logger.info(f"Closed cookie banner with {selector}") - await asyncio.sleep(0.5) - return + # Check for multiple popups (cookies + promo) + # We iterate through all selectors and click any that are visible + # We do this in a loop to handle sequential popups + for _ in range(3): # Try up to 3 times for sequential popups + clicked_something = False + for selector in COOKIE_ACCEPT_SELECTORS: + try: + # Use a short timeout for check + element = page.locator(selector).first + if await element.is_visible(timeout=100): + await element.click() + logger.info(f"Closed popup/banner with {selector}") + await asyncio.sleep(0.5) # Wait for animation + clicked_something = True + except Exception: + continue + + if not clicked_something: + break except Exception: pass @@ -152,7 +165,7 @@ class BrowserlessService: # Retry logic could be handled here or by caller, # for now we return what we have, caller decides - await self.handle_cookie_banners(page) + await self.handle_popups(page) await self.simulate_human_behavior(page) if wait_selector: