irccex

- fantasy cryptocurrency exchange for irc
git clone git://git.acid.vegas/irccex.git
Log | Files | Refs | Archive | README | LICENSE

coinmarketcap.py (2529B)

      1 #!/usr/bin/env python
      2 # CoinMarketCap API Class - Developed by acidvegas in Python (https://git.acid.vegas/coinmarketcap)
      3 
      4 import http.client
      5 import json
      6 import time
      7 import zlib
      8 
      9 def replace_nulls(json_elem):
     10 	if isinstance(json_elem, list):
     11 		return [replace_nulls(elem) for elem in json_elem]
     12 	elif isinstance(json_elem, dict):
     13 		return {key: replace_nulls(value) for key, value in json_elem.items()}
     14 	else:
     15 		return '0' if json_elem is None else json_elem
     16 
     17 class CoinMarketCap(object):
     18 	def __init__(self, api_key):
     19 		self.api_key = api_key
     20 		self.cache   = {'global':dict(), 'ticker':dict()}
     21 		self.last    = {'global':0     , 'ticker':0     }
     22 
     23 	def _api(self, _endpoint):
     24 		conn = http.client.HTTPSConnection('pro-api.coinmarketcap.com', timeout=15)
     25 		conn.request('GET', '/v1/' + _endpoint, headers={'Accept':'application/json', 'Accept-Encoding':'deflate, gzip', 'X-CMC_PRO_API_KEY':self.api_key})
     26 		response = zlib.decompress(conn.getresponse().read(), 16+zlib.MAX_WBITS).decode('utf-8')
     27 		conn.close()
     28 		return json.loads(response)['data']
     29 
     30 	def _global(self):
     31 		if time.time() - self.last['global'] < 300:
     32 			return self.cache['global']
     33 		else:
     34 			data = self._api('global-metrics/quotes/latest')
     35 			self.cache['global'] = {
     36 				'cryptocurrencies' : data['active_cryptocurrencies'],
     37 				'exchanges'        : data['active_exchanges'],
     38 				'btc_dominance'    : int(data['btc_dominance']),
     39 				'eth_dominance'    : int(data['eth_dominance']),
     40 				'market_cap'       : int(data['quote']['USD']['total_market_cap']),
     41 				'volume'           : int(data['quote']['USD']['total_volume_24h'])
     42 			}
     43 			self.last['global'] = time.time()
     44 			return self.cache['global']
     45 
     46 	def _ticker(self):
     47 		if time.time() - self.last['ticker'] < 300:
     48 			return self.cache['ticker']
     49 		else:
     50 			data = self._api('cryptocurrency/listings/latest?limit=5000')
     51 			data = replace_nulls(data)
     52 			self.cache['ticker'] = dict()
     53 			for item in data:
     54 				self.cache['ticker'][item['symbol']] = {
     55 					'name'       : item['name'],
     56 					'symbol'     : item['symbol'],
     57 					'rank'       : item['cmc_rank'],
     58 					'price'      : float(item['quote']['USD']['price']),
     59 					'percent'    : {'1h':float(item['quote']['USD']['percent_change_1h']), '24h':float(item['quote']['USD']['percent_change_24h']), '7d':float(item['quote']['USD']['percent_change_7d'])},
     60 					'volume'     : int(float(item['quote']['USD']['volume_24h'])),
     61 					'market_cap' : int(float(item['quote']['USD']['market_cap']))
     62 				}
     63 			self.last['ticker'] = time.time()
     64 			return self.cache['ticker']