tld.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #!/usr/bin/env python3
  2. import sys
  3. import argparse
  4. def parse_arguments():
  5. """ parse the arguments """
  6. p = argparse.ArgumentParser()
  7. p.add_argument(
  8. "--words-file",
  9. help="file with list of words [/usr/share/dict/words]",
  10. default="/usr/share/dict/words",
  11. )
  12. p.add_argument(
  13. "--tlds-file", help="file with list of tlds [tlds.txt]", default="tlds.txt"
  14. )
  15. p.add_argument(
  16. "--tlds", help="manually specify tlds as comma-separated list", default=False
  17. )
  18. p.add_argument(
  19. "--leet",
  20. help="generate domains that replace letters with numbers",
  21. action="store_true",
  22. )
  23. p.add_argument("--min-size", default=0, type=int, help="minimum word length")
  24. p.add_argument("--max-size", default=100000, type=int, help="maximum word length")
  25. return p.parse_args()
  26. def iter_words(handle):
  27. """ iterate over list of words in text file """
  28. return (word.strip().lower() for word in handle)
  29. def get_tlds(tlds_file):
  30. """ iterate over list of tlds in text file """
  31. with open(tlds_file) as handle:
  32. return [line.split()[0].strip().lower() for line in handle]
  33. def iter_domains(words, tlds):
  34. """ list domains made from words and tlds """
  35. return (
  36. "{}.{}".format(word.rstrip(tld), tld)
  37. for word in words
  38. for tld in tlds
  39. if word.endswith(tld)
  40. )
  41. def l33tify(domain):
  42. """ Produce 1337 versions of words """
  43. replacements = {
  44. "a": "4",
  45. "b": "8",
  46. "e": "3",
  47. "g": "6",
  48. "i": "1",
  49. "o": "0",
  50. "s": "5",
  51. "t": "7",
  52. "z": "2",
  53. }
  54. word, tld = domain.split(".")
  55. return "".join([replacements.get(char, char) for char in word]) + "." + tld
  56. if __name__ == "__main__":
  57. args = parse_arguments()
  58. if not args.tlds:
  59. tlds = get_tlds(args.tlds_file)
  60. else:
  61. tlds = args.tlds.split(",")
  62. with open(args.words_file) as handle:
  63. processed_domains = (
  64. l33tify(domain) if args.leet else domain
  65. for domain in iter_domains(iter_words(handle), tlds)
  66. if len(domain) in range(args.min_size, args.max_size)
  67. )
  68. for domain in processed_domains:
  69. print(domain)