Modulo 024 – Integração Python com API e JSON

 – Integração Python com API e JSON – Python e Integrações de API

Antes de qualquer coisa... O que é uma API??
API é um conjunto de códigos que uma plataforma, um site, etc fornece para que outros códigos possam usá-los e garantir esse relacionamento de forma segura e precisa.
Nem todas plataformas, oferecem serviço de API, mas existem muitas disponíveis para uso. Veja o exemplo ao lado. Pegamos aqui a API do Youtube (link). Aqui, temos códigos já
disponibilizados pelo próprio youtube que nos auxiliam a executar esses comandos de forma segura.
Ao invés de desenvolvermos um código novo, simplesmente utilizamos a API.

Beleza, entendemos o que é uma API, vamos usar uma na prática.
Para esse exemplo, vamos usar uma API gratuita que nos fornecerá a cotação de moedas (dólar, euro, etc).
Nesse caso, não temos a necessidade de um login na API, então, podemos ir direto para a documentação da API e entender quais são as etapas a serem seguidas para conseguirmos a informação das cotações.
Conforme apresentado ao lado esses dados serão requisitados através do método GET e serão buscados através do link indicado. Essa comunicação pode ser feita em diversas “línguas” uma das mais comuns e quando estamos trabalhando com Python é a JSON.

GET Retorna todas as moedas (atualizado a cada 30 segundos)
Retorna a ultima ocorrência de todas as moedas

• GET - O QUE? - Informa que usaremos o método get para requisitar os dados da API.
• /jason - COMO? – Formatoque será utilizada na “comunicação” entre a API e seu programa. Nesse caso, no formato JSON.
• ONDE? - Endereço que vamos requisitar as informações

Vamos para o nosso código! Como já é rotina, vamos começar importando as bibliotecas serão necessárias. Quando estamos falando de APIs e Formato JSON, vamos utilizar 2 bibliotecas novas:
requests(doc) json(doc)
Primeiro vamos entender a requests. Conforme vimos na documentação da API usaremos o GET para requisitar os dados. No entanto, quando printamos o resultado armazenado na variável cotacoes temos:
<Response [200]>
Sempre que requisitamos dados temos uma resposta. Essa resposta possui um código 200 indica que a requisição foi bem sucedida.

 import requests 
 import json

 cotacoes = requests.get('https://economia.awesomeapi.com.br/json/all')
 print(cotacoes_dic)
_____________________
 <Response [200]> 

• Ao requisitarmos essa informação, temos como resposta Response [200] que significa que a requisição ocorreu corretamente.

Sabemos que a requisição está correta, agora precisamos acessar essa informação.
Para isso usaremos o JSON. Utilizando essa biblioteca poderemos acessar os dados e convertêlos em um dicionário Python.

 import requests 
 import json

 cotacoes = requests.get('https://economia.awesomeapi.com.br/json/all')
 cotacoes_dic = cotacoes.json()
 print(cotacoes_dic)
_____________________
 {'USD': {'code': 'USD', 'codein': 'BRL', 'name': 'Dólar Comercial', 'high': '5.4585', 'low': '5.3662', 'varBid': '-0.0245', 'pctChange': '-0.45', 'bid': '5.4331', 'ask': '5.4343', 'timestamp': '1605540818', 'create_date': '2020-11-16 12:33:39'}, 'USDT': {'code': 'USD', 'codein': 'BRLT', 'name': 'Dólar Turismo', 'high': '5.61', 'low': '5.5', 'varBid': '-0.035', 'pctChange': '-0.62', 'bid': '5.41', 'ask': '5.74', 'timestamp': '1605540240', 'create_date': '2020-11-16 12:24:43'}, 'CAD': {'code': 'CAD', 'codein': 'BRL', 'name': 'Dólar Canadense', 'high': '4.1729', 'low': '4.1014', 'varBid': '0.0008', 'pctChange': '0.02', 'bid': '4.1538', 'ask': '4.1557', 'timestamp': '1605540813', 'create_date': '2020-11-16 12:33:36'}, 'EUR': {'code': 'EUR', 'codein': 'BRL', 'name': 'Euro', 'high': '6.4775', 'low': '6.3551', 'varBid': '-0.0233', 'pctChange': '-0.36', 'bid': '6.4307', 'ask': '6.4342', 'timestamp': '1605540814', 'create_date': '2020-11-16 12:33:37'}, 'GBP': {'code': 'GBP', 'codein': 'BRL', 'name': 'Libra Esterlina', 'high': '7.2275', 'low': '7.0782', 'varBid': '-0.0289', 'pctChange': '-0.4', 'bid': '7.1637', 'ask': '7.169', 'timestamp': '1605540813', 'create_date': '2020-11-16 12:33:36'}, 'ARS': {'code': 'ARS', 'codein': 'BRL', 'name': 'Peso Argentino', 'high': '0.0684', 'low': '0.0673', 'varBid': '-0.0004', 'pctChange': '-0.66', 'bid': '0.0679', 'ask': '0.068', 'timestamp': '1605540818', 'create_date': '2020-11-16 12:33:39'}, 'BTC': {'code': 'BTC', 'codein': 'BRL', 'name': 'Bitcoin', 'high': '89500', 'low': '87351', 'varBid': '2138.6', 'pctChange': '2.45', 'bid': '89210', 'ask': '89496', 'timestamp': '1605540818', 'create_date': '2020-11-16 12:33:39'}, 'LTC': {'code': 'LTC', 'codein': 'BRL', 'name': 'Litecoin', 'high': '385.56', 'low': '338', 'varBid': '38.94', 'pctChange': '11.32', 'bid': '383.01', 'ask': '383.25', 'timestamp': '1605540815', 'create_date': '2020-11-16 12:33:36'}, 'JPY': {'code': 'JPY', 'codein': 'BRL', 'name': 'Iene Japonês', 'high': '0.05229', 'low': '0.05114', 'varBid': '-0.0002', 'pctChange': '-0.38', 'bid': '0.05194', 'ask': '0.05197', 'timestamp': '1605540818', 'create_date': '2020-11-16 12:33:39'}, 'CHF': {'code': 'CHF', 'codein': 'BRL', 'name': 'Franco Suíço', 'high': '5.9992', 'low': '5.8718', 'varBid': '-0.0237', 'pctChange': '-0.4', 'bid': '5.9522', 'ask': '5.9554', 'timestamp': '1605540814', 'create_date': '2020-11-16 12:33:36'}, 'AUD': {'code': 'AUD', 'codein': 'BRL', 'name': 'Dólar Australiano', 'high': '3.9888', 'low': '3.9188', 'varBid': '0.0121', 'pctChange': '0.31', 'bid': '3.9702', 'ask': '3.9718', 'timestamp': '1605540817', 'create_date': '2020-11-16 12:33:39'}, 'CNY': {'code': 'CNY', 'codein': 'BRL', 'name': 'Yuan Chinês', 'high': '0.8307', 'low': '0.8147', 'varBid': '-0.0009', 'pctChange': '-0.11', 'bid': '0.8251', 'ask': '0.8255', 'timestamp': '1605540784', 'create_date': '2020-11-16 12:33:06'}, 'ILS': {'code': 'ILS', 'codein': 'BRL', 'name': 'Novo Shekel Israelense', 'high': '1.6277', 'low': '1.5976', 'varBid': '-0.0005', 'pctChange': '-0.03', 'bid': '1.6197', 'ask': '1.6204', 'timestamp': '1605540786', 'create_date': '2020-11-16 12:33:07'}, 'ETH': {'code': 'ETH', 'codein': 'BRL', 'name': 'Ethereum', 'high': '2500', 'low': '2500', 'varBid': '0', 'pctChange': '0', 'bid': '1460.01', 'ask': '2815.86', 'timestamp': '1605484806', 'create_date': '2020-11-15 21:00:06'}, 'XRP': {'code': 'XRP', 'codein': 'BRL', 'name': 'Ripple', 'high': '1.54', 'low': '1.46', 'varBid': '0.04', 'pctChange': '2.77', 'bid': '1.53', 'ask': '1.54', 'timestamp': '1605540805', 'create_date': '2020-11-16 12:33:26'}} 

