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
As the API is entirely un-documented and un-supported, it appears they've made some changes recently :) @MasterRex and @bkanuka , this might help?
@heypete - thanks for the OpenDNS trick :)
The API URL for a DNS update now appears to be
https://www.hover.com/api/control_panel/dns
and the minimum JSON required to perform an update is
{"domain":{"id":"domain-YOURDOMAIN.COM","dns_records":[{"id":"dns12345678"}]},"fields":{"content":"127.0.0.1"}}
For anyone interested I've pulled this together into a powershell script which will update a single record.
The script demonstrates the bare essentials, nothing clever - but it does what I need it to for now :)
Cheers!
Nat