From acfc5c6397f3712d6bc517e5e40de2d56de3b764 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Mon, 1 Dec 2025 13:55:57 +0100 Subject: [PATCH] feat: Enhance Amazon stealth with comprehensive anti-detection Added comprehensive stealth techniques to bypass Amazon bot detection: - Complete HTTP headers (Accept, Accept-Language, Sec-Fetch-*, etc.) - Extended chrome object with loadTimes, csi, app - Permissions API override - Plugins, languages, platform spoofing - Battery API mocking This significantly improves bot detection evasion compared to the basic 2-line stealth that was insufficient for Amazon's detection systems. --- app/services/amazon_scraper_service.py | 63 ++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/app/services/amazon_scraper_service.py b/app/services/amazon_scraper_service.py index 8f5c6f6..965e6c0 100644 --- a/app/services/amazon_scraper_service.py +++ b/app/services/amazon_scraper_service.py @@ -190,12 +190,69 @@ class AmazonScraperService: ), locale="fr-FR", timezone_id="Europe/Paris", + # Additional stealth parameters + extra_http_headers={ + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + "Accept-Language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7", + "Accept-Encoding": "gzip, deflate, br", + "DNT": "1", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "none", + "Sec-Fetch-User": "?1", + "Cache-Control": "max-age=0", + }, ) - # Stealth mode + # Comprehensive stealth mode await context.add_init_script(""" - Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); - window.chrome = { runtime: {} }; + // Remove webdriver property + Object.defineProperty(navigator, 'webdriver', { + get: () => undefined + }); + + // Add chrome property + window.chrome = { + runtime: {}, + loadTimes: function() {}, + csi: function() {}, + app: {} + }; + + // Override permissions + const originalQuery = window.navigator.permissions.query; + window.navigator.permissions.query = (parameters) => ( + parameters.name === 'notifications' ? + Promise.resolve({ state: Notification.permission }) : + originalQuery(parameters) + ); + + // Add plugins + Object.defineProperty(navigator, 'plugins', { + get: () => [1, 2, 3, 4, 5] + }); + + // Add languages + Object.defineProperty(navigator, 'languages', { + get: () => ['fr-FR', 'fr', 'en-US', 'en'] + }); + + // Override platform + Object.defineProperty(navigator, 'platform', { + get: () => 'Win32' + }); + + // Mock battery API + Object.defineProperty(navigator, 'getBattery', { + get: () => () => Promise.resolve({ + charging: true, + chargingTime: 0, + dischargingTime: Infinity, + level: 1 + }) + }); """) await context.route("**/*", lambda route: route.continue_())