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!