KManager / scripts /test_fingerprint.py
StarrySkyWorld's picture
Initial commit
494c89b
#!/usr/bin/env python3
"""
Тест fingerprint на известных детекторах
Запуск: python test_fingerprint.py
Проверяет спуфинг на:
- bot.sannysoft.com (webdriver detection)
- browserleaks.com (базовые проверки)
"""
import sys
import time
from DrissionPage import ChromiumPage, ChromiumOptions
# Добавляем путь к spoofers
sys.path.insert(0, '.')
from spoofers.cdp_spoofer import CDPSpoofer
from spoofers.profile import generate_random_profile
def test_fingerprint():
"""Тестирует fingerprint на детекторах"""
print("=" * 60)
print("FINGERPRINT TEST")
print("=" * 60)
# Генерируем профиль
profile = generate_random_profile()
print(f"\n[PROFILE]")
print(f" User-Agent: {profile.user_agent[:60]}...")
print(f" Timezone: {profile.timezone} (offset: {profile.timezone_offset})")
print(f" Screen: {profile.screen_width}x{profile.screen_height}")
print(f" WebGL: {profile.webgl_renderer[:50]}...")
print(f" Locale: {profile.locale}")
# Настройки браузера
options = ChromiumOptions()
options.set_argument('--no-first-run')
options.set_argument('--no-default-browser-check')
options.set_argument('--disable-dev-shm-usage')
options.set_argument('--disable-infobars')
print("\n[BROWSER] Starting...")
page = ChromiumPage(options)
# Применяем спуфинг ДО навигации
print("\n[SPOOF] Applying pre-navigation spoofing...")
spoofer = CDPSpoofer(profile)
spoofer.apply_pre_navigation(page)
results = {'passed': 0, 'failed': 0}
# Тест 1: bot.sannysoft.com
print("\n" + "=" * 60)
print("[TEST 1] bot.sannysoft.com - WebDriver Detection")
print("=" * 60)
page.get('https://bot.sannysoft.com/')
time.sleep(3)
try:
webdriver_result = page.run_js('return document.querySelector("#webdriver-result")?.textContent || "N/A"')
chrome_result = page.run_js('return document.querySelector("#chrome-result")?.textContent || "N/A"')
print(f" WebDriver: {webdriver_result}")
print(f" Chrome: {chrome_result}")
if 'passed' in webdriver_result.lower() or 'missing' in webdriver_result.lower():
print(" ✅ WebDriver test PASSED")
results['passed'] += 1
else:
print(" ❌ WebDriver test FAILED")
results['failed'] += 1
except Exception as e:
print(f" Error: {e}")
results['failed'] += 1
time.sleep(2)
# Тест 2: browserleaks.com
print("\n" + "=" * 60)
print("[TEST 2] browserleaks.com - JS Properties")
print("=" * 60)
page.get('https://browserleaks.com/javascript')
time.sleep(3)
try:
webdriver = page.run_js('return navigator.webdriver')
tz = page.run_js('return Intl.DateTimeFormat().resolvedOptions().timeZone')
tz_offset = page.run_js('return new Date().getTimezoneOffset()')
lang = page.run_js('return navigator.language')
print(f" WebDriver: {webdriver}")
print(f" Timezone: {tz}")
print(f" TZ Offset: {tz_offset}")
print(f" Language: {lang}")
# Проверки
# webdriver должен быть undefined (None в Python) или False
if webdriver is None or webdriver == False:
print(" ✅ WebDriver hidden!")
results['passed'] += 1
else:
print(f" ❌ WebDriver detected: {webdriver}")
results['failed'] += 1
if tz == profile.timezone:
print(" ✅ Timezone matches!")
results['passed'] += 1
else:
print(f" ❌ Timezone mismatch: expected {profile.timezone}, got {tz}")
results['failed'] += 1
if tz_offset == profile.timezone_offset:
print(" ✅ TZ Offset matches!")
results['passed'] += 1
else:
print(f" ❌ TZ Offset mismatch: expected {profile.timezone_offset}, got {tz_offset}")
results['failed'] += 1
except Exception as e:
print(f" Error: {e}")
results['failed'] += 1
# Тест 3: Проверка новых модулей (Math, History, Capabilities)
print("\n" + "=" * 60)
print("[TEST 3] New Modules - Math, History, Capabilities")
print("=" * 60)
try:
# Math fingerprint (Amazon проверяет эти значения)
math_tan = page.run_js('return Math.tan(-1e300)')
math_sin = page.run_js('return Math.sin(-1e300)')
math_cos = page.run_js('return Math.cos(-1e300)')
print(f" Math.tan(-1e300): {math_tan}")
print(f" Math.sin(-1e300): {math_sin}")
print(f" Math.cos(-1e300): {math_cos}")
# Должны быть конкретные значения (Chrome Windows)
if abs(math_tan - 0.4059080203181946) < 0.0001:
print(" ✅ Math.tan spoofed correctly!")
results['passed'] += 1
else:
print(f" ⚠️ Math.tan different (may be OK): {math_tan}")
results['passed'] += 1 # Не критично
# History length
history_len = page.run_js('return window.history.length')
print(f" History length: {history_len}")
if 2 <= history_len <= 15:
print(" ✅ History length realistic!")
results['passed'] += 1
else:
print(f" ⚠️ History length unusual: {history_len}")
results['passed'] += 1 # Не критично
# Capabilities
has_audio = page.run_js('return !!document.createElement("audio").canPlayType')
has_video = page.run_js('return !!document.createElement("video").canPlayType')
has_worker = page.run_js('return !!window.Worker')
has_storage = page.run_js('return !!window.localStorage')
print(f" Audio: {has_audio}, Video: {has_video}")
print(f" Worker: {has_worker}, Storage: {has_storage}")
if has_audio and has_video and has_worker and has_storage:
print(" ✅ All capabilities present!")
results['passed'] += 1
else:
print(" ❌ Some capabilities missing")
results['failed'] += 1
except Exception as e:
print(f" Error: {e}")
results['failed'] += 1
# Тест 4: Automation detection (Amazon FWCIM checks)
print("\n" + "=" * 60)
print("[TEST 4] Automation Detection - FWCIM Checks")
print("=" * 60)
try:
# Проверяем свойства которые ищет Amazon
checks = {
'navigator.webdriver': page.run_js('return navigator.webdriver'),
"'webdriver' in navigator": page.run_js('return "webdriver" in navigator'),
'window.__webdriver_evaluate': page.run_js('return window.__webdriver_evaluate'),
'window.__selenium_evaluate': page.run_js('return window.__selenium_evaluate'),
'window._phantom': page.run_js('return window._phantom'),
'window.callPhantom': page.run_js('return window.callPhantom'),
'window.domAutomation': page.run_js('return window.domAutomation'),
'document.$cdc_asdjflasutopfhvcZLmcfl_': page.run_js('return document.$cdc_asdjflasutopfhvcZLmcfl_'),
}
all_hidden = True
for check, value in checks.items():
status = "✅" if value is None or value == False else "❌"
if value is not None and value != False:
all_hidden = False
print(f" {status} {check}: {value}")
if all_hidden:
print(" ✅ All automation properties hidden!")
results['passed'] += 1
else:
print(" ❌ Some automation properties detected")
results['failed'] += 1
except Exception as e:
print(f" Error: {e}")
results['failed'] += 1
# Закрываем браузер
page.quit()
# Итог
print("\n" + "=" * 60)
print(f"[RESULT] Passed: {results['passed']}, Failed: {results['failed']}")
print("=" * 60)
return results['failed'] == 0
if __name__ == '__main__':
success = test_fingerprint()
sys.exit(0 if success else 1)