Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Scripts for website monitoring using Python
#!/usr/bin/env python
# sample usage: checksites.py eriwen.com nixtutor.com yoursite.org
import pickle, os, sys, logging
from httplib import HTTPConnection, socket
from smtplib import SMTP
def email_alert(message, status):
fromaddr = 'you@gmail.com'
toaddrs = 'yourphone@txt.att.net'
server = SMTP('smtp.gmail.com:587')
server.starttls()
server.login('you', 'password')
server.sendmail(fromaddr, toaddrs, 'Subject: %s\r\n%s' % (status, message))
server.quit()
def get_site_status(url):
response = get_response(url)
try:
if getattr(response, 'status') == 200:
return 'up'
except AttributeError:
pass
return 'down'
def get_response(url):
'''Return response object from URL'''
try:
conn = HTTPConnection(url)
conn.request('HEAD', '/')
return conn.getresponse()
except socket.error:
return None
except:
logging.error('Bad URL:', url)
exit(1)
def get_headers(url):
'''Gets all headers from URL request and returns'''
response = get_response(url)
try:
return getattr(response, 'getheaders')()
except AttributeError:
return 'Headers unavailable'
def compare_site_status(prev_results):
'''Report changed status based on previous results'''
def is_status_changed(url):
status = get_site_status(url)
friendly_status = '%s is %s' % (url, status)
print friendly_status
if url in prev_results and prev_results[url] != status:
logging.warning(status)
# Email status messages
email_alert(str(get_headers(url)), friendly_status)
prev_results[url] = status
return is_status_changed
def is_internet_reachable():
'''Checks Google then Yahoo just in case one is down'''
if get_site_status('www.google.com') == 'down' and get_site_status('www.yahoo.com') == 'down':
return False
return True
def load_old_results(file_path):
'''Attempts to load most recent results'''
pickledata = {}
if os.path.isfile(file_path):
picklefile = open(file_path, 'rb')
pickledata = pickle.load(picklefile)
picklefile.close()
return pickledata
def store_results(file_path, data):
'''Pickles results to compare on next run'''
output = open(file_path, 'wb')
pickle.dump(data, output)
output.close()
def main(urls):
# Setup logging to store time
logging.basicConfig(level=logging.WARNING, filename='checksites.log',
format='%(asctime)s %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# Load previous data
pickle_file = 'data.pkl'
pickledata = load_old_results(pickle_file)
# Check sites only if Internet is_available
if is_internet_reachable():
status_checker = compare_site_status(pickledata)
map(status_checker, urls)
else:
logging.error('Either the world ended or we are not connected to the net.')
# Store results in pickle file
store_results(pickle_file, pickledata)
if __name__ == '__main__':
# First arg is script name, skip it
main(sys.argv[1:])
#!/usr/bin/env python
from threading import Thread
import requests ## pip install requests
import time
import smtplib
## email sending function
def email_sender(input_message, email_to, client):
''' function to send email '''
to = email_to
gmail_user = '' ## email of sender account
gmail_pwd = '' ## password of sender account
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:site down! \n'
input_message = input_message + client
msg = header + input_message
smtpserver.sendmail(gmail_user, to, msg)
smtpserver.close()
## list of sites to track along with email address to send the alert
clients = {"client":"email",
"client":"email",
"client":"email"}
## temporary dictionary used to do separate monitoring when a site is down
temp_dic = {}
## site 'up' function
def site_up():
''' function to monitor up time '''
while True:
for client, email in clients.items():
try:
r = requests.get(client)
if r.status_code == 200:
print client, 'Site ok'
time.sleep(60) ## sleep for 1 min
else:
print client, 'Site first registered as down - added to the "site down" monitoring'
temp_dic[client]=email
del clients[client]
except requests.ConnectionError:
print client, 'Site first registered as down - added to the "site down" monitoring'
temp_dic[client]=email
del clients[client]
## site 'down' function
def site_down():
''' function to monitor site down time '''
while True:
time.sleep(900) ## sleeps 15 mins
for client, email in temp_dic.items():
try:
r = requests.get(client)
if r.status_code == 200:
print client, 'Site is back up!!'
email_sender('Site back up!! ', email, client)
clients[client]=email
del temp_dic[client]
else:
email_sender('Site down!! ', email, client)
print client, 'Site Currently down - email sent'
except requests.ConnectionError:
email_sender('Site down!! ', email, client)
print client, 'Site Currently down - email sent'
t1 = Thread(target = site_up)
t2 = Thread(target = site_down)
t1.start()
t2.start()
@Mutale85
Copy link

I am new to python. Can this script send an email when the site is down?

@sesseor
Copy link

sesseor commented Mar 8, 2021

I am new to python. Can this script send an email when the site is down?

yes it does send email when the website is down

@xanorbkid
Copy link

can this script check the total active users on the website??

@sesseor
Copy link

sesseor commented Dec 18, 2022

can this script check the total active users on the website??

nope

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment