File: D:/bin/scripts/python/prev/2/get_currency_exchange_rates.py
# (SS,70/04/14) Python script to lookup EUR and USD exchanges rates from Yahoo and save to HyperFlight currency tables
# (SS,28/04/14) Added comparison tables
import urllib2
import datetime
from BeautifulSoup import BeautifulSoup
import MySQLdb
import sys
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import email.utils
def fetch_page(AURL):
print_html(AURL)
req = urllib2.Request(AURL, '', {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64)'})
response = urllib2.urlopen(req)
the_page = response.read()
return the_page
def get_currency_yahoo(AFromCurrency, AToCurrency):
LToken = AFromCurrency.lower() + AToCurrency.lower() # e.g. gbpusd
LURL = 'http://uk.finance.yahoo.com/q?s=' + LToken + '=x'
html = fetch_page(LURL)
soup = BeautifulSoup(html)
# find the exchange rate which is in a span e.g. <span id="yfs_l10_gbpusd=x">1.6592</span>
spans = soup.findAll('span', {"id" : "yfs_l10_" + LToken + "=x"})
LExchangeRate = 0
if len(spans) > 0:
try:
LExchangeRate = float(spans[0].text.strip())
except ValueError, e:
print_html('ValueError: %s' % (e))
else:
print_html('Exchange rate not found')
return LExchangeRate
def get_currency(AFromCurrency, AToCurrency):
print_html("")
LExchangeRate = get_currency_yahoo(AFromCurrency, AToCurrency);
print_html('Exchange rate %s to %s: %s' % (AFromCurrency, AToCurrency, LExchangeRate))
# save in history table
LSQL = 'INSERT INTO currency_history SET \
ExchangeRateDateTime = NOW(), Currency = "%s", \
ExchangeRate = %0.4f' % (AToCurrency, LExchangeRate)
cur.execute(LSQL)
# update currencies table if <> 0
if LExchangeRate != 0:
LSQL = 'UPDATE currencies SET \
ExchangeRate = %0.4f \
WHERE Currency = "%s"' % (LExchangeRate, AToCurrency)
cur.execute(LSQL)
else:
set_alert(True) # signal alert if exchange is 0
def set_alert(AAlert):
global FAlert # required to modify a global
FAlert = AAlert
def get_alert():
return FAlert
# (SS,26/4/14)
def get_comparisons():
LSQL = """\
CREATE TEMPORARY TABLE tmp_exchange_rates
SELECT Currency, "0D" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 0 DAY)
UNION ALL
SELECT Currency, "1D" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
UNION ALL
SELECT Currency, "1W" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 1 WEEK)
UNION ALL
SELECT Currency, "2W" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 2 WEEK)
UNION ALL
SELECT Currency, "3W" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 3 WEEK)
UNION ALL
SELECT Currency, "1M" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
UNION ALL
SELECT Currency, "2M" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 2 MONTH)
UNION ALL
SELECT Currency, "3M" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 3 MONTH)
UNION ALL
SELECT Currency, "6M" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
UNION ALL
SELECT Currency, "1Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
UNION ALL
SELECT Currency, "2Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 2 YEAR)
UNION ALL
SELECT Currency, "3Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
UNION ALL
SELECT Currency, "4Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 4 YEAR)
UNION ALL
SELECT Currency, "5Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 5 YEAR)
UNION ALL
SELECT Currency, "6Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 6 YEAR)
UNION ALL
SELECT Currency, "7Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 7 YEAR)
UNION ALL
SELECT Currency, "8Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 8 YEAR)
UNION ALL
SELECT Currency, "9Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 9 YEAR)
UNION ALL
SELECT Currency, "10Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 10 YEAR)
UNION ALL
SELECT Currency, "11Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 11 YEAR)
UNION ALL
SELECT Currency, "12Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 12 YEAR)
UNION ALL
SELECT Currency, "13Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 13 YEAR)
UNION ALL
SELECT Currency, "14Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 14 YEAR)
UNION ALL
SELECT Currency, "15Y" AS PastPeriod, ExchangeRate FROM currency_history
WHERE ExchangeRate <> 0 AND DATE(ExchangeRateDateTime) = DATE_SUB(CURDATE(), INTERVAL 15 YEAR)
"""
cur.execute(LSQL)
LSQL = """\
SELECT Currency, ExchangeRate,
AVG(IF(PastPeriod = "1D", ExchangeRate, NULL)) AS OneDay,
AVG(IF(PastPeriod = "1W", ExchangeRate, NULL)) AS OneWeek,
AVG(IF(PastPeriod = "2W", ExchangeRate, NULL)) AS TwoWeeks,
AVG(IF(PastPeriod = "3W", ExchangeRate, NULL)) AS ThreeWeeks,
AVG(IF(PastPeriod = "1M", ExchangeRate, NULL)) AS OneMonth,
AVG(IF(PastPeriod = "2M", ExchangeRate, NULL)) AS TwoMonths,
AVG(IF(PastPeriod = "3M", ExchangeRate, NULL)) AS ThreeMonths,
AVG(IF(PastPeriod = "6M", ExchangeRate, NULL)) AS SixMonths,
AVG(IF(PastPeriod = "1Y", ExchangeRate, NULL)) AS OneYear,
AVG(IF(PastPeriod = "2Y", ExchangeRate, NULL)) AS TwoYears,
AVG(IF(PastPeriod = "3Y", ExchangeRate, NULL)) AS ThreeYears,
AVG(IF(PastPeriod = "4Y", ExchangeRate, NULL)) AS FourYears,
AVG(IF(PastPeriod = "5Y", ExchangeRate, NULL)) AS FiveYears,
AVG(IF(PastPeriod = "6Y", ExchangeRate, NULL)) AS SixYears,
AVG(IF(PastPeriod = "7Y", ExchangeRate, NULL)) AS SevenYears,
AVG(IF(PastPeriod = "8Y", ExchangeRate, NULL)) AS EightYears,
AVG(IF(PastPeriod = "9Y", ExchangeRate, NULL)) AS NineYears,
AVG(IF(PastPeriod = "10Y", ExchangeRate, NULL)) AS TenYears,
AVG(IF(PastPeriod = "11Y", ExchangeRate, NULL)) AS ElevenYears,
AVG(IF(PastPeriod = "12Y", ExchangeRate, NULL)) AS TwelveYears,
AVG(IF(PastPeriod = "13Y", ExchangeRate, NULL)) AS ThirteenYears,
AVG(IF(PastPeriod = "14Y", ExchangeRate, NULL)) AS FourteenYears,
AVG(IF(PastPeriod = "15Y", ExchangeRate, NULL)) AS FifteenYears
FROM tmp_exchange_rates
WHERE Currency <> "GBP"
GROUP BY Currency
ORDER BY (Currency = "EUR" OR Currency = "USD") DESC, Currency
"""
cur.execute(LSQL)
rows = cur.fetchall()
for type in range(0, 3):
print '<table>'
print '<tr>'
print '<th>Code</th><th>Rate</th><th>1D</th><th>1W</th><th>2W</th><th>3W</th><th>1M</th><th>2M</th><th>3M</th><th>6M</th><th>1Y</th><th>2Y</th><th>3Y</th><th>4Y</th><th>5Y</th><th>6Y</th><th>7Y</th><th>8Y</th><th>9Y</th><th>10Y</th><th>11Y</th><th>12Y</th><th>13Y</th><th>14Y</th><th>15Y</th>'
print '</tr>'
for row in rows:
# get_currency('GBP', row[0]) # e.g. get_currency('GBP', 'EUR')
#get_currency('GBP', 'EUR')
print '<tr style="text-align:right">'
for f in range(0, 25):
if f == 0:
print '<td style="text-align:left"><a href="http://uk.finance.yahoo.com/q?s=gbp%s=x">%s</a></td>' % (row[f].lower(), row[f])
else:
if row[f] == None:
print '<td></td>'
else:
if f >= 2:
if type == 0:
print '<td>%.4f</td>' % (row[f])
elif type == 1:
print '<td>%+.4f</td>' % (row[1] - row[f])
else: # i.e. 2
print '<td>%+.2f%%</td>' % ((row[1] - row[f]) / row[1] * 100)
else:
print '<td>%s</td>' % row[f]
print '</tr>'
print '</table>'
print '<br>'
def print_html_header():
print """<html>
<title>HyperFlight Order</title>
<style>
html, body, h1, h2, p {
font-family: Arial, Helvetica, sans-serif;
}
img {
border: 0;
}
table {
border-collapse: collapse;
}
table, th, td {
border: 1px solid black;
}
td, th {
padding: 5px;
white-space: nowrap;
}
</style>
<body>
"""
def print_html_footer():
print """</body>
</html>"""
def print_html(AText):
print AText + "<br>"
def send_email_file(AFileName, ASubject, AFrom, ATo, ABcc):
# Open a plain text file for reading. For this example, assume that
# the text file contains only ASCII characters.
fp = open(AFileName, 'rb')
# Create a text/plain message
#msg = MIMEText(fp.read())
html = fp.read()
fp.close()
msg = MIMEMultipart('alternative')
# header
if get_alert():
msg['Subject'] = 'ALERT!!! ' + ASubject
else:
msg['Subject'] = ASubject
msg['From'] = AFrom
msg['To'] = ATo
msg['Date'] = email.utils.formatdate(localtime=True)
if get_alert():
msg['X-Priority'] = '2'
#* html = html.replace('\r\n', '<br>')
part1 = MIMEText(html, 'html')
msg.attach(part1)
# send the messsage using localhost
s = smtplib.SMTP('localhost')
s.sendmail(AFrom, [ATo, ABcc], msg.as_string())
s.quit()
LOG_FILE = 'get_currency_exchange_rates.log'
FAlert = False # global used to set alert
# output all prints to file
f = open(LOG_FILE, 'w')
sys.stdout = f
start = datetime.datetime.now()
print_html_header()
print_html('Started: ' + start.strftime('%Y-%m-%d %H:%M:%S'))
filename_date_suffix = start.strftime('%Y-%m-%d')
con = MySQLdb.connect(host='localhost', user='hyperflight', passwd='b747', db='hyperflight')
cur = con.cursor()
# fetch all (non GBP) currencies from currencies table
cur.execute("SELECT Currency FROM currencies WHERE Currency <> 'GBP' ORDER BY Currency")
rows = cur.fetchall()
for row in rows:
get_currency('GBP', row[0]) # e.g. get_currency('GBP', 'EUR')
#get_currency('GBP', 'EUR')
finish = datetime.datetime.now()
time_taken = finish - start
print_html('')
print_html('Finished: ' + finish.strftime('%Y-%m-%d %H:%M:%S'))
print_html('Time taken: %0.3f seconds' % (time_taken.seconds + time_taken.microseconds / 1E6))
print_html('')
# (SS,26/4/14)
get_comparisons()
cur.close()
con.close()
finish = datetime.datetime.now()
time_taken = finish - start
#print_html('')
print_html('Finished: ' + finish.strftime('%Y-%m-%d %H:%M:%S'))
print_html('Time taken: %0.3f seconds' % (time_taken.seconds + time_taken.microseconds / 1E6))
print_html_footer()
# set back to default out and close the opened log file
sys.stdout = sys.__stdout__
f.close()
# send the file as an email
#send_email_file(LOG_FILE, 'HyperFlight Exchange Rate Result', 'exchange_rate@hyperflight.co.uk', 'surinder@itpartnership.com', 'surinder@ssbsoft.co.uk')
send_email_file(LOG_FILE, 'HyperFlight Exchange Rate Result', 'exchange_rate@hyperflight.co.uk', 'sales@hyperflight.co.uk', 'contactforms@itpartnership.com')