Mercurial > ~darius > hgwebdir.cgi > scrape-vb
diff scrape-vb.py @ 7:bf896507faa9
Add code to send an SMS if configured to do so.
Rearrange the output stage a bit to make it clearer.
author | darius |
---|---|
date | Fri, 07 Sep 2007 01:31:47 +0000 |
parents | 9f3eb9a07966 |
children | d17fd6f3a492 |
line wrap: on
line diff
--- a/scrape-vb.py Wed Aug 29 07:37:59 2007 +0000 +++ b/scrape-vb.py Fri Sep 07 01:31:47 2007 +0000 @@ -6,7 +6,7 @@ # Prints out (and emails) when criteria match based on cost, # destination, etc # -# $Id: scrape-vb.py,v 1.5 2007/08/29 07:37:59 darius Exp $ +# $Id: scrape-vb.py,v 1.6 2007/09/07 01:31:47 darius Exp $ ############################################################################ # # Copyright (C) 2007 Daniel O'Connor. All rights reserved. @@ -35,14 +35,14 @@ ############################################################################ import os, re, BeautifulSoup, datetime, time, smtplib, sys, urllib -import ConfigParser, optparse +import ConfigParser, optparse, SMSVodaAu usage = '''%prog [options] Reads configuration from ./scrape-vb.ini and ~/.scrape-vb.ini''' -optparse = optparse.OptionParser(usage, version="$Id: scrape-vb.py,v 1.5 2007/08/29 07:37:59 darius Exp $") +optparse = optparse.OptionParser(usage, version="$Id: scrape-vb.py,v 1.6 2007/09/07 01:31:47 darius Exp $") optparse.add_option('-d', '--debug', action="store_true", default=False, - help="Disable mail sending, prints mail message to stdout") + help="Disable mail & SMS sending, prints message to stdout") optparse.add_option('-f', '--file', help="Do not fetch the page, use this file instead") optparse.add_option('-e', '--example', action="store_true", default=False, help="Print an example configuration file to stdout and exit") @@ -55,6 +55,9 @@ mailfrom=user@host.com mailsend=True mailhost=mail.server.com +smsuser=0412312312 +smspass=mys3krit +smssend=True [user@host.com] # All fields are optional @@ -62,6 +65,7 @@ city2=Bar when=dd/mm/yy maxcost=123 +phone=0498765432 ''' sys.exit(0) @@ -86,7 +90,22 @@ except IOError, e: print "Unable to fetch page - " + str(e) sys.exit(1) - + +# Test if we have been configured to send SMSs +try: + smsuser = conf.get('global', 'smsuser') + smspass = conf.get('global', 'smspass') + smssend = conf.getboolean('global', 'smssend') +except ConfigParser.NoOptionError: + smssend = False + +if (options.debug == True and smssend): + print "smssend overridden due to debugging" + smssend = False + +if (smssend): + smshndl = SMSVodaAu.SMSVodaAu(smsuser, smspass) + s = BeautifulSoup.BeautifulSoup(f) hrr = s.find("ul", "happyhr-rows") if (hrr == None): @@ -105,6 +124,12 @@ frtime = datetime.datetime(*time.strptime(times.group(1), "%d/%m/%y")[0:3]) totime = datetime.datetime(*time.strptime(times.group(2), "%d/%m/%y")[0:3]) +# +# Go through the HTML and work out who wants to be notified of what +# +# Store in output, a dictionary keyed by email adddress which holds a +# list of each matching flight (city1, city2, cost, url) +# output = {} for i in hrlist: href = i.find('a') @@ -152,6 +177,7 @@ output[t['email']] = [] output[t['email']].append([city1, city2, cost, url]) +# Test if we have been configured to send email try: mailsubj = conf.get('global', 'mailsubj') mailhost = conf.get('global', 'mailhost') @@ -167,27 +193,41 @@ if (mailsend): server = smtplib.SMTP(mailhost) #server.set_debuglevel(1) -else: - print "Note: Mail sending disabled" - -for o in output: - if (mailsend): - msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (mailfrom, o, mailsubj)) + +# +# Output the various notifications +# +ttimestr = "Note: travel period is from %s to %s" % \ + (frtime.strftime("%A %e %B %Y"), totime.strftime("%A %e %B %Y")) + +# Email each person about their flights +if (mailsend): + for o in output: + msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (mailfrom, o, mailsubj) msg = msg + "Your criteria for flights have been matched\r\n\r\n" - else: + for i in output[o]: + msg = msg + "%s <-> %s costs $%d - %s\r\n" % (i[0], i[1], i[2], i[3]) + + msg = msg + "\r\n" + ttimestr + "\r\n" + server.sendmail(mailfrom, o, msg) + +else: + # If not emailing print to stdout + for o in output: print "Match for " + o - for i in output[o]: - if (mailsend): - msg = msg + "%s <-> %s costs $%d - %s\r\n" % (i[0], i[1], i[2], i[3]) - else: + for i in output[o]: print "%s <-> %s costs $%d" % (i[0], i[1], i[2]) - ttimestr = "Note: travel period is from %s to %s" % \ - (frtime.strftime("%A %e %B %Y"), totime.strftime("%A %e %B %Y")) - - if (mailsend): - msg = msg + "\r\n" + ttimestr + "\r\n" - server.sendmail(mailfrom, o, msg) - else: - print ttimestr - print +# SMS each person about their flights +if (smssend): + for o in output: + if (conf.has_option(o, 'phone')): + msg = "" + for i in output[o]: + msg = msg + "%s <-> %s $%d, " % (i[0], i[1], i[2]) + # Chop off the last , & make sure the whole message is not + # too large. + msgend = min(len(msg) - 2, 160) + print "SMS to " + conf.get(o, 'phone') + print msg[0:msgend] + smshndl.sendamsg(conf.get(o, 'phone'), msg[0:msgend])