commit 390a8ba2d3c30af798d36bafbb05ff6f986365f9 Author: bichi5 Date: Sat Mar 25 18:31:48 2023 +0100 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..8d61967 --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# DOMAPI - Domain API, basic management + +DOMAPI is a quick and simple API to get properties of a domain name. + +## Key features + +* Purely Python +* It's an API with 5 endpoints +* Needs flask library +* Needs wordsegment library +* Needs python-whois library +* Needs tldextract library + +## Requirements + +DOMAPI requires install next Python libraries with pip: + +* pip install flask +* pip install wordsegment +* pip install python-whois +* pip install tldextract + +## Usage + +- Run: python .\wodapi.py +- Then, a server is deploy on http://127.0.0.1:5000 +- Use GET with endpoints +- An error will occur if your parameter is not a well-formed domain. + +## Endpoints + +- words :: split a domain name in words. Only in English languaje, next versions will be available in other languages. Example: http://127.0.0.1:5000/words/hereyourdomainname.com +- whois :: return full whois info from domain. It works with many extensions, although some have limitations in use, such as the .NET extension. Example: http://127.0.0.1:5000/whois/hereyourdomainname.com +- tld :: return TLD or ccTLD or a domain. Example: http://127.0.0.1:5000/tld/hereyourdomainname.com +- domain :: return only domain of a full domain. Example: http://127.0.0.1:5000/domain/hereyourdomainname.com +- size :: returns the size of a domain, not counting its extension. Example: http://127.0.0.1:5000/size/hereyourdomainname.com + +## TO-DO + +- words in Italian and Spanish +- test if a domain is IDN +- conver between ascii-punycode-idn + +## Documentation + +This is the README file + +## Authors + + * Bichi - José Mª Ávila + * Antonio Villamarin + +## License + +This is a NIDOMA development + +## Links + +- https://grantjenks.com/docs/wordsegment/ +- https://pypi.org/project/wordsegment/ +- https://blog.stoplight.io/python-rest-api +- https://github.com/richardpenman/whois +- https://pypi.org/project/tldextract/ \ No newline at end of file diff --git a/domapi.py b/domapi.py new file mode 100644 index 0000000..3860f2d --- /dev/null +++ b/domapi.py @@ -0,0 +1,78 @@ +import wordsegment +import re +import tldextract +from wordsegment import load, segment +from flask import Flask, json +load() + +api = Flask(__name__) + +NOTVALIDDOMAIN={"error":{"code":400,"message":"Bad Request. Not valid domain."}} + +def is_domain(value: str): + pattern = re.compile( + r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|' + r'([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|' + r'([a-zA-Z0-9][-_.a-zA-Z0-9]{0,61}[a-zA-Z0-9]))\.' + r'([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}.[a-zA-Z]{2,3})$' + ) + """ + Return whether or not given value is a valid domain. + If the value is valid domain name this function returns ``True`` + :param value: domain string to validate + """ + return pattern.match(value) + +def get_domain(value: str): + if(is_domain(value)): + ext = tldextract.extract(value) + return ext.domain + +@api.route('/words/', methods=['GET']) +def get_words(name: str): + if(is_domain(name)): + data = {} + data['words'] = segment(get_domain(name)) + return json.dumps(data) + else: + return json.dumps(NOTVALIDDOMAIN) + +@api.route('/whois/', methods=['GET']) +def get_whois(name: str): + if(is_domain(name)): + import whois + who_var = whois.whois(name) + return json.dumps(who_var) + else: + return json.dumps(NOTVALIDDOMAIN) + +@api.route('/tld/', methods=['GET']) +def get_tld(name: str): + if(is_domain(name)): + ext = tldextract.extract(name) + data = {} + data['tld'] = ext.suffix + return json.dumps(data) + else: + return json.dumps(NOTVALIDDOMAIN) + +@api.route('/domain/', methods=['GET']) +def get_onlydomain(name: str): + if(is_domain(name)): + data = {} + data['domain'] = get_domain(name) + return json.dumps(data) + else: + return json.dumps(NOTVALIDDOMAIN) + +@api.route('/size/', methods=['GET']) +def get_size(name: str): + if(is_domain(name)): + data = {} + data['size'] = len(get_domain(name)) + return json.dumps(data) + else: + return json.dumps(NOTVALIDDOMAIN) + +if __name__ == '__main__': + api.run() \ No newline at end of file