agents.nim 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import random, strformat, strutils, sequtils
  2. randomize()
  3. const rvs = [
  4. "11.0", "40.0", "42.0", "43.0", "47.0", "50.0", "52.0", "53.0", "54.0",
  5. "61.0", "66.0", "67.0", "69.0", "70.0"
  6. ]
  7. proc rv(): string =
  8. if rand(10) < 1: ""
  9. else: "; rv:" & sample(rvs)
  10. # OS
  11. const enc = ["; U", "; N", "; I", ""]
  12. proc linux(): string =
  13. const
  14. window = ["X11", "Wayland", "Unknown"]
  15. arch = ["i686", "x86_64", "arm"]
  16. distro = ["", "; Ubuntu/14.10", "; Ubuntu/16.10", "; Ubuntu/19.10",
  17. "; Ubuntu", "; Fedora"]
  18. sample(window) & sample(enc) & "; Linux " & sample(arch) & sample(distro)
  19. proc windows(): string =
  20. const
  21. nt = ["5.1", "5.2", "6.0", "6.1", "6.2", "6.3", "6.4", "9.0", "10.0"]
  22. arch = ["; WOW64", "; Win64; x64", "; ARM", ""]
  23. trident = ["", "; Trident/5.0", "; Trident/6.0", "; Trident/7.0"]
  24. "Windows " & sample(nt) & sample(enc) & sample(arch) & sample(trident)
  25. let macs = toSeq(6..15).mapIt($it) & @["14_4", "10_1", "9_3"]
  26. proc mac(): string =
  27. "Macintosh; Intel Mac OS X 10_" & sample(macs) & sample(enc)
  28. # Browser
  29. proc presto(): string =
  30. const p = ["2.12.388", "2.12.407", "22.9.168", "2.9.201", "2.8.131", "2.7.62",
  31. "2.6.30", "2.5.24"]
  32. const v = ["10.0", "11.0", "11.1", "11.5", "11.6", "12.00", "12.14", "12.16"]
  33. &"Presto/{sample(p)} Version/{sample(v)}"
  34. # Samples
  35. proc product(): string =
  36. const opera = ["Opera/9.80", "Opera/12.0"]
  37. if rand(20) < 1: "Mozilla/5.0"
  38. else: sample(opera)
  39. proc os(): string =
  40. let r = rand(10)
  41. let os =
  42. if r < 6: windows()
  43. elif r < 9: linux()
  44. else: mac()
  45. &"({os}{rv()})"
  46. proc browser(prod: string): string =
  47. if "Opera" in prod: presto()
  48. else: "like Gecko"
  49. # Agent
  50. proc getAgent*(): string =
  51. let prod = product()
  52. &"{prod} {os()} {browser(prod)}"