Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/bin/env python
- import time
- import datetime
- import pycurl
- import urllib
- import re
- import sys
- import getopt
- from StringIO import StringIO
- from time import strftime
- def visa(requestDate, beginDateRange, endDateRange, baseCcy, foreignCcy):
- url = "http://usa.visa.com/personal/card-benefits/travel/exchange-rate-calculator-results.jsp"
- buffer = StringIO()
- # headers needed to get Visa site to accept our request
- header = [ 'Origin: http://usa.visa.com', 'Accept-Encoding: gzip, deflate', 'Accept-Language: en-US,en;q=0.8', 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36', 'Content-Type: application/x-www-form-urlencoded', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Cache-Control: max-age=0', 'Referer: http://usa.visa.com/personal/card-benefits/travel/exchange-rate-calculator.jsp', 'Connection: keep-alive' ]
- # our request(POST data)
- f = {'homCur' : baseCcy,
- 'forCur' : foreignCcy,
- 'fee' : 0,
- #'date' : '05/05/2015',
- 'date' : requestDate.strftime("%m/%d/%Y") ,
- 'rate' : 0,
- 'submit.x' : 65,
- 'submit.y' : 3,
- 'submit' : 'Calculate+Exchange+Rates',
- #'firstDate' : '06/01/2014',
- 'firstDate' : beginDateRange.strftime("%m/%d/%Y"),
- #'lastDate' : '06/01/2015',
- 'lastDate' : endDateRange.strftime("%m/%d/%Y"),
- #'actualDate' : '05-05-2015'
- 'actualDate' : requestDate.strftime("%m-%d-%Y")
- }
- # takes care of the encoding
- data = urllib.urlencode(f)
- # data = 'homCur=' + baseCcy + '&forCur=' + foreignCcy + '&fee=0&date=05%2F05%2F2015&rate=0&submit.x=65&submit.y=3&submit=Calculate+Exchange+Rates&firstDate=06%2F01%2F2014&lastDate=06%2F01%2F2015&actualDate=05-05-2015'
- # print data
- c = pycurl.Curl()
- c.setopt(c.URL, url)
- c.setopt(c.WRITEDATA, buffer)
- c.setopt(c.HTTPHEADER, header)
- c.setopt(c.VERBOSE, 0)
- c.setopt(c.ENCODING, '')
- c.setopt(c.POSTFIELDS, data)
- c.perform()
- c.close()
- # print body (debug)
- body = buffer.getvalue()
- #print(body)
- # extract the value we want via regex
- #p = re.compile("1 KRW = ([0-9.]*?) USD")
- p = re.compile("1 " + foreignCcy + " = ([0-9.]+) " + baseCcy)
- m = p.search(body)
- if m is not None:
- #print m.group(1)
- return float(m.group(1))
- else:
- print "Visa: Cannot find exchange rate. BaseCcy: " + baseCcy + ", foreignCcy: " + foreignCcy + ", Date: " + str(requestDate)
- print "Exiting..."
- exit(-1)
- def mastercard(requestDate, beginDateRange, endDateRange, baseCcy, foreignCcy):
- url = "https://www.mastercard.com/psder/eu/callPsder.do"
- buffer = StringIO()
- # headers needed to get Visa site to accept our request
- header = [ 'Origin: https://www.mastercard.com', 'Accept-Encoding: gzip, deflate', 'Accept-Language: en-US,en;q=0.8', 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36', 'Content-type: application/x-www-form-urlencoded', 'Accept: */*', 'Referer: https://www.mastercard.com/global/currencyconversion/', 'Connection: keep-alive']
- # our request(POST data)
- f = {'baseCurrency' : baseCcy,
- 'settlementDate' : requestDate.strftime("%m/%d/%Y") ,
- 'service' : 'getExchngRateDetails',
- }
- # takes care of the encoding
- data = urllib.urlencode(f)
- # print data
- c = pycurl.Curl()
- c.setopt(c.URL, url)
- c.setopt(c.WRITEDATA, buffer)
- c.setopt(c.HTTPHEADER, header)
- c.setopt(c.VERBOSE, 0)
- c.setopt(c.ENCODING, '')
- c.setopt(c.POSTFIELDS, data)
- c.perform()
- c.close()
- # print body (debug)
- body = buffer.getvalue()
- #print(body)
- # extract the value we want via regex
- # mastercard gives data in xml... could parse the xml properly, but I'm lazy
- p = re.compile(foreignCcy + "</ALPHA_CURENCY_CODE><CURRENCY_NAME>.*?</CURRENCY_NAME><CONVERSION_RATE>([0-9.]+)</CONVERSION_RATE>")
- m = p.search(body)
- if m is not None:
- #print m.group(1)
- return float(m.group(1))
- else:
- #mastercard doesn't seem to provide data for weekends...
- # return None if today is a weekend
- if(requestDate.isoweekday() in (6,7)):
- return None
- print "Mastercard: Cannot find exchange rate. BaseCcy: " + baseCcy + ", foreignCcy: " + foreignCcy + ", Date: " + str(requestDate)
- print "Exiting..."
- exit(-1)
- def usage():
- print "python getVisaMC -b <base/home currency> -f <foreign/target currency> -t <initial date> -d <days to retrieve after initial date>"
- print "eg: python getVisaMC.py -b USD -f JPY -t 20150510 -d 30"
- def main(argv):
- try:
- opts, args = getopt.getopt(argv, 'hb:f:t:d:', ['help', 'base=', 'foreign=', 'target=', "days="])
- except getopt.GetoptError:
- usage()
- sys.exit(2)
- for opt, arg in opts:
- if opt in ("-h", "--help"):
- usage()
- sys.exit(2)
- elif opt in ("-b", "--base"):
- baseCcy = arg
- elif opt in ("-f", "--foreign"):
- targetCcy = arg
- elif opt in ("-t", "--target"):
- targetDate = arg
- elif opt in ("-d", "--days"):
- numDays = arg
- else:
- usage()
- sys.exit(2)
- if len(argv) != 8:
- print "wrong arguments provided"
- usage()
- sys.exit(2)
- initialDate = datetime.datetime.strptime(targetDate, '%Y%m%d')
- beginDateRange = datetime.date.today() + datetime.timedelta(days=-364)
- endDateRange = datetime.date.today() + datetime.timedelta(days=1)
- print "Date, Visa ->, Visa <-, Mastercard ->, Mastercard <-"
- for _i in range(int(numDays)):
- date = initialDate + datetime.timedelta(days=_i)
- v = visa(date, beginDateRange, endDateRange, baseCcy, targetCcy)
- m = mastercard(date, beginDateRange, endDateRange, baseCcy, targetCcy)
- if(m is None):
- print date.strftime("%Y%m%d") + "," + str(v) + "," + str(1/v) + ",,"
- else:
- print date.strftime("%Y%m%d") + "," + str(v) + "," + str(1/v) + "," + str(1/m) + "," + str(m)
- if __name__ == "__main__":
- main(sys.argv[1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement