75 lines
2.7 KiB
Python
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())
|