fingerprint_utils.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import hashlib
  2. from typing import Dict
  3. class FingerprintGenerator:
  4. def __init__(self):
  5. # 按现实世界市场份额设计的权重分配(数组长度为100,代表百分比)
  6. self.platforms = (
  7. ['windows'] * 70 + # 70% 概率生成 Windows
  8. ['macos'] * 25 + # 25% 概率生成 macOS
  9. ['linux'] * 5 # 5% 概率生成 Linux
  10. )
  11. self.brands = (
  12. ['Chrome'] * 70 + # 70% 概率生成 Chrome
  13. ['Edge'] * 20 + # 20% 概率生成 Edge
  14. ['Opera'] * 5 + # 5% 概率生成 Opera
  15. ['Vivaldi'] * 5 # 5% 概率生成 Vivaldi
  16. )
  17. def generate(self, username: str) -> Dict:
  18. """
  19. 根据用户名生成固定的指纹配置
  20. """
  21. md5_hash = hashlib.md5(username.encode('utf-8')).hexdigest()
  22. seed = int(md5_hash[:8], 16) & 0x7FFFFFFF
  23. platform_index = int(md5_hash[8:12], 16) % len(self.platforms)
  24. platform = self.platforms[platform_index]
  25. brand_index = int(md5_hash[12:16], 16) % len(self.brands)
  26. brand = self.brands[brand_index]
  27. return {
  28. "username": username,
  29. "seed": seed,
  30. "platform": platform,
  31. "brand": brand
  32. }
  33. def get_cli_args(self, username: str) -> list:
  34. """
  35. 直接生成用于启动浏览器的命令行参数列表
  36. """
  37. fp = self.generate(username)
  38. return [
  39. f"--fingerprint={fp['seed']}",
  40. f"--fingerprint-platform={fp['platform']}",
  41. f"--fingerprint-brand={fp['brand']}"
  42. ]
  43. # ================= 测试代码 =================
  44. if __name__ == "__main__":
  45. fp_tool = FingerprintGenerator()
  46. # 测试用户 A
  47. user_a = fp_tool.generate("alice_2024")
  48. print(f"User: alice_2024 -> Seed: {user_a['seed']}, OS: {user_a['platform']}, Browser: {user_a['brand']}")
  49. # 测试用户 B
  50. user_b = fp_tool.generate("bob_crypto")
  51. print(f"User: bob_crypto -> Seed: {user_b['seed']}, OS: {user_b['platform']}, Browser: {user_b['brand']}")
  52. # 测试用户 C
  53. user_c = fp_tool.generate("jerry_crypto")
  54. print(f"User: bob_crypto -> Seed: {user_c['seed']}, OS: {user_c['platform']}, Browser: {user_c['brand']}")
  55. # 测试用户 D
  56. user_d = fp_tool.generate("luna_crypto")
  57. print(f"User: bob_crypto -> Seed: {user_d['seed']}, OS: {user_d['platform']}, Browser: {user_d['brand']}")
  58. # 测试用户 E
  59. user_e = fp_tool.generate("jone_crypto")
  60. print(f"User: bob_crypto -> Seed: {user_e['seed']}, OS: {user_e['platform']}, Browser: {user_e['brand']}")
  61. # 测试用户 F
  62. user_f = fp_tool.generate("tom_crypto")
  63. print(f"User: bob_crypto -> Seed: {user_f['seed']}, OS: {user_f['platform']}, Browser: {user_f['brand']}")
  64. # 模拟获取命令行参数
  65. args = fp_tool.get_cli_args("alice_2024")
  66. print("\n生成的命令行参数:")
  67. print(" ".join(args))