#!/usr/bin/env python """Utilize crypto domains DNS and either redirect, or display information.""" from bottle import Bottle, run, response, request, static_file, redirect import json import requests import json2html VERSION = '0.1.0' app = Bottle() def domainLookup(domain): """Return a dictionary from JSON results of API call or return False if there is an error """ try: apibase = 'https://unstoppabledomains.com/api/v1/' dnslookup = requests.get(apibase + domain) if dnslookup.status_code == 200: domainInfo = json.loads(dnslookup.content) return domainInfo else: return False except requests.exceptions.ConnectionError: return False @app.route("/") def root(): """Index page, just displays information about URL formatting""" host = request.get_header('host') helptext = f"""

General format is {host}/<domain>/<action>

If <action> is blank, it will attempt to use the IPFS hash

You may also/optionally specify an action which can be any of the following
raw Show the raw json (formatted as an html table)
html Hit the IPFS hash via cloudflare-ipfs.com
redir Use the redirect parameter and just return a 302 redirect to whatever is set
""" return helptext @app.route("/") @app.route("//") @app.route("//") def redirectDomain(domain, action=None): """Handle the actual redirect for the domain queried""" lookupResult = domainLookup(domain) if domain == 'yourdomain.crypto' or domain == 'yourdomain.zil': redirect('/') if lookupResult: redirect_url = lookupResult['ipfs']['redirect_domain'] ipfs_hash = lookupResult['ipfs']['html'] else: return f"Unable to get info for {domain}" if action is None or action == 'html': response.status = 302 if not ipfs_hash.startswith('/ip'): ipfshash = "ipfs/" + ipfs_hash else: ipfshash = ipfs_hash response.set_header('Location', f"https://cloudflare-ipfs.com/{ipfshash}") elif action == 'redir': try: if not redirect_url.startswith('http'): redirect_url = "http://" + redirect_url response.status = 302 response.set_header('Location', redirect_url) except KeyError: return f'Did not find a redirect for {domain}' elif action == 'raw': return json2html.json2html.convert(json=lookupResult) @app.route("/favicon.ico") def favicon(): """Display a favicon to make the errors go away :)""" return static_file('favicon.ico', root='images') if __name__ == "__main__": run(app, host='0.0.0.0', port='5000', reloader=True)