Advertisement
Guest User

Untitled

a guest
May 31st, 2015
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.46 KB | None | 0 0
  1. #! /usr/bin/env python
  2.  
  3. import time
  4. import datetime
  5. import pycurl
  6. import urllib
  7. import re
  8. import sys
  9. import getopt
  10. from StringIO import StringIO
  11. from time import strftime
  12.  
  13. def visa(requestDate, beginDateRange, endDateRange, baseCcy, foreignCcy):
  14. url = "http://usa.visa.com/personal/card-benefits/travel/exchange-rate-calculator-results.jsp"
  15. buffer = StringIO()
  16.  
  17. # headers needed to get Visa site to accept our request
  18. 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' ]
  19.  
  20.  
  21. # our request(POST data)
  22. f = {'homCur' : baseCcy,
  23. 'forCur' : foreignCcy,
  24. 'fee' : 0,
  25. #'date' : '05/05/2015',
  26. 'date' : requestDate.strftime("%m/%d/%Y") ,
  27. 'rate' : 0,
  28. 'submit.x' : 65,
  29. 'submit.y' : 3,
  30. 'submit' : 'Calculate+Exchange+Rates',
  31. #'firstDate' : '06/01/2014',
  32. 'firstDate' : beginDateRange.strftime("%m/%d/%Y"),
  33. #'lastDate' : '06/01/2015',
  34. 'lastDate' : endDateRange.strftime("%m/%d/%Y"),
  35. #'actualDate' : '05-05-2015'
  36. 'actualDate' : requestDate.strftime("%m-%d-%Y")
  37. }
  38.  
  39.  
  40. # takes care of the encoding
  41. data = urllib.urlencode(f)
  42. # 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'
  43.  
  44. # print data
  45.  
  46. c = pycurl.Curl()
  47. c.setopt(c.URL, url)
  48. c.setopt(c.WRITEDATA, buffer)
  49. c.setopt(c.HTTPHEADER, header)
  50. c.setopt(c.VERBOSE, 0)
  51. c.setopt(c.ENCODING, '')
  52. c.setopt(c.POSTFIELDS, data)
  53. c.perform()
  54. c.close()
  55.  
  56. # print body (debug)
  57. body = buffer.getvalue()
  58. #print(body)
  59.  
  60. # extract the value we want via regex
  61.  
  62. #p = re.compile("1 KRW = ([0-9.]*?) USD")
  63. p = re.compile("1 " + foreignCcy + " = ([0-9.]+) " + baseCcy)
  64. m = p.search(body)
  65.  
  66.  
  67. if m is not None:
  68. #print m.group(1)
  69. return float(m.group(1))
  70. else:
  71. print "Visa: Cannot find exchange rate. BaseCcy: " + baseCcy + ", foreignCcy: " + foreignCcy + ", Date: " + str(requestDate)
  72. print "Exiting..."
  73. exit(-1)
  74.  
  75.  
  76. def mastercard(requestDate, beginDateRange, endDateRange, baseCcy, foreignCcy):
  77. url = "https://www.mastercard.com/psder/eu/callPsder.do"
  78. buffer = StringIO()
  79.  
  80. # headers needed to get Visa site to accept our request
  81. 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']
  82.  
  83.  
  84. # our request(POST data)
  85. f = {'baseCurrency' : baseCcy,
  86. 'settlementDate' : requestDate.strftime("%m/%d/%Y") ,
  87. 'service' : 'getExchngRateDetails',
  88. }
  89.  
  90.  
  91. # takes care of the encoding
  92. data = urllib.urlencode(f)
  93.  
  94. # print data
  95.  
  96. c = pycurl.Curl()
  97. c.setopt(c.URL, url)
  98. c.setopt(c.WRITEDATA, buffer)
  99. c.setopt(c.HTTPHEADER, header)
  100. c.setopt(c.VERBOSE, 0)
  101. c.setopt(c.ENCODING, '')
  102. c.setopt(c.POSTFIELDS, data)
  103. c.perform()
  104. c.close()
  105.  
  106. # print body (debug)
  107. body = buffer.getvalue()
  108. #print(body)
  109.  
  110. # extract the value we want via regex
  111.  
  112. # mastercard gives data in xml... could parse the xml properly, but I'm lazy
  113. p = re.compile(foreignCcy + "</ALPHA_CURENCY_CODE><CURRENCY_NAME>.*?</CURRENCY_NAME><CONVERSION_RATE>([0-9.]+)</CONVERSION_RATE>")
  114. m = p.search(body)
  115.  
  116.  
  117. if m is not None:
  118. #print m.group(1)
  119. return float(m.group(1))
  120. else:
  121.  
  122. #mastercard doesn't seem to provide data for weekends...
  123. # return None if today is a weekend
  124. if(requestDate.isoweekday() in (6,7)):
  125. return None
  126.  
  127. print "Mastercard: Cannot find exchange rate. BaseCcy: " + baseCcy + ", foreignCcy: " + foreignCcy + ", Date: " + str(requestDate)
  128. print "Exiting..."
  129. exit(-1)
  130.  
  131.  
  132. def usage():
  133. print "python getVisaMC -b <base/home currency> -f <foreign/target currency> -t <initial date> -d <days to retrieve after initial date>"
  134. print "eg: python getVisaMC.py -b USD -f JPY -t 20150510 -d 30"
  135. def main(argv):
  136.  
  137. try:
  138. opts, args = getopt.getopt(argv, 'hb:f:t:d:', ['help', 'base=', 'foreign=', 'target=', "days="])
  139. except getopt.GetoptError:
  140. usage()
  141. sys.exit(2)
  142.  
  143. for opt, arg in opts:
  144. if opt in ("-h", "--help"):
  145. usage()
  146. sys.exit(2)
  147. elif opt in ("-b", "--base"):
  148. baseCcy = arg
  149. elif opt in ("-f", "--foreign"):
  150. targetCcy = arg
  151. elif opt in ("-t", "--target"):
  152. targetDate = arg
  153. elif opt in ("-d", "--days"):
  154. numDays = arg
  155. else:
  156. usage()
  157. sys.exit(2)
  158.  
  159. if len(argv) != 8:
  160. print "wrong arguments provided"
  161. usage()
  162. sys.exit(2)
  163.  
  164.  
  165. initialDate = datetime.datetime.strptime(targetDate, '%Y%m%d')
  166.  
  167. beginDateRange = datetime.date.today() + datetime.timedelta(days=-364)
  168. endDateRange = datetime.date.today() + datetime.timedelta(days=1)
  169.  
  170. print "Date, Visa ->, Visa <-, Mastercard ->, Mastercard <-"
  171. for _i in range(int(numDays)):
  172. date = initialDate + datetime.timedelta(days=_i)
  173. v = visa(date, beginDateRange, endDateRange, baseCcy, targetCcy)
  174.  
  175.  
  176. m = mastercard(date, beginDateRange, endDateRange, baseCcy, targetCcy)
  177. if(m is None):
  178. print date.strftime("%Y%m%d") + "," + str(v) + "," + str(1/v) + ",,"
  179. else:
  180. print date.strftime("%Y%m%d") + "," + str(v) + "," + str(1/v) + "," + str(1/m) + "," + str(m)
  181.  
  182.  
  183. if __name__ == "__main__":
  184. main(sys.argv[1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement