Files
crypto/backend/python/coingecko.py
2021-07-07 08:56:05 -04:00

102 lines
3.3 KiB
Python

import argparse
import httpx
import json
import datetime
class CoinGecko:
def __init__(self, base_url: str = None):
print('Creating object CoinGecko')
if base_url is None:
base_url = 'https://api.coingecko.com/api/v3'
self.base_url = base_url
def __build_url(self, sub_url: str, query: str = ''):
sub = sub_url
if query != '':
sub = '?'.join([
sub,
query
])
url = '/'.join([
self.base_url,
sub
])
return url
def __get(self, url: str):
resp = httpx.get(url)
if resp.status_code != httpx.codes.OK:
raise Exception(resp.reason_phrase)
return json.loads(resp.text)
def list(self):
print('Getting list of coins from {}'.format(self.base_url))
url = self.__build_url('coins/list')
return self.__get(url)
def get(self, ids: tuple, currencies: tuple, last_updated: bool = True):
print('Getting {} in {} from {}'.format(ids, currencies, self.base_url))
sub = 'simple/price'
query = '&'.join([
'='.join(['ids', ','.join(ids)]),
'='.join(['vs_currencies', ','.join(currencies)]),
'='.join(['include_last_updated_at', 'true' if last_updated else 'false'])
])
url = self.__build_url(sub, query)
res = self.__get(url)
for k, d in res.items():
res[k]['last_updated_at'] = datetime.datetime.fromtimestamp(d['last_updated_at'])\
.strftime('%Y-%m-%d %H:%M:%S.%f%z')
return res
def historical(self, id_: str, currency: str, from_: str, to: str):
print('Getting historical data for {} in {} from {} to {} from {}'.format(id_, currency, from_, to, self.base_url))
sub = '/'.join([
'coins',
id_,
'market_chart',
'range'
])
query = '&'.join([
'='.join(['vs_currency', currency]),
'='.join(['from', from_]),
'='.join(['to', to])
])
url = self.__build_url(sub, query)
res = self.__get(url)
return res
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--url')
parser.add_argument('-i', '--ids', type=str)
parser.add_argument('-c', '--currencies', type=str)
hist = parser.add_subparsers()
hparser = hist.add_parser('hist')
hparser.add_argument('-hi', '--historical', action='store_true')
hparser.add_argument('-f', '--from_')
hparser.add_argument('-t', '--to')
args = parser.parse_args()
print('Called with args: {}'.format(vars(args)))
cg = CoinGecko(args.url)
_ids = tuple(args.ids.split(','))
_currencies = tuple(args.currencies.split(','))
if 'historical' in args and args.historical:
from__ = args.from_
if '-' in from__:
from__ = str(datetime.datetime.fromisoformat(from__).timestamp())
to_ = args.to
if '-' in to_:
to_ = str(datetime.datetime.fromisoformat(to_).timestamp())
print(cg.historical(id_=_ids[0], currency=_currencies[0], from_=from__, to=to_))
exit()
print(cg.get(ids=_ids, currencies=_currencies))