Files
crypto_portfolio/coingecko_api.py

220 lines
9.5 KiB
Python

# . documentação API: https://docs.coingecko.com/v3.0.1/reference/introduction
import requests
import json
CHAVE_API = 'CG-K5RS5VXsdFDip2UvY3z8VjQP'
headers = {
'accept': 'application/json',
'x-cg-demo-api-key': CHAVE_API
}
url_raiz_API = 'https://api.coingecko.com/api/v3/'
# criptomoeda = 'bitcoin'
# vs_currency = 'eur'
# dias = '30'
# precisao = '3'
#url_consulta_ohlc = 'coins/' + criptomoeda + '/ohlc?vs_currency=' + vs_currency + '&days=' + dias + '&precision=' + precisao
# https://docs.coingecko.com/v3.0.1/reference/ping-server
# verificar o estado do servidor API
def ping() -> tuple:
endpoint_api = 'ping'
url_pedido = url_raiz_API + endpoint_api
resposta = requests.get(url_pedido, headers=headers)
return resposta.status_code, resposta.json()['gecko_says']
# debug (decomentar linhas seguintes para testar funcao)
# codigo, dados = ping()
# print(f'codigo: {codigo}')
# print(f'resposta: {dados}')
# https://docs.coingecko.com/v3.0.1/reference/simple-price
# consultar preco de uma ou mais moedas usando o seu ID de Moeda API
def consultar_preco(id_criptomoeda: str = '',
vs_currency: str = '',
flag_include_market_cap: bool = False,
flag_include_24hr_vol: bool = False,
flag_include_24hr_change: bool = False,
flag_include_last_updated_at: bool = False,
precisao: int | str = 'full'
) -> tuple:
'''
consultar preço de um ou mais moedas usando o seu ID de Moeda
podem ser passadas multiplos IDs de moedas separadas por virgula, como objecto de tipo 'str'
'''
# validacao de parametros
if not isinstance(id_criptomoeda, str):
raise TypeError('\'id_criptomoeda\' não é do tipo \'str\'')
if id_criptomoeda == '':
raise ValueError('\'id_criptomoeda\' tem de ser definido')
if not isinstance(vs_currency, str):
raise TypeError('\'vs_currency\' não é do tipo \'str\'')
if vs_currency == '':
raise ValueError('\'vs_currency\' tem de ser definido')
if not isinstance(flag_include_market_cap, bool):
flag_include_market_cap = False
if not isinstance(flag_include_24hr_vol, bool):
flag_include_24hr_vol = False
if not isinstance(flag_include_24hr_change, bool):
flag_include_24hr_change = False
if not isinstance(flag_include_last_updated_at, bool):
flag_include_last_updated_at = False
if (not isinstance(precisao, int)) and (not isinstance(precisao, str)):
raise TypeError('\'precisao\' não é do tipo \'int\' ou \'str\'')
if isinstance(precisao, int):
if precisao < 0:
precisao = 0
if precisao > 18:
precisao = 18
precisao = str(precisao)
endpoint_api = 'simple/price?' + 'ids=' + id_criptomoeda + \
'&vs_currencies=' + vs_currency + \
'&include_market_cap=' + str(flag_include_market_cap).lower() + \
'&include_24hr_vol=' + str(flag_include_24hr_vol).lower() + \
'&include_24hr_change=' + str(flag_include_24hr_change).lower() + \
'&include_last_updated_at=' + str(flag_include_last_updated_at).lower() + \
'&precision=' + precisao
url_pedido = url_raiz_API + endpoint_api
resposta = requests.get(url_pedido, headers=headers)
return resposta.status_code, resposta.json()
# debug (decomentar linhas seguintes para testar funcao)
# codigo, dados_dict = consultar_preco('bitcoin,dogecoin,ethereum,0chain', 'eur')
# if codigo == 200:
# print(f'codigo: {codigo}')
# for moeda in dados_dict:
# print(f'{moeda}')
# for vs_currency in dados_dict[moeda]:
# print(f'\t{vs_currency}: {dados_dict[moeda][vs_currency]:.2f}')
# https://docs.coingecko.com/v3.0.1/reference/simple-supported-currencies
# obter lista de todas as moedas suportadas por CoinGecko que podem ser usados como 'vs_currencies'
def obter_lista_moedas_vs_currencies() -> tuple:
endpoint_api = 'simple/supported_vs_currencies'
url_pedido = url_raiz_API + endpoint_api
resposta = requests.get(url_pedido, headers=headers)
return resposta.status_code, resposta.json()
# debug (decomentar linhas seguintes para testar funcao)
# codigo, dados = obter_lista_moedas_vs_currencies()
# if codigo == 200:
# for item in dados:
# print(item)
# https://docs.coingecko.com/v3.0.1/reference/simple-token-price
# consultar preco de token usando o endereco de contrato do token
def consultar_preco_token(
id_platform: str = '',
contract_address: str = '',
vs_currency: str = '',
flag_include_market_cap: bool = False,
flag_include_24hr_vol: bool = False,
flag_include_24hr_change: bool = False,
flag_include_last_updated_at: bool = False,
precisao: int | str = 'full'
) -> tuple:
# validacao de parametros
if not isinstance(id_platform, str):
raise TypeError('\'id_platform\' tem de ser do tipo \'str\'')
if id_platform == '':
raise ValueError('\'id_platform\' tem de ser definido')
if not isinstance(contract_address, str):
raise TypeError('\'contract_address\' tem de ser do tipo \'str\'')
if contract_address == '':
raise ValueError('\'contract_address\' tem de ser definido')
if not isinstance(vs_currency, str):
raise TypeError('\'vs_currency\' tem de ser do tipo \'str\'')
if vs_currency == '':
raise ValueError('\'vs_currency\' tem de ser definido')
if not isinstance(flag_include_market_cap, bool):
flag_include_market_cap = False
if not isinstance(flag_include_24hr_vol, bool):
flag_include_24hr_vol = False
if not isinstance(flag_include_24hr_change, bool):
flag_include_24hr_change = False
if not isinstance(flag_include_last_updated_at, bool):
flag_include_last_updated_at = False
if (not isinstance(precisao, int)) and (not isinstance(precisao, str)):
raise TypeError('\'precisao\' tem de ser do tipo \'int\' ou \'str\'')
if isinstance(precisao, int):
if precisao < 0:
precisao = 0
if precisao > 18:
precisao = 18
precisao = str(precisao)
endpoint_api = 'simple/token_price/' + id_platform + \
'?contract_addresses=' + contract_address + \
'&vs_currencies=' + vs_currency + \
'&include_market_cap=' + str(flag_include_market_cap).lower() + \
'&include_24hr_vol=' + str(flag_include_24hr_vol).lower() + \
'&include_24hr_change=' + str(flag_include_24hr_change).lower() + \
'&include_last_updated_at=' + str(flag_include_last_updated_at).lower() + \
'&precision=' + precisao
url_pedido = url_raiz_API + endpoint_api
resposta = requests.get(url_pedido, headers=headers)
return resposta.status_code, resposta.json()
# debug (decomentar linhas seguintes para testar funcao)
# id_plataforma = 'ethereum'
# enderecos_contracto = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0x4594cffbfc09bc5e7ecf1c2e1c1e24f0f7d29036'
# codigo, dados = consultar_preco_token(id_plataforma, enderecos_contracto, 'eur')
# print(f'codigo: {codigo}')
# if codigo == 200:
# for contrato in dados:
# print(f'{contrato}')
# for vs_currency in dados[contrato]:
# print(f'\t{vs_currency}: {dados[contrato][vs_currency]:0.2f}')
# https://api.coingecko.com/api/v3/coins/list
# obter todas as moedas suportadas em CoinGecko com IDs, nome, simbolo e (no caso de contractos) endereco na plataforma das moedas
def lista_moedas(flag_include_platform: bool = False) -> tuple:
if not isinstance(flag_include_platform, bool):
flag_include_platform = False
endpoint_api = 'coins/list?' + str(flag_include_platform).lower()
url_pedido = url_raiz_API + endpoint_api
resposta = requests.get(url_pedido, headers=headers)
return resposta.status_code, resposta.json()
# debug (decomentar linhas seguintes para testar funcao)
# codigo, dados = lista_moedas(flag_include_platform=False)
# if codigo == 200:
# for item in dados:
# print(item)
# fazer consulta de dados OHLC
def consulta_ohcl(criptomoeda: str = '',
vs_currency: str = '',
dias: int | str = 30,
precisao: int | str = 3
) -> tuple:
# validacao de parametros
if not isinstance(criptomoeda, str):
raise TypeError('\'criptomoeda\' não é do tipo \'str\'')
if criptomoeda == '':
raise ValueError('\'criptomoeda\' tem de ser definido')
if not isinstance(vs_currency, str):
raise TypeError('\'vs_currency\' não é do tipo \'str\'')
if vs_currency == '':
raise ValueError('\'vs_currency\' tem de ser definido')
if (not isinstance(dias, str)) and (not isinstance(dias, int)):
raise TypeError('\'dias\' não é do tipo \'str\' ou \'int\'')
if isinstance(dias, int):
dias = str(dias)
if (not isinstance(precisao, str)) and (not isinstance(precisao, int)):
raise TypeError('\'precisao\' não é do tipo \'str\' ou \'int\'')
if isinstance(precisao, int):
precisao = str(precisao)
endpoint_api = 'coins/' + criptomoeda + '/ohlc?vs_currency=' + vs_currency + '&days=' + dias + '&precision=' + precisao
url_pedido = url_raiz_API + endpoint_api
resposta = requests.get(url_pedido, headers=headers)
return resposta.status_code, resposta.json()
# debug (decomentar linhas seguintes para testar funcao)
# codigo, dados = consulta_ohcl('dogecoin', 'eur', precisao=5)
# if codigo == 200:
# print(f'codigo: {codigo}')
# for item in dados:
# print(item)