– API de Cotação de Moeda

Como vimos no exemplo anterior, o resultado da nossa requisição é um dicionário.
Se olharmos esse dicionário com um pouco mais detalhe, vamos perceber que cada moeda é uma chave deste dicionário.
Se nosso objetivo é conseguir a cotação do dólar (USD), podemos acessar nosso dicionário. Como não conhecemos essa API, antes de irmos para o código, vamos dar uma olhada em sua documentação para entendermos as nomenclaturas utilizadas pela API.

• Usando a documentação da API podemos saber o nome da moeda e qual a chave que devemos utilizar para acessar a cotação.

 print('Dólar: {}'.format(cotacoes_dic['USD']['bid'])) 
 print('Euro: {}'.format(cotacoes_dic['EUR']['bid'])) 
 print('Bitcoin: {}'.format(cotacoes_dic['BTC']['bid'])) 
_______________________
 Dólar: 5.4331
 Euro: 6.4307
 Bitcoin: 89210

• Aqui temos um dicionário dentro de um dicionário. Para o primeiro, identificamos a MOEDA(‘BTC) depois, identificamos a INFORMAÇÃO daquela moeda que queremos(‘bid’).

 A T E N Ç Ã O ! 
Nessa API específica, os valores estarão sempre sendo atualizados, portanto, o valor indicado aqui provavelmente será diferente do valor conseguido por você ☺

Vamos dizer que temos interesse em pegar não só a cotação de hoje, mas dos últimos 30 dias? Como fazer? O primeiro passo, é ler a documentação da API e tentar entender se essa API nos oferece essa opção.
Nesse caso, temos essa opção, o que facilita nosso trabalho. Caso não houvesse, teríamos que programar com os dados disponíveis. MAS como temos, vamos entender como acessar esses dados no print ao lado.

GET Retorna todas as moedas (atualizado a cada 30 segundos)

https://economia.awesomeapi.com.br/jason/daily/USD-BRL/30

• :moeda/:numero_dias - Indica que moeda deverá ser substituído pelo código da moeda; Indica que número de dias será substituído por um número inteiro (integer).
• Aqui estamos pegando os dados de conversão (‘USD–BRL’) dos últimos (’30’) dias.

 cotacoes_dolar30d = requests.get('https://economia.awesomeapi.com.br/json/daily/USD-BRL/30')
 cotacoes_dolar_dic = cotacoes_dolar30d.json()

 lista_cotacoes_dolar = [float(item['bid']) for item in  cotacoes_dolar_dic]
 print(lista_cotacoes_dolar)
________________
 [5.4393, 5.4582, 5.4588, 5.4581, 5.391, 5.4147, 5.3858, 5.3647, 5.3612, 5.525, 5.6635, 5.756, 5.7425, 5.7416, 5.7769, 5.7538, 5.7054, 5.624, 5.617, 5.6175, 5.5918, 5.6031, 5.6053, 5.6107, 5.6453, 5.6445, 5.6096, 5.5949, 5.5691, 5.5316]

• List comprehension, inserindo o valor da cotação na lista_cotações_dólar como float, por se tratarem de números.
• For percorre todo o dicionário disponibilizado pela API.

– Mais exercícios de API com Cotação de Moeda

Nosso objetivo agora será pegar as informações do BitCoin de Jan/20 a Out/20 e plotarmos um gráfico com essas informações. Como fizemos anteriormente, vamos verificar na documentação da nossa API se é possível requisitar essas informações diretamente. Como podemos ver ao lado é possível requisitar e é isso que iremos fazer.
Perceba que o link de requisição possui um número maior de parâmetros, mas todos eles estão listados abaixo na própria API
Basta substituir no link as informações conforme as orientações da API. E é isso que iremos fazer no próximo slide.

 cotacoes_btc =  requests.get('https://economia.awesomeapi.com.br/json/daily/BTC-BRL/200?start_date=20200101&end_date=20201031')
 cotacoes_btc_dic = cotacoes_btc.json()
 lista_cotacoes_btc = [float(item['bid']) for item in cotacoes_btc_dic]

• BTC-BRL: Indica a moeda desejada.
• 200: Indica a quantidade de dados que desejamos.
• 20200101: Indica que a data inicial desejada é 01/01/2020.
• List comprehension visando a criação de uma lista de cotações (lista_cotações_btc.
• 20201031: Indica que a final desejada é 31/10/2020.

As cotações são extraídas da API da mais atual para a mais antiga. Podemos “corrigir” essa informação usando o método .reverse() e ter a informação da mais antiga para a mais nova. Como apresentado abaixo:

 cotacoes_btc =  requests.get('https://economia.awesomeapi.com.br/json/daily/BTC-BRL/200?start_date=20200101&end_date=20201031')
 cotacoes_btc_dic = cotacoes_btc.json()
 lista_cotacoes_btc [float(item['bid']) for item in cotacoes_btc_dic]
 lista_cotacoes_btc.reverse()
 print(lista_cotacoes_btc)
 print(len(lista_cotacoes_btc))
____________________
 [35150.0, 37025.0, 36836.7, 37415.0, 37158.0, 36652.1, 36800.0, 38000.1, 40050.0, 41050.0, 41212.0, 41715.0, 43392.0, 43070.0, 46424.7, 46610.0, 47626.0, 47900.0, 48553.0, 48852.0, 49700.0, 52500.0, 57700.0, 52609.1, 52499.0, 49225.0, 49700.0, 51488.8, 54450.0, 56208.0, 53609.0, 54207.4, 55300.0, 55651.1, 55760.8, 54831.8, 51440.0, 51400.0, 51600.0, 49560.0, 49735.0, 47625.1, 49000.2, 51700.3, 50650.0, 51500.0, 50865.1, 53600.0, 54001.0, 49500.4, 50400.6, 48800.4, 48820.6, 49133.5, 48096.8, 48201.0, 49350.0, 47000.0, 48100.1, 47788.9, 47750.0, 48501.4, 49679.0, 49290.6, 50405.0, 49700.0, 49750.0, 49782.0, 50710.0, 49759.1, 49800.0, 49755.0, 49915.1, 49678.2, 49746.8, 49840.0, 49960.0, 49800.0, 49208.8, 48815.5, 48993.1, 48850.0, 49890.0, 49900.1, 50360.1, 49890.0, 49905.9, 49750.0, 49920.0, 50041.3, 50073.4, 49868.0, 49320.0, 49702.1, 49651.8, 49680.0, 49516.5, 49143.0, 49321.0, 49850.0, 49951.1, 50400.2, 50402.0, 55300.0, 56161.0, 57490.0, 57330.0, 58950.0, 61298.1, 58296.3, 59800.0, 59951.0, 61902.2, 63302.0, 63140.0, 63715.0, 63700.0, 65303.8, 62300.0, 63120.0, 63210.3, 63905.0, 64280.0, 64270.3, 67501.0, 66453.3, 65800.0, 66655.0, 65657.4, 66112.0, 66100.0, 66360.9, 63606.0, 64655.2, 63599.9, 63016.2, 62700.0, 63350.9, 64200.0, 64900.0, 61939.0, 55336.6, 56500.0, 54555.7, 55550.3, 55102.2, 54348.3, 55059.1, 55511.0, 55821.2, 55856.7, 55566.0, 56908.9, 57700.0, 58250.0, 57807.2, 59285.0, 59750.0, 59100.0, 57050.6, 57880.5, 57884.0, 59501.1, 59845.0, 59720.5, 59638.4, 60600.1, 60995.0, 60950.1, 60390.7, 60512.5, 60018.1, 60569.2, 60210.3, 59801.0, 60265.0, 61211.5, 61960.0, 62747.2, 62701.0, 63558.3, 63601.7, 64100.6, 65000.0, 64400.0, 64500.0, 64950.1, 66000.3, 66952.4, 71401.0, 72251.2, 72202.4, 73300.0, 73200.0, 73685.5, 77888.1, 76550.1, 77950.2, 78101.0, 79401.1]
200 

Em posse dessa lista, podemos utilizá-la na elaboração de um gráfico mostrando a evolução da cotação do bitcoin para o período solicitado.

 import matplotlib.pyplot as plt 

 plt.figure(figsize=(15, 5))
 plt.plot(lista_cotacoes_btc)
 plt.show()
___________________________

– API com Login - Envio de SMS com Python e Twilio

Vamos usar agora uma API que necessita de um cadastro anterior.
O cadastro é bem direto e pode ser feito diretamente pelo site do Twilio.
Feito o cadastro, vamos dar uma olhada na documentação da API para entendermos como vamos usá-la para enviar SMS via Python.
Lendo a API, vemos que 2 informações são necessárias e ainda não as possuímos.
Vamos então descobrir onde identifica-las no próximo slide.

 from twilio.rest import Client 

 # Your account SID from twilio.com/console
 account_sid = 'AC274236461c28f62d429961289af45b82'
 # Your auth Token from twilio.com/console
 token = "your_auth_token"

 client = Client(account_sid, token)

 message = client.messages.create(
     to="destino"
     from_="remetente",
     body="Hello from python!")

 print(message.sid)

• Precisamos encontrar o nosso account_sid.
• Precisamos encontrar o nosso token de autenticação.

Na aba Dashboard do Twilio, podemos encontrar o account SID e o Auth Token.
Por motivos de segurança censuramos parte do auth number do pobre coitado que está fazendo essa apostila. Sem a censura, já sabemos que muitos SMS serão magicamente enviados .
Em posse dessas informações, vamos para o nosso código desenvolver o código conforme indicado na documentação da API do Twilio.

 from twilio.rest import Client 

 account_sid = 'AC274236461c28f62d429961289af45b82'
 token = '6a2d1ea365d3674c749ce4cb7367d823'

 client = Client(account_sid, token)

Outra informação que precisamos coletar no site do Twilio é o número de telefone que será utilizado para envio dos SMS.
Para isso, basta clicar na opção Trial number e confirmar. O Twilio lhe dará um número como apresentado ao lado.

 from twilio.rest import Client 

 # Your account SID from twilio.com/console
 account_sid = 'AC274236461c28f62d429961289af45b82'
 # Your auth Token from twilio.com/console
 token = "your_auth_token"

 client = Client(account_sid, token)

 message = client.messages.create(
     to="+18126153399"
     from_="+5521972795556",

 from twilio.rest import Client 

 account_sid = 'AC274236461c28f62d429961289af45b82'
 token = '6a2d1ea365d3674c749ce4cb7367d823'

 client = Client(account_sid, token)

 remetente = '+18126153399'
 destino = '+5521972795556'

Por fim é só escrevermos nossa mensagem e enviar. Antes de rodar o código, verifique se a biblioteca do twilio está instalada. Caso não esteja, assim como já fizemos outras vezes, basta usar o :
pip install twilio

 from twilio.rest import Client 

 account_sid = 'AC274236461c28f62d429961289af45b82'
 token = '6a2d1ea365d3674c749ce4cb7367d823'

 client = Client(account_sid, token)

 remetente = '+18126153399'
 destino = '+5521972795556'

 message = client.messages.create(
     to=destino, 
     from_=remetente,
     body="Coe, é o Lira aqui!")

 print(message.sid)

Nenhum comentário:

Postar um comentário