Last active
August 5, 2023 06:21
-
-
Save andybarilla/b0dd93e71ff18303c059 to your computer and use it in GitHub Desktop.
DDNS Script for Hover (using their unofficial API)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
"""hover.py: Provides dynamic DNS functionality for Hover.com using their unofficial API. | |
This script is based off one by Dan Krause: https://gist.github.com/dankrause/5585907""" | |
__author__ = "Andrew Barilla" | |
__credits__ = ["Andrew Barilla", "Dan Krause"] | |
__license__ = "GPL" | |
__version__ = "1.0" | |
__maintainer__ = "Andrew Barilla" | |
__email__ = "[email protected]" | |
__status__ = "Production" | |
import requests | |
import json | |
# Your hover.com username and password | |
username = "username" | |
password = "password" | |
# Sign into hover.com and then go to: https://www.hover.com/api/domains/YOURDOMAIN.COM/dns | |
# Look for the subdomain record that you want to update and put its id here. | |
dns_id = "dns0000000" | |
class HoverException(Exception): | |
pass | |
class HoverAPI(object): | |
def __init__(self, username, password): | |
params = {"username": username, "password": password} | |
r = requests.post("https://www.hover.com/api/login", params=params) | |
if not r.ok or "hoverauth" not in r.cookies: | |
raise HoverException(r) | |
self.cookies = {"hoverauth": r.cookies["hoverauth"]} | |
def call(self, method, resource, data=None): | |
url = "https://www.hover.com/api/{0}".format(resource) | |
r = requests.request(method, url, data=data, cookies=self.cookies) | |
if not r.ok: | |
raise HoverException(r) | |
if r.content: | |
body = r.json() | |
if "succeeded" not in body or body["succeeded"] is not True: | |
raise HoverException(body) | |
return body | |
ip = requests.post("http://bot.whatismyipaddress.com") | |
if ip.ok: | |
# connect to the API using your account | |
client = HoverAPI(username, password) | |
current_ip = ip.content | |
same_ip = False | |
current = client.call("get", "dns") | |
try: | |
for domain in current.get("domains"): | |
for entry in domain["entries"]: | |
if entry["id"] == dns_id and entry["content"] == current_ip: | |
same_ip = True | |
except: | |
pass | |
if not same_ip: | |
client.call("put", "dns/" + dns_id, {"content": current_ip}) |
@bkanuka Lexicon would seem to do the job nicely :) Wish I'd noticed it sooner! but then I wouldn't have had the fun of figuring this out. Thanks for the heads up! I'll be sure to point others in that direction in the future :) - and thanks for replying ^.^
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@l0cutis Thank you, but since posting here, I contributed a Hover provider to lexicon. I would now recommend using lexicon for updating Hover. If you do use lexicon and it breaks (because their undocumented API changed) feel free to open a ticket there and tag me.