I wanted to write a small program to automatically alert me if certain domain
names became available to register. My first thought was to write a Bash script
to run the whois
command and parse the output with a combination of
Grep and Sed, but after looking at the mess that whois
returns, I
opted to go another route.
I found a Python module to retrieve WHOIS
data and installed it with
pip install whois
. I played around it for a few minutes and
realized that while the website mentions support for .net addresses, the .net
domain wasn’t actually coded into the module. Luckily, the data returned by
whois
is in the same format for both .net and .com domain names. I
added the following few lines to
/usr/lib/python3.2/site-packages/whois/tld_regexpr.py
and it
started to work fine.
net = {
'extend' : 'com'
}
I wanted to have the script only output something when a domain name was close to being expired so that it could be easily installed into a cron job. The final script is here:
#!/usr/bin/env python
'''
File: domain-expiration-check.py
Author: Tim Montague
Description: Checks expiration dates of domain names
'''
import argparse
import whois
import sys
import datetime
def main():
parser = argparse.ArgumentParser(
description="Outputs remaining days until domain name expires if the\
number of days is less then a specified amount (defaults to 7 days)")
parser.add_argument("domainnames", nargs='+')
parser.add_argument("-v", "--verbose", action="store_true",
help="print days remaining even if less than threshold")
parser.add_argument("-d", "--days", help="set days remaining threshold",
type=int, default=7)
args = parser.parse_args()
for d in args.domainnames:
try:
w = whois.query(d, ignore_returncode=1)
if w:
days = (w.expiration_date - datetime.datetime.utcnow()).days
if args.verbose or days < args.days:
print (d, "expires in", days, "days!")
else:
print("Domain not found: ", d, file=sys.stderr)
except Exception as e:
print(e, file=sys.stderr)
if __name__ == '__main__':
main()
This script works perfectly for me. I set up cron to run it daily, so whenever one of the domains I’m watching comes close to being available, I’ll get an email notification.