# . 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)