FAEA/tests/manual/verify_tls.py

75 lines
2.7 KiB
Python

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())