Recipe 3.16. Watching Foreign Exchange Rates
Credit: Victor Yongwei Yang
Problem
You want to monitor
periodically (with a Python script to be run by
crontab or as a Windows scheduled task) an
exchange rate between two currencies, obtained from the Web, and
receive email alerts when the rate crosses a certain threshold.
Solution
This task is similar to other monitoring tasks that you could perform
on numbers easily obtained from the Web, be they exchange rates,
stock quotes, wind-chill factors, or whatever. Let's
see specifically how to monitor the exchange rate between U.S. and
Canadian dollars, as reported by the Bank of Canada web site (as a
simple CSV (comma-separated values) feed that is easy to parse):
import httplib
import smtplib
# configure script's parameters here
thresholdRate = 1.30
smtpServer = 'smtp.freebie.com'
fromaddr = 'foo@bar.com'
toaddrs = 'your@corp.com'
# end of configuration
url = '/en/financial_markets/csv/exchange_eng.csv'
conn = httplib.HTTPConnection('www.bankofcanada.ca')
conn.request('GET', url)
response = conn.getresponse( )
data = response.read( )
start = data.index('United States Dollar')
line = data[start:data.index('\n', start)] # get the relevant line
rate = line.split(',')[-1] # last field on the line
if float(rate) < thresholdRate:
# send email
msg = 'Subject: Bank of Canada exchange rate alert %s' % rate
server = smtplib.SMTP(smtpServer)
server.sendmail(fromaddr, toaddrs, msg)
server.quit( )
conn.close( )
Discussion
When working with foreign currencies, it is particularly useful to
have an automated way of getting the conversions you need. This
recipe provides this functionality in a quite simple, straightforward
manner. When cron runs this script, the script
goes to the site, and gets the CSV feed, which provides the daily
noon exchange rates for the previous seven days:
Date (m/d/year),11/12/2004,11/15/2004, ... ,11/19/2004,11/22/2004The script then continues to find the specific currency
$Can/US closing rate,1.1927,1.2005,1.1956,1.1934,1.2058,1.1930,
United States Dollar,1.1925,1.2031,1.1934,1.1924,1.2074,1.1916,1.1844
...
('United States Dollar') and reads the last field
to find today's rate. If you're
having trouble understanding how that works, it may be helpful to
break it down:
US = data.find('United States Dollar')The recipe provides an email alert when the rate falls below a
# find the index of the currency
endofUSline = data.index('\n', US)
# find index for that line end
USline = data[US:endofUSline]
# slice to make one string
rate = USline.split(',')[-1]
# split on ',' and return last field
particular threshold, which can be configured to whatever rate you
prefer (e.g., you could change that statement to send you an alert
whenever the rate changes outside a threshold range).
See Also
httplib, smtplib, and string
function are documented in the Library
Reference and Python in a
Nutshell.