mirror of
https://github.com/adulau/providence.git
synced 2024-11-21 09:37:04 +00:00
101 lines
2.5 KiB
Python
101 lines
2.5 KiB
Python
import json
|
|
import sys
|
|
import argparse
|
|
from pathlib import Path
|
|
import os
|
|
import re
|
|
import orjson
|
|
|
|
import requests
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="providence is an open source to find company domain names based on a given company name",
|
|
epilog="More info: https://github.com/adulau/providence",
|
|
)
|
|
|
|
parser.add_argument("-v", help="Increase output verbosity", action="store_true")
|
|
parser.add_argument(
|
|
"-n", "--name", type=str, help="Company name to find", action="append"
|
|
)
|
|
parser.add_argument(
|
|
"-t",
|
|
"--tld",
|
|
type=str,
|
|
help="Limit to a specific TLD (if not, all known TLDs are tested)",
|
|
action="append",
|
|
)
|
|
parser.add_argument(
|
|
"-dns", help="Do DNS lookup validation", action="store_true", default=False
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
homedir = str(Path.home())
|
|
|
|
if not args.name:
|
|
parser.print_usage()
|
|
parser.exit()
|
|
|
|
|
|
def cache_suffixes(url="https://publicsuffix.org/list/public_suffix_list.dat"):
|
|
tlds = set()
|
|
cachedfile = os.path.join(homedir, ".providence-suffix")
|
|
if not os.path.exists(cachedfile):
|
|
r = requests.get(url)
|
|
with open(cachedfile, 'wb') as fd:
|
|
fd.write(r.content)
|
|
|
|
with open(cachedfile, 'r') as fd:
|
|
for line in fd:
|
|
tld = line.rstrip()
|
|
if not tld.startswith("//"):
|
|
tlds.add(tld)
|
|
return tlds
|
|
|
|
|
|
def guess_name(name=None, tlds=None):
|
|
guessed_names = set()
|
|
if name is None:
|
|
return False
|
|
for t in tlds:
|
|
guessed_names.add(f"{name}.{t}")
|
|
return guessed_names
|
|
|
|
|
|
if not args.tld:
|
|
tlds = cache_suffixes()
|
|
else:
|
|
tlds = args.tld
|
|
|
|
results = set()
|
|
|
|
|
|
def permutation_name(name_arg=None):
|
|
if name_arg is None:
|
|
return False
|
|
name_arg = name_arg.lower()
|
|
if re.search(r' {1,}', name_arg):
|
|
name = name_arg
|
|
reversed_name = " ".join(name_arg.split(" ")[::-1])
|
|
p = name.replace(" ", "-")
|
|
results.update(guess_name(name=p, tlds=tlds))
|
|
p = reversed_name.replace(" ", "-")
|
|
results.update(guess_name(name=p, tlds=tlds))
|
|
p = name.replace(" ", "")
|
|
results.update(guess_name(name=p, tlds=tlds))
|
|
p = reversed_name.replace(" ", "")
|
|
results.update(guess_name(name=p, tlds=tlds))
|
|
for word in name_arg.split(" "):
|
|
results.update(guess_name(name=word, tlds=tlds))
|
|
else:
|
|
results.update(guess_name(name=name_arg, tlds=tlds))
|
|
|
|
|
|
for name in args.name:
|
|
permutation_name(name_arg=name)
|
|
|
|
output = {}
|
|
output['results'] = list(results)
|
|
if not args.dns:
|
|
j = orjson.dumps(output).decode()
|
|
print(j)
|