Dynamic DNS using the NearlyFreeSpeech.NET API (take two)

A few years ago, I hacked together a way to updating my DNS record when my home IP changed. The script I wrote has generally been working ok, though recently I started seeing a few more errors than usual. Rather than debug them, I decided to rewrite the script using the more up-to-date python-nfsn and Requests libraries.

Both libraries are available via pip, so getting them is super-easy:

pip install python-nfsn requests # sudo was required for my particular setup

The two new libraries make the script a bit easier to read, particularly the line that gets the current external IP. I've switched to using ipify to do this, which means a regular expression isn't needed anymore.

#!/usr/bin/env python

from nfsn import Nfsn
import requests
from time import strftime, localtime

user = "user" # Your NFSN username (not the one used to ssh into your site)
key = "api_key" # API key (generate one from the Profile tab in the NFSN member interface: click "Actions", then "Manage API Key")
domain = "example.com" # Your NFS-hosted domain
subdomain = "subdomain" # The subdomain you're setting up for dynamic DNS

nfsn = Nfsn(user, key)  # Create the NFSN API object

currentip = requests.get('http://api.ipify.org').text
listedip = nfsn.dns(domain).listRRs(subdomain)[0]['data']
logtime = strftime("%Y-%m-%d %H%M", localtime())

if currentip != listedip:   # Check to see if we need to update the record; if so:
    nfsn.dns(domain).removeRR(subdomain, 'A', listedip) # a) remove the old entry,
    nfsn.dns(domain).addRR(subdomain, 'A', currentip)   # b) add a new entry with the new IP
    print (logtime + " DNS record updated from " + listedip + " to " + currentip)
else:
    print (logtime + " No update required.")

After making the script executable and setting it to run every few hours using cron, the script seems to be running well - hopefully it works for someone else out there too.

Update (30 December 2021): A support request is no longer required for generating an NFSN API key. Thanks to Lewis from penwatch.net for emailing to let me know.