E-Paper-Calendar/Calendar/GeckoCrypto.py
2019-07-13 08:05:35 +02:00

68 lines
2.1 KiB
Python

from CryptoInterface import CryptoInterface
from datetime import datetime
from CryptoCoin import CryptoCoin
from urllib.request import urlopen
import json
import math
api_test_url = "https://api.coingecko.com/api/v3/ping"
api_url = "https://api.coingecko.com/api/v3/"
api_metadata_url = api_url + "coins/list"
api_price_url = api_url + "simple/price"
price_currency = "usd"
price_currency_sign = "$"
class GeckoCrypto(CryptoInterface):
def __init__(self, coins):
self.coin_ids = coins
self.metadata = None
super(GeckoCrypto, self).__init__()
def is_available(self):
try:
urlopen(api_test_url)
return True
except:
return False
def __get_coins__(self):
if len(self.coin_ids) == 0:
return []
self.__prepare_metadata__()
coins = []
for id in self.coin_ids:
try:
data = urlopen(api_price_url + "?include_24hr_change=true&ids=" +
self.metadata[id]['id'] + "&vs_currencies=" + price_currency).read()
dataJSON = json.loads(data.decode('utf-8'))
raw = dataJSON[id][price_currency]
price = math.ceil(raw*100) / 100
change = dataJSON[id]['usd_24h_change']
coins.append(self.__build_coin__(id, price, change))
except:
print("Gecko-Error [" + id + "]")
return coins
def __build_coin__(self, id, value, change):
coin = CryptoCoin()
coin.name = self.metadata[id]['name']
coin.day_change = round(change, 2)
coin.price = value
coin.datetime = datetime.now()
coin.fetch_datetime = datetime.now()
coin.currency = price_currency_sign
coin.symbol = self.metadata[id]['symbol']
return coin
def __prepare_metadata__(self):
self.metadata = None
data = urlopen(api_metadata_url).read()
dataJSON = json.loads(data.decode('utf-8'))
self.metadata = {coin['id'].lower(
): coin for coin in dataJSON if coin['id'].lower() in self.coin_ids}