1
resposta

[DESAFIO] - Usando API para a conversão de moedas

Dividi meu código em 3 arquivos, um main (principal), extrator_url e outro para consulta_contação:

extrator:

import re


class ExtratorURL:
    def __init__(self, url):
        self.url = self.sanitiza_url(url)
        self.valida_url()

    def sanitiza_url(self, url):
        return url.replace(' ', '')

    def valida_url(self):
        if not self.url:
            raise ValueError('A URL não pode ser vazia')

        padrao_url = re.compile("(http(s)?://)?(www.)?bytebank.com(.br)?/cambio")
        match = padrao_url.match(self.url)

        if not match:
            raise ValueError("A URL não é válida.")

    def get_url_base(self):
        indice_interrogacao = self.url.find('?')
        url_base = self.url[:indice_interrogacao]
        return url_base

    def get_url_parametros(self):
        indice_interrogacao = self.url.find('?')
        url_parametros = self.url[indice_interrogacao + 1:]
        return url_parametros

    def get_valor_parametro(self, parametro_busca):
        indice_parametro = self.get_url_parametros().find(parametro_busca)
        indice_valor = indice_parametro + len(parametro_busca) + 1
        indice_e_comercial = self.get_url_parametros().find('&', indice_valor)

        if indice_e_comercial == -1:
            valor = self.get_url_parametros()[indice_valor:]
        else:
            valor = self.get_url_parametros()[indice_valor:indice_e_comercial]
        return valor

    def __str__(self):
        return self.url

    def __len__(self):
        return len(self.url)

    def __eq__(self, other):
        return self.url == other.url

Consulta cotação

import requests

class CotacaoAtual:
    def __init__(self, moedaOrigem, moedaDestino):
        self._moeda_origem = moedaOrigem
        self._moeda_destino = moedaDestino

    def requisicao_api(self):
        resposta = requests.get(
            f'https://economia.awesomeapi.com.br/json/last/{self._moeda_origem}-{self._moeda_destino}')
        if resposta.status_code == 200:
            return resposta.json()
        else:
            return resposta.status_code

    def get_valor_cotacao(self):
        dados_cotacao = self.requisicao_api()
        if type(dados_cotacao) is not int:
            cotacao = float(
                dados_cotacao[f'{self._moeda_origem}{self._moeda_destino}']['low'])
            return cotacao
        else:
            return dados_cotacao

    def get_valor_convertido(self, valor):
        dados_cotacao = self.requisicao_api()
        if type(dados_cotacao) is not int:
            cotacao = float(
                dados_cotacao[f'{self._moeda_origem}{self._moeda_destino}']['low'])
            valor_convertido = valor * cotacao
            return valor_convertido
        else:
            return dados_cotacao

    def __str__(self):
        return f'A Cotação atual é 1 {self._moeda_origem} = {self.get_valor_cotacao()} {self._moeda_destino}'

main

from extrator import ExtratorURL
from consulta_cotacao import CotacaoAtual

url = "bytebank.com/cambio?moedaOrigem=USD&moedaDestino=BRL&valor=100"

extrator_url = ExtratorURL(url)

moeda_origem = extrator_url.get_valor_parametro('moedaOrigem')
moeda_destino = extrator_url.get_valor_parametro('moedaDestino')
valor = float(extrator_url.get_valor_parametro('valor'))

cotacao_dolar_real = CotacaoAtual(moeda_origem, moeda_destino)

print(cotacao_dolar_real)
print(f'{valor} {moeda_origem} = {cotacao_dolar_real.get_valor_convertido(valor)} {moeda_destino}')

usa a API https://docs.awesomeapi.com.br/api-de-moedas

1 resposta

Oii, André! Tudo bem?

Parabéns por concluir o desafio proposto! Continue assim, a estrutura do seu código ficou bem organizada, é muito importante praticar os conhecimentos adquiridos para se desenvolver cada vez mais.

Caso alguma dúvida surja, fique à vontade para abrir um novo tópico e compartilhar com o fórum.

Conte com a Alura para evoluir em sua jornada.

Bons estudos, André!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!