For those with Internet providers that change external IP regularly, this is a simple Python script to email you when a change occurs.
Get started by logging into your Linux Box / Raspberry Pi and install dependencies:
sudo apt-get install python-setuptools (or sudo apt-get install python3-setuptools if using python 3) cd /home/pi mkdir ip_check cd ip_check wget https://github.com/psf/requests/archive/master.zip unzip requests-main.zip cd requests-main/ python setup.py install
Copy the ip-check.py file (or copy below) into the /home/pi/ip_check directory: (Change the SMTP SETTINGS for your email address)
#!/usr/bin/env python #This script establishes the public IP Address. #It compares the IP to the stored IP address, #if they differ the new IP is archived and an #email sent with the new IP address. import sys import csv import time import os from smtplib import SMTP_SSL as SMTP #This invokes the secure SMTP protocol (port 465, uses SSL) from email.MIMEText import MIMEText #For email from requests import get #Only additional package required ### Debug ### debug = 0 #Give verbose output force_email = 0 #Forces write to file & Email even if IP address not changed ### SMTP SETTINGS ### SMTPserver = 'YOUR_SMTP SERVER' sender = 'YOUR_EMAIL_ADDRESS_TO_SEND_FROM' USERNAME = "YOUR_EMAIL_ADDRESS_TO_SEND_FROM" PASSWORD = "YOUR_EMAIL_PASSWORD" destination = ['EMAIL_ADDRESS_TO_SEND_UPDATES_TO'] ### Program Variables ### text_subtype = 'plain' content="" subject="New IP Address" file_location = '/home/pi/ip_check/ip.csv' archived_ip = "0.0.0.0" current_ip = "0.0.0.0" # Initialise the system and start the main loop def main(): check_file_exists() #Ensures we have a file to write to. get_archived_ip() #Gets the last recorded IP Address get_current_ip() #Gets the current IP Address compare_ip() def check_file_exists(): if not os.path.isfile(file_location): try: print "File doesn't exist so creating it" with open(file_location, 'a') as csvfile: logfile = csv.writer(csvfile, delimiter=',') logfile.writerow(["Date", "Time", "Public IP"]) get_current_ip() update_ip_file() send_email() print "File Created, Updated and Email Sent" except: print "Issue writing to file" pass def get_archived_ip(): global archived_ip with open(file_location, 'rb') as csvfile: logfile = csv.reader(csvfile, delimiter=',') for row in logfile: archived_ip = row[2] if debug == 1: print 'My archived public IP address is:', archived_ip def get_current_ip(): global current_ip current_ip = get('http://api.ipify.org').text if debug == 1: print 'My public IP address is:', current_ip def compare_ip(): if str(archived_ip) != str(current_ip) and (len(current_ip) < 100 ): if debug == 1: print "IP Address has changed" update_ip_file() send_email() else: if debug == 1: print "IP Address has not changed" def update_ip_file(): try: with open(file_location, 'a') as csvfile: logfile = csv.writer(csvfile, delimiter=',') logfile.writerow([(time.strftime("%d/%m/%Y")), (time.strftime("%H:%M:%S")), current_ip]) except: pass def send_email(): print "About to send email" try: content = "Current IP: " + str(current_ip) msg = MIMEText(content, text_subtype) msg['Subject'] = "New IP address!" msg['From'] = sender #some SMTP servers will do this automatically, not all. if debug == 1: print msg.as_string() conn = SMTP(SMTPserver) conn.set_debuglevel(False) conn.login(USERNAME, PASSWORD) try: conn.sendmail(sender, destination, msg.as_string()) finally: print "Email Sent" conn.close() except Exception, exc: sys.exit( "mail failed; %s" % str(exc) ) #give a error message if __name__ == "__main__": main()
Okay we are now going to run it for the first time:
cd /home/pi/ip_check python ip-check.py
All should work, not lets make it run every 15minutes automatically by cron:
crontab -e
and add the below to the file:
*/15 * * * * /usr/bin/python /home/pi/ip_check/ip-check.py
That’s it.
Hi,
Super post! I will use it!
Note: I think this code “msg[‘Subject’] = “New IP address!”” needs to be replaces by msg[‘Subject’] = subject
Thanks
Thanks, good spot, it works but I guess makes the subject variable redundant so I better fix! Thanks
I love it! Was going to write my own script but then had the thought to Google and here I am 🙂 This will save me a bit of effort/time 🙂 Thanks
Thx for the great script first of all.
and for those using python3.x
sudo apt-get install python3-setuptools if not will get error !
Thanks for the suggestion I updated it!
cd requests-master/
Should be:
cd requests-main/
haha yes but only because they updated their code and changed it. Thanks for the heads up!