import asyncio import json from src.browser.manager import CamoufoxManager from src.extractor.client import CurlClient TARGET_URL = "https://tls.peet.ws/api/all" async def main(): print(f"Verifying TLS Fingerprints against {TARGET_URL}...\n") # 1. Browser print(">>> 1. CAMOUFOX BROWSER REQUEST") browser_fp = None session_state = None try: async with CamoufoxManager(headless=True) as browser: await browser.navigate(TARGET_URL) # Get the page content (JSON) content = await browser.page.content() # Playwright content() returns HTML, but usage of verify API returns JSON text usually wrapped in pre or body. # actually tls.peet.ws/api/all returns JSON. Browser renders it. # To get strict JSON we can use evaluate json_text = await browser.page.evaluate("() => document.body.innerText") try: browser_fp = json.loads(json_text) print("Captured Browser Fingerprint:") print(json.dumps(browser_fp.get('tls', {}), indent=2)) except: print("Could not parse JSON from browser page.") print(json_text[:200]) session_state = await browser.extract_session_state() except Exception as e: print(f"Browser failed: {e}") return if not session_state: print("Failed to get session state.") return print("\n------------------------------------------------\n") # 2. Extractor print(">>> 2. CURL EXTRACTOR REQUEST") try: async with CurlClient(session_state) as extractor: json_text = await extractor.fetch(TARGET_URL) try: extractor_fp = json.loads(json_text) print("Captured Extractor Fingerprint:") print(json.dumps(extractor_fp.get('tls', {}), indent=2)) # Comparison b_ja3 = browser_fp.get('tls', {}).get('ja3_hash') e_ja3 = extractor_fp.get('tls', {}).get('ja3_hash') print(f"\nMatch Result:") print(f"Browser JA3: {b_ja3}") print(f"Extractor JA3: {e_ja3}") if b_ja3 == e_ja3: print("✅ SUCCESS: JA3 Hashes Match!") else: print("❌ FAILURE: JA3 Mismatch.") except: print("Could not parse JSON from extractor response.") print(json_text[:200]) except Exception as e: print(f"Extractor failed: {e}") if __name__ == "__main__": asyncio.run(main())