├── README.md ├── atlas_da_noticia └── atlas.py ├── compras_gov_br └── api_compras_gov_br.ipynb ├── covid19 └── covid19_portalms.py ├── diario_oficial_pref_sp └── do_pref_sp.py ├── ipeadata ├── Ipeadatapy Usage Demonstration_portuguese.ipynb └── fluxogram.png ├── portal_da_transparencia ├── codigos_siafi_siape.ipynb └── despesas_MCTIC.ipynb ├── prefeitura_sp_esic └── api_esic.py ├── proposicoes_jornalismo └── mestra.py ├── rsiconfi ├── gastos_estaduais_SP_com_saude_2018.R ├── mg_rsiconfi.R └── script_indice_FIRJAN.R └── twitter ├── acessa_api_twitter_final.ipynb ├── pega_tweets.R └── redes_sociais_politicos_exemplo.xlsx /README.md: -------------------------------------------------------------------------------- 1 | # APIs 2 | Scripts para acesso de APIs de interesse público 3 | -------------------------------------------------------------------------------- /atlas_da_noticia/atlas.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Abraji (https://www.abraji.org.br) 3 | # Reinaldo Chaves (reinaldo@abraji.org.br) 4 | # Programa acessar a API do Atlas da Notícia (https://www.atlas.jor.br/) 5 | # É necessário antes se cadastrar, veja como aqui: https://www.atlas.jor.br/plataforma/utilizarAPI/ 6 | # 7 | 8 | import requests 9 | import pandas as pd 10 | 11 | # Link da requisição principal 12 | url = "https://api.atlas.jor.br/api/v1/auth/login" 13 | 14 | # Informações de autentificação 15 | payload = "{\"email\": \"coloque_seu_email\", \"password\": \"coloque_sua_senha\"}" 16 | 17 | # Parâmetros padrão da API 18 | headers = { 19 | 'Content-Type': "application/json", 20 | 'Accept': "*/*", 21 | 'Cache-Control': "no-cache", 22 | 'Host': "api.atlas.jor.br", 23 | 'Accept-Encoding': "gzip, deflate", 24 | 'Connection': "keep-alive", 25 | 'cache-control': "no-cache" 26 | } 27 | 28 | # Faz a requisição para obter a senha Bearer 29 | try: 30 | response = requests.request("POST", url, data=payload, headers=headers) 31 | except requests.exceptions.HTTPError as errh: 32 | print ("Http Error:",errh) 33 | except requests.exceptions.ConnectionError as errc: 34 | print ("Error Connecting:",errc) 35 | except requests.exceptions.Timeout as errt: 36 | print ("Timeout Error:",errt) 37 | except requests.exceptions.RequestException as err: 38 | print ("OOps: Something Else",err) 39 | 40 | 41 | # Captura a informação exata 42 | body = json.loads(response.content) 43 | # O token 44 | token = body["access_token"] 45 | # O tempo de duração do token 46 | expiresIn = body["expires_in"] 47 | 48 | # Agora com a senha é possível fazer diversas requisições 49 | # Exemplo veículos do Estado de SP 50 | # Outros tipos de buscas aqui: https://api.atlas.jor.br/docs 51 | url= "https://api.atlas.jor.br/api/v1/data/analytic?estado=SP" 52 | 53 | # Faz a requisição, já informando a senha Bearer 54 | try: 55 | r = requests.get(url, headers = {"Authorization":"Bearer " + token}) 56 | except requests.exceptions.HTTPError as errh: 57 | print ("Http Error:",errh) 58 | except requests.exceptions.ConnectionError as errc: 59 | print ("Error Connecting:",errc) 60 | except requests.exceptions.Timeout as errt: 61 | print ("Timeout Error:",errt) 62 | except requests.exceptions.RequestException as err: 63 | print ("OOps: Something Else",err) 64 | 65 | # Lê a resposta em JSON 66 | dados = r.json() 67 | 68 | # Cria dataframe 69 | df_atlas = pd.DataFrame(dados) 70 | df_atlas.info() 71 | df_atlas.to_csv('resultados/atlas_sp.csv', index=False) 72 | -------------------------------------------------------------------------------- /covid19/covid19_portalms.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Abraji (https://www.abraji.org.br) 3 | # Reinaldo Chaves (reinaldo@abraji.org.br) 4 | # 5 | # Dia 26/03/2020 6 | # 7 | # Captura dados da covid-19 disponibilizados pelo Ministério da Saúde em https://covid.saude.gov.br/ 8 | # 9 | 10 | # Instale: 11 | # pip3 install requests 12 | # pip3 install pandas 13 | # pip3 install xlrd 14 | # pip3 install openpyxl 15 | 16 | 17 | import requests 18 | import pandas as pd 19 | 20 | headers = { 21 | 'authority': 'xx9p7hp1p7.execute-api.us-east-1.amazonaws.com', 22 | 'accept': 'application/json, text/plain, */*', 23 | 'sec-fetch-dest': 'empty', 24 | 'x-parse-application-id': 'unAFkcaNDeXajurGB7LChj8SgQYS2ptm', 25 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 26 | 'origin': 'https://covid.saude.gov.br', 27 | 'sec-fetch-site': 'cross-site', 28 | 'sec-fetch-mode': 'cors', 29 | 'referer': 'https://covid.saude.gov.br/', 30 | 'accept-language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,es;q=0.6,it;q=0.5', 31 | } 32 | 33 | 34 | # CAPTURA CASOS POR REGIOES 35 | response = requests.get('https://xx9p7hp1p7.execute-api.us-east-1.amazonaws.com/prod/PortalRegiao', headers=headers) 36 | 37 | regioes = response.json() 38 | 39 | conteudo = [] 40 | for pagina in regioes["results"]: 41 | dicionario = { 42 | "objectId": pagina.get('objectId'), 43 | "nome": pagina.get('nome'), 44 | "color": pagina.get('color'), 45 | "percent": pagina.get('percent'), 46 | "qtd": pagina.get('qtd'), 47 | "createdAt": pagina.get('createdAt'), 48 | "updatedAt": pagina.get('updatedAt') 49 | } 50 | 51 | conteudo.append(dicionario) 52 | 53 | df_regioes = pd.DataFrame(conteudo) 54 | 55 | # Escolha salvar em CSV ou XLSX 56 | df_regioes.to_csv('casos_regioes.csv',index=False) 57 | df_regioes.to_excel('casos_regioes.xlsx', sheet_name='Sheet1', index=False) 58 | 59 | 60 | 61 | # CAPTURA ACUMULO - DIAS 62 | response = requests.get('https://xx9p7hp1p7.execute-api.us-east-1.amazonaws.com/prod/PortalAcumulo', headers=headers) 63 | 64 | acumulo = response.json() 65 | 66 | conteudo = [] 67 | for pagina in acumulo["results"]: 68 | dicionario = { 69 | "objectId": pagina.get('objectId'), 70 | "label": pagina.get('label'), 71 | "qtd_confirmado": pagina.get('qtd_confirmado'), 72 | "qtd_obito": pagina.get('qtd_obito'), 73 | "createdAt": pagina.get('createdAt'), 74 | "updatedAt": pagina.get('updatedAt') 75 | } 76 | 77 | conteudo.append(dicionario) 78 | 79 | df_acumulado = pd.DataFrame(conteudo) 80 | 81 | # Escolha salvar em CSV ou XLSX 82 | df_acumulado.to_csv('casos_acumulados.csv',index=False) 83 | df_acumulado.to_excel('casos_acumulados.xlsx', sheet_name='Sheet1', index=False) 84 | 85 | 86 | # CAPTURA POR ESTADOS 87 | response = requests.get('https://xx9p7hp1p7.execute-api.us-east-1.amazonaws.com/prod/PortalMapa', headers=headers) 88 | 89 | estados = response.json() 90 | 91 | conteudo = [] 92 | 93 | for pagina in estados["results"]: 94 | dicionario = { 95 | "objectId": pagina.get('objectId'), 96 | "nome": pagina.get('nome'), 97 | "qtd_confirmado": pagina.get('qtd_confirmado'), 98 | "latitude": pagina.get('latitude'), 99 | "longitude": pagina.get('longitude'), 100 | "createdAt": pagina.get('createdAt'), 101 | "updatedAt": pagina.get('updatedAt') 102 | } 103 | 104 | conteudo.append(dicionario) 105 | 106 | df_estados = pd.DataFrame(conteudo) 107 | 108 | # Escolha salvar em CSV ou XLSX 109 | df_estados.to_csv('casos_estados.csv',index=False) 110 | df_estados.to_excel('casos_estados.xlsx', sheet_name='Sheet1', index=False) 111 | 112 | 113 | 114 | # CAPTURA POR SEMANA EPIDEMIOLÓGICA 115 | response = requests.get('https://xx9p7hp1p7.execute-api.us-east-1.amazonaws.com/prod/PortalSemana', headers=headers) 116 | 117 | semanas = response.json() 118 | 119 | conteudo = [] 120 | 121 | for pagina in semanas["results"]: 122 | dicionario = { 123 | "objectId": pagina.get('objectId'), 124 | "label": pagina.get('label'), 125 | "qtd_confirmado": pagina.get('qtd_confirmado'), 126 | "qtd_obito": pagina.get('qtd_obito'), 127 | "createdAt": pagina.get('createdAt'), 128 | "updatedAt": pagina.get('updatedAt') 129 | } 130 | 131 | conteudo.append(dicionario) 132 | 133 | df_semanas = pd.DataFrame(conteudo) 134 | 135 | # Escolha salvar em CSV ou XLSX 136 | df_semanas.to_csv('casos_semanas.csv',index=False) 137 | df_semanas.to_excel('casos_semanas.xlsx', sheet_name='Sheet1', index=False) 138 | 139 | 140 | 141 | # CAPTURA POR DIAS 142 | response = requests.get('https://xx9p7hp1p7.execute-api.us-east-1.amazonaws.com/prod/PortalDias', headers=headers) 143 | 144 | dias = response.json() 145 | 146 | conteudo = [] 147 | 148 | for pagina in dias["results"]: 149 | dicionario = { 150 | "objectId": pagina.get('objectId'), 151 | "label": pagina.get('label'), 152 | "qtd_confirmado": pagina.get('qtd_confirmado'), 153 | "createdAt": pagina.get('createdAt'), 154 | "updatedAt": pagina.get('updatedAt') 155 | } 156 | 157 | conteudo.append(dicionario) 158 | 159 | df_dias = pd.DataFrame(conteudo) 160 | 161 | # Escolha salvar em CSV ou XLSX 162 | df_dias.to_csv('casos_dias.csv',index=False) 163 | df_dias.to_excel('casos_dias.xlsx', sheet_name='Sheet1', index=False) 164 | 165 | 166 | 167 | 168 | # CAPTURA GERAL - DA SOMA TOTAL 169 | response = requests.get('https://xx9p7hp1p7.execute-api.us-east-1.amazonaws.com/prod/PortalGeral', headers=headers) 170 | 171 | geral = response.json() 172 | 173 | conteudo = [] 174 | 175 | for pagina in geral["results"]: 176 | dicionario = { 177 | "objectId": pagina.get('objectId'), 178 | "total_confirmado": pagina.get('total_confirmado'), 179 | "createdAt": pagina.get('createdAt'), 180 | "total_obitos": pagina.get('total_obitos'), 181 | "versao": pagina.get('versao'), 182 | "dt_atualizacao": pagina.get('dt_atualizacao'), 183 | } 184 | 185 | conteudo.append(dicionario) 186 | 187 | df_geral = pd.DataFrame(conteudo) 188 | 189 | # Escolha salvar em CSV ou XLSX 190 | df_geral.to_csv('casos_geral.csv',index=False) 191 | df_geral.to_excel('casos_geral.xlsx', sheet_name='Sheet1', index=False) 192 | -------------------------------------------------------------------------------- /diario_oficial_pref_sp/do_pref_sp.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Abraji (https://www.abraji.org.br) 3 | # Reinaldo Chaves (reinaldo@abraji.org.br) 4 | # Programa acessar a API do Diário Oficial da Prefeitura de SP 5 | # Licitações e Publicações 6 | # 7 | 8 | ''' 9 | Para acessar pode ser seguido este roteiro: 10 | 11 | 1 – Vá no https://apilib.prefeitura.sp.gov.br/store/ e clique em VÁ PARA A VITRINE DE APIS. Clique depois em Criar Conta. Depois faça o login no site 12 | 13 | 2 – Entre na Vitrine de APIS e escolha uma delas. Como a API do e-SIC municipal ou a Diario_Oficial-v1 14 | 15 | 3 – Dentro da API escolha a opção “Inscrever-se” 16 | 17 | 4 – Clique no menu no alto na esquerda em APLICAÇÕES 18 | 19 | 5 – Clique em “DefaultApplication” 20 | 21 | 6 - Clique na aba "Chaves de Produção" 22 | 23 | 7 – Clique em gerar as chaves. Vão aparecer as chaves: "Chave do Consumidor" e "Segredo do Consumidor" (estas chaves você pode usar no seu script) 24 | 25 | (MAS AS CHAVES TÊM CURTA DURAÇÃO DE TEMPO - VOCÊ PRECISA PEGAR NOVAS DEPOIS DE UM TEMPO - AO CLICAR EM 'REGENERAR') 26 | 27 | A chave principal usada em scripts é o “Token de Acesso” 28 | 29 | 8 - Clique de novo no menu no alto na esquerda, agora em APIS – depois VITRINE DE APIS 30 | 31 | 9 – Entre de novo na API que escolheu no item 2 32 | 33 | 10 – Na aba Console da API agora você pode testar uma requisição 34 | 35 | 11 – Clique em GET 36 | 37 | 12 – Depois em “Try out” 38 | 39 | 13 – Digite os parâmetros de busca, por exemplo, ano 2018, que é o item obrigatório, e Execute 40 | 41 | 14 – Abaixo vai aparecer o dado em formato JSON, no caso todos os pedidos de informação feitos à Prefeitura de São Paulo no e-Sic municipal, ou um dia específico no Diario_Oficial-v1 42 | ''' 43 | 44 | 45 | import requests 46 | import pandas as pd 47 | from pprint import pprint 48 | import time 49 | 50 | 51 | payload = {} 52 | 53 | # A key Bearer precisa ser renovada a cada 3.600 segundos em https://apilib.prefeitura.sp.gov.br 54 | # Colocar a sua no xxxxxxxxxxxxxxxxxxxxxx 55 | headers = { 56 | 'accept': 'application/json', 57 | 'Authorization': 'Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 58 | } 59 | 60 | 61 | 62 | ### LICITAÇÕES PUBLICADAS NO DIÁRIO OFICIAL DA PREFEITURA DE SÃO PAULO 63 | 64 | # Eexemplo com o mes de janeiro/2021 65 | # Documentacao: https://apilib.prefeitura.sp.gov.br/store/apis/info?name=Diario_Oficial&version=v1&provider=admin#/tab1 66 | 67 | for i in range(1,32): 68 | if i <= 9: 69 | dia = "0" + str(i) 70 | else: 71 | dia = str(i) 72 | 73 | url = "https://gateway.apilib.prefeitura.sp.gov.br/sg/dom/v1/Licitacao?dataPublicacao=2021-01-" + dia + "&caderno=11" 74 | 75 | try: 76 | response = requests.request("GET", url, headers=headers, data = payload) 77 | except requests.exceptions.RequestException as e: # This is the correct syntax 78 | raise SystemExit(e) 79 | 80 | codigo = response.status_code 81 | 82 | if codigo != 200: 83 | print(url) 84 | print("Erro na data, ou na requisição, ou sem informações na data escolhida: " + str(codigo)) 85 | else: 86 | dados = response.json() 87 | #pprint(dados) 88 | df_procura1 = pd.DataFrame(dados) 89 | 90 | if i == 1: 91 | df_licit = df_procura1 92 | else: 93 | df_licit = df_licit.append(df_procura1) 94 | 95 | time.sleep(2) 96 | 97 | df_licit.info() 98 | 99 | # Salva em CSV 100 | df_licit.to_csv('dados_licitacoes_no_DO_prefeitura_sp_janeiro_2021.csv', index=False) 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | ### PUBLICAÇÕES NO DIÁRIO OFICIAL DA PREFEITURA DE SÃO PAULO 110 | 111 | # Eexemplo com o mes de janeiro/2021 112 | # Documentacao: https://apilib.prefeitura.sp.gov.br/store/apis/info?name=Diario_Oficial&version=v1&provider=admin#/tab1 113 | 114 | for i in range(1,32): 115 | if i <= 9: 116 | dia = "0" + str(i) 117 | else: 118 | dia = str(i) 119 | 120 | url = "https://gateway.apilib.prefeitura.sp.gov.br/sg/dom/v1/Publicacao?dataPublicacao=2021-01-" + dia + "&caderno=11" 121 | 122 | try: 123 | response = requests.request("GET", url, headers=headers, data = payload) 124 | except requests.exceptions.RequestException as e: # This is the correct syntax 125 | raise SystemExit(e) 126 | 127 | codigo = response.status_code 128 | 129 | if codigo != 200: 130 | print(url) 131 | print("Erro na data, ou na requisição, ou sem informações na data escolhida: " + str(codigo)) 132 | else: 133 | dados = response.json() 134 | #pprint(dados) 135 | df_procura1 = pd.DataFrame(dados) 136 | 137 | if i == 1: 138 | df_publi = df_procura1 139 | else: 140 | df_publi = df_publi.append(df_procura1) 141 | 142 | time.sleep(2) 143 | 144 | df_publi.info() 145 | 146 | # Salva em CSV 147 | df_publi.to_csv('dados_publicacoes_no_DO_prefeitura_sp_janeiro_2021.csv', index=False) 148 | 149 | 150 | -------------------------------------------------------------------------------- /ipeadata/fluxogram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abraji/APIs/f595f40a5952555e23422847b4f726bcec42cbc5/ipeadata/fluxogram.png -------------------------------------------------------------------------------- /portal_da_transparencia/codigos_siafi_siape.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# -*- coding: utf-8\n", 10 | "# Reinaldo Chaves (@paidatocandeira)\n", 11 | "# Acessa a API do Portal da Transparência para pegar os códigos de identificação do SIAFI e do SIAPE\n", 12 | "# Programa do curso Técnicas de raspagem de dados e acesso a APIs\n", 13 | "#" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "import requests\n", 23 | "import pandas as pd" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": null, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 3, 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "# Documentação em: http://www.transparencia.gov.br/swagger-ui.html#/\n", 40 | "# Procurar em Órgãos" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": {}, 47 | "outputs": [], 48 | "source": [] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "# SIAFI - Sistema Integrado de Administração Financeira do Governo Federal" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 4, 60 | "metadata": {}, 61 | "outputs": [ 62 | { 63 | "name": "stdout", 64 | "output_type": "stream", 65 | "text": [ 66 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=1\n", 67 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=2\n", 68 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=3\n", 69 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=4\n", 70 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=5\n", 71 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=6\n", 72 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=7\n", 73 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=8\n", 74 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=9\n", 75 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=10\n", 76 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=11\n", 77 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=12\n", 78 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=13\n", 79 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=14\n", 80 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=15\n", 81 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=16\n", 82 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=17\n", 83 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=18\n", 84 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=19\n", 85 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=20\n", 86 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=21\n", 87 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=22\n", 88 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=23\n", 89 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=24\n", 90 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=25\n", 91 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=26\n", 92 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=27\n", 93 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=28\n", 94 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=29\n", 95 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=30\n", 96 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=31\n", 97 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=32\n", 98 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=33\n", 99 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=34\n", 100 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=35\n", 101 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=36\n", 102 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=37\n", 103 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=38\n", 104 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina=39\n" 105 | ] 106 | } 107 | ], 108 | "source": [ 109 | "# Na documentação é possível verificar que são 39 páginas atualmente\n", 110 | "for num in range(1, 40): \n", 111 | " pagina = str(num)\n", 112 | " # Aqui o único parâmetro necessário é o número da página\n", 113 | " url = f'http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siafi?pagina={pagina}'\n", 114 | " print(url)\n", 115 | " \n", 116 | " # Testes padrões de erros em requisições \n", 117 | " try:\n", 118 | " # Faz requisição com o método GET\n", 119 | " # O método GET é usado para recuperar informações do servidor usando um determinado URI\n", 120 | " r = requests.get(url)\n", 121 | " except requests.exceptions.HTTPError as errh:\n", 122 | " print (\"Http Error:\",errh)\n", 123 | " except requests.exceptions.ConnectionError as errc:\n", 124 | " print (\"Error Connecting:\",errc) \n", 125 | " except requests.exceptions.Timeout as errt:\n", 126 | " print (\"Timeout Error:\",errt)\n", 127 | " except requests.exceptions.RequestException as err:\n", 128 | " print (\"OOps: Something Else\",err)\n", 129 | " \n", 130 | " # Uma das formas de resposta pode ser no formato JSON\n", 131 | " siafi = r.json()\n", 132 | " \n", 133 | " # Só para mostrar o JSON\n", 134 | " #print(siafi)\n", 135 | " #a = input(\"Aperte para continuar...\")\n", 136 | " \n", 137 | " # E o formato JSON pode ser transformado em dataframe com o pandas \n", 138 | " df_siafi_parcial = pd.DataFrame(siafi)\n", 139 | " \n", 140 | " if num == 1: # caso for a primeira página\n", 141 | " df_siafi = df_siafi_parcial\n", 142 | " elif num > 1: # a partir da segunda faz um append nos dados\n", 143 | " # Depois da primeira página faz append no dataframe final\n", 144 | " df_siafi = df_siafi.append(df_siafi_parcial)" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": null, 150 | "metadata": {}, 151 | "outputs": [], 152 | "source": [] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 5, 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "data": { 161 | "text/html": [ 162 | "
\n", 163 | "\n", 176 | "\n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | "
indexcodigodescricao
0001000Câmara dos Deputados - Unidades com vínculo di...
1101901Fundo Rotativo da Câmara dos Deputados
2202000Senado Federal - Unidades com vínculo direto
3302001Fundo Especial do Senado Federal
4402002Senado Federal/ FUNSEEP
\n", 218 | "
" 219 | ], 220 | "text/plain": [ 221 | " index codigo descricao\n", 222 | "0 0 01000 Câmara dos Deputados - Unidades com vínculo di...\n", 223 | "1 1 01901 Fundo Rotativo da Câmara dos Deputados \n", 224 | "2 2 02000 Senado Federal - Unidades com vínculo direto\n", 225 | "3 3 02001 Fundo Especial do Senado Federal\n", 226 | "4 4 02002 Senado Federal/ FUNSEEP" 227 | ] 228 | }, 229 | "execution_count": 5, 230 | "metadata": {}, 231 | "output_type": "execute_result" 232 | } 233 | ], 234 | "source": [ 235 | "df_siafi.reset_index().head()" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": 6, 241 | "metadata": {}, 242 | "outputs": [ 243 | { 244 | "name": "stdout", 245 | "output_type": "stream", 246 | "text": [ 247 | "\n", 248 | "Int64Index: 576 entries, 0 to 5\n", 249 | "Data columns (total 2 columns):\n", 250 | "codigo 576 non-null object\n", 251 | "descricao 576 non-null object\n", 252 | "dtypes: object(2)\n", 253 | "memory usage: 13.5+ KB\n" 254 | ] 255 | } 256 | ], 257 | "source": [ 258 | "df_siafi.info()" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "execution_count": null, 264 | "metadata": {}, 265 | "outputs": [], 266 | "source": [] 267 | }, 268 | { 269 | "cell_type": "code", 270 | "execution_count": 7, 271 | "metadata": {}, 272 | "outputs": [], 273 | "source": [ 274 | "# Procura quais tem CIENCIA no nome" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 8, 280 | "metadata": {}, 281 | "outputs": [], 282 | "source": [ 283 | "str_choice = \"CIENCIA|CIÊNCIA|Ciencia|Ciência\" \n", 284 | "\n", 285 | "ciencia = df_siafi[df_siafi['descricao'].str.contains(str_choice, na=False)]" 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": 9, 291 | "metadata": {}, 292 | "outputs": [ 293 | { 294 | "data": { 295 | "text/html": [ 296 | "
\n", 297 | "\n", 310 | "\n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | "
codigodescricao
1024000Ministério da Ciência, Tecnologia, Inovações e...
1226284Fundação Universidade Federal de Ciências da S...
326356Instituto Federal de Educação, Ciência e Tecno...
526402Instituto Federal de Educação, Ciência e Tecno...
626403Instituto Federal de Educação, Ciência e Tecno...
\n", 346 | "
" 347 | ], 348 | "text/plain": [ 349 | " codigo descricao\n", 350 | "10 24000 Ministério da Ciência, Tecnologia, Inovações e...\n", 351 | "12 26284 Fundação Universidade Federal de Ciências da S...\n", 352 | "3 26356 Instituto Federal de Educação, Ciência e Tecno...\n", 353 | "5 26402 Instituto Federal de Educação, Ciência e Tecno...\n", 354 | "6 26403 Instituto Federal de Educação, Ciência e Tecno..." 355 | ] 356 | }, 357 | "execution_count": 9, 358 | "metadata": {}, 359 | "output_type": "execute_result" 360 | } 361 | ], 362 | "source": [ 363 | "ciencia.head()" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 10, 369 | "metadata": {}, 370 | "outputs": [], 371 | "source": [ 372 | "# O Ministério da Ciência, Tecnologia, Inovações e Comunicações é '24000'" 373 | ] 374 | }, 375 | { 376 | "cell_type": "code", 377 | "execution_count": null, 378 | "metadata": {}, 379 | "outputs": [], 380 | "source": [] 381 | }, 382 | { 383 | "cell_type": "code", 384 | "execution_count": 11, 385 | "metadata": {}, 386 | "outputs": [], 387 | "source": [ 388 | "# Grava CSV" 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 12, 394 | "metadata": {}, 395 | "outputs": [], 396 | "source": [ 397 | "df_siafi.to_csv(\"codigos/codigos_siafi.csv\", index=False)" 398 | ] 399 | }, 400 | { 401 | "cell_type": "code", 402 | "execution_count": null, 403 | "metadata": {}, 404 | "outputs": [], 405 | "source": [] 406 | }, 407 | { 408 | "cell_type": "code", 409 | "execution_count": 18, 410 | "metadata": {}, 411 | "outputs": [], 412 | "source": [ 413 | "# Agora mesmo processo para pegar os códigos de identificação do SIAPE" 414 | ] 415 | }, 416 | { 417 | "cell_type": "markdown", 418 | "metadata": {}, 419 | "source": [ 420 | "# SIAPE (Sistema Integrado de Administração de Pessoal)" 421 | ] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "execution_count": 13, 426 | "metadata": {}, 427 | "outputs": [ 428 | { 429 | "name": "stdout", 430 | "output_type": "stream", 431 | "text": [ 432 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=1\n", 433 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=2\n", 434 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=3\n", 435 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=4\n", 436 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=5\n", 437 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=6\n", 438 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=7\n", 439 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=8\n", 440 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=9\n", 441 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=10\n", 442 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=11\n", 443 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=12\n", 444 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=13\n", 445 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=14\n", 446 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=15\n", 447 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=16\n", 448 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=17\n", 449 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=18\n", 450 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=19\n", 451 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=20\n", 452 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=21\n", 453 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=22\n", 454 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=23\n", 455 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=24\n", 456 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=25\n", 457 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=26\n", 458 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=27\n", 459 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=28\n", 460 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=29\n", 461 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=30\n", 462 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=31\n", 463 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=32\n", 464 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=33\n", 465 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=34\n", 466 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=35\n", 467 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=36\n", 468 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=37\n", 469 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=38\n", 470 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=39\n", 471 | "http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina=40\n" 472 | ] 473 | } 474 | ], 475 | "source": [ 476 | "for num in range(1, 41):\n", 477 | " pagina = str(num)\n", 478 | " url = f'http://www.portaldatransparencia.gov.br/api-de-dados/orgaos-siape?pagina={pagina}'\n", 479 | " print(url)\n", 480 | " \n", 481 | " try:\n", 482 | " r = requests.get(url)\n", 483 | " except requests.exceptions.HTTPError as errh:\n", 484 | " print (\"Http Error:\",errh)\n", 485 | " except requests.exceptions.ConnectionError as errc:\n", 486 | " print (\"Error Connecting:\",errc) \n", 487 | " except requests.exceptions.Timeout as errt:\n", 488 | " print (\"Timeout Error:\",errt)\n", 489 | " except requests.exceptions.RequestException as err:\n", 490 | " print (\"OOps: Something Else\",err)\n", 491 | " \n", 492 | " siape = r.json()\n", 493 | " \n", 494 | " df_siape_parcial = pd.DataFrame(siape)\n", 495 | " \n", 496 | " if num == 1:\n", 497 | " df_siape = df_siape_parcial\n", 498 | " elif num > 1:\n", 499 | " df_siape = df_siape.append(df_siape_parcial)" 500 | ] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "execution_count": null, 505 | "metadata": {}, 506 | "outputs": [], 507 | "source": [] 508 | }, 509 | { 510 | "cell_type": "code", 511 | "execution_count": 14, 512 | "metadata": {}, 513 | "outputs": [ 514 | { 515 | "data": { 516 | "text/html": [ 517 | "
\n", 518 | "\n", 531 | "\n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | "
indexcodigodescricao
0000001IGNORADO - CONVERSAO DO SIPEFAZ
1100005Exc - Empresa Privada
2200006Exc - Empresas Públicas / CLT
3300008Exc - Entidades em Extinção / L.80
4400009Exc - Estados / Municípios / Outros
\n", 573 | "
" 574 | ], 575 | "text/plain": [ 576 | " index codigo descricao\n", 577 | "0 0 00001 IGNORADO - CONVERSAO DO SIPEFAZ\n", 578 | "1 1 00005 Exc - Empresa Privada\n", 579 | "2 2 00006 Exc - Empresas Públicas / CLT\n", 580 | "3 3 00008 Exc - Entidades em Extinção / L.80\n", 581 | "4 4 00009 Exc - Estados / Municípios / Outros" 582 | ] 583 | }, 584 | "execution_count": 14, 585 | "metadata": {}, 586 | "output_type": "execute_result" 587 | } 588 | ], 589 | "source": [ 590 | "df_siape.reset_index().head()" 591 | ] 592 | }, 593 | { 594 | "cell_type": "code", 595 | "execution_count": 15, 596 | "metadata": {}, 597 | "outputs": [ 598 | { 599 | "name": "stdout", 600 | "output_type": "stream", 601 | "text": [ 602 | "\n", 603 | "Int64Index: 590 entries, 0 to 4\n", 604 | "Data columns (total 2 columns):\n", 605 | "codigo 590 non-null object\n", 606 | "descricao 590 non-null object\n", 607 | "dtypes: object(2)\n", 608 | "memory usage: 13.8+ KB\n" 609 | ] 610 | } 611 | ], 612 | "source": [ 613 | "df_siape.info()" 614 | ] 615 | }, 616 | { 617 | "cell_type": "code", 618 | "execution_count": null, 619 | "metadata": {}, 620 | "outputs": [], 621 | "source": [] 622 | }, 623 | { 624 | "cell_type": "code", 625 | "execution_count": 16, 626 | "metadata": {}, 627 | "outputs": [], 628 | "source": [ 629 | "df_siape.to_csv(\"codigos/codigos_siape.csv\", index=False)" 630 | ] 631 | }, 632 | { 633 | "cell_type": "code", 634 | "execution_count": null, 635 | "metadata": {}, 636 | "outputs": [], 637 | "source": [] 638 | } 639 | ], 640 | "metadata": { 641 | "kernelspec": { 642 | "display_name": "Python 3", 643 | "language": "python", 644 | "name": "python3" 645 | }, 646 | "language_info": { 647 | "codemirror_mode": { 648 | "name": "ipython", 649 | "version": 3 650 | }, 651 | "file_extension": ".py", 652 | "mimetype": "text/x-python", 653 | "name": "python", 654 | "nbconvert_exporter": "python", 655 | "pygments_lexer": "ipython3", 656 | "version": "3.6.8" 657 | } 658 | }, 659 | "nbformat": 4, 660 | "nbformat_minor": 2 661 | } 662 | -------------------------------------------------------------------------------- /prefeitura_sp_esic/api_esic.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Abraji (https://www.abraji.org.br) 3 | # Reinaldo Chaves (reinaldo@abraji.org.br) 4 | # Programa acessar a API do e-SIC da Prefeitura de SP 5 | # 6 | 7 | import requests 8 | import pandas as pd 9 | 10 | # Coloque o valor de sua chave Bearer aqui 11 | key = '' 12 | endpoint = 'https://gateway.apilib.prefeitura.sp.gov.br/cgm/esic/v1/' 13 | headers = {'Authorization': 'Bearer ' + key} 14 | 15 | # Escolha o ano 16 | ano = '2019' 17 | 18 | # O limite máximo de resultados que consegui foram 30.000 para o ano de 2019 19 | # A paginação offset ainda não funcionou 20 | # Para outros anos tem que testar o limite - 2018 por exemplo funcionou 40000 21 | limite = '?limite=30000' 22 | 23 | # Faz a requisição 24 | r = requests.get(endpoint + ano + limite, headers = headers) 25 | 26 | # Pega os dados retornados em JSON 27 | # Faz uma lista a partir de 'data' onde estão os dados 28 | dados = r.json() 29 | lista = dados['data'] 30 | 31 | # Cria dataframe 32 | df_esic = pd.DataFrame(lista) 33 | 34 | df_esic.info() 35 | 36 | df_esic.reset_index().head() 37 | 38 | # Salva em CSV 39 | df_esic.to_csv('dados_esic2019.csv', index=False) 40 | -------------------------------------------------------------------------------- /proposicoes_jornalismo/mestra.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Abraji (https://www.abraji.org.br) 3 | # Reinaldo Chaves (reinaldo@abraji.org.br) 4 | # Programa acessar as APIs do Senado e da Camara 5 | # Baixas as proposicoes do dia e dia anterior 6 | # Filtra aquelas com palavras-chave sobre o jornalismo 7 | # Envia um e-mail de alerta para endereços de escolha 8 | # 9 | 10 | import requests 11 | import pandas as pd 12 | import time 13 | from datetime import datetime, timedelta 14 | import os 15 | import json 16 | import xmltodict 17 | import smtplib 18 | from email.mime.image import MIMEImage 19 | from email.mime.multipart import MIMEMultipart 20 | from email.mime.text import MIMEText 21 | 22 | 23 | 24 | 25 | ### FUNÇÃO DA CÂMARA DOS DEPUTADOS 26 | def camara(dia_anterior,mes_anterior,ano_anterior,dia_hoje,mes_hoje,ano_hoje): 27 | # Forma url de pesquisa 28 | url = "https://dadosabertos.camara.leg.br/api/v2/proposicoes?dataInicio=%s-%s-%s&dataFim=%s-%s-%s&ordem=ASC&ordenarPor=id" % (ano_anterior, mes_anterior, dia_anterior, ano_hoje, mes_hoje, dia_hoje) 29 | print(url) 30 | 31 | # Captura quantas páginas tem esse intervalo de data na API 32 | parametros = {'formato': 'json', 'itens': 100} 33 | resposta = requests.get(url, parametros) 34 | 35 | for vez in resposta.json()['links']: 36 | conta = {"rel": vez['rel'].strip(), "href": vez['href'].strip()} 37 | 38 | # Testa se a url tem alguma proposicao 39 | ultimo = conta['rel'] 40 | if ultimo != 'last': 41 | column_names = ["a"] 42 | df = pd.DataFrame(columns = column_names) 43 | return df 44 | 45 | # Para este item da API da Câmara sempre o último item link (last) tem o número de páginas 46 | # Considerando 100 itens por página 47 | 48 | # Isola o endereço de last 49 | link_ultimo = str(conta['href'].strip()) 50 | 51 | # Encontra local exato onde termina o número de páginas 52 | posicao = int(link_ultimo.find('&itens=')) 53 | 54 | # Com um fatiamento de lista, a partir da posição 139 onde sempre está o número, captura o número 55 | # de caracteres que corresponde a "posicao" 56 | # Exemplo: se "posicao" tiver 141 então vai ser [139:141] 57 | # o que significa comprimento de 139 (inclusive) até 141 (exclusive) 58 | # E adiciono mais 1 porque o range abaixo sempre vai um menos 59 | ultima = int(link_ultimo[139:posicao]) + 1 60 | 61 | # Cria lista vazia 62 | proposicoes = [] 63 | 64 | # Faz a iteração a partir do número de páginas encontrado 65 | for pagina in range(1, ultima): 66 | parametros = {'formato': 'json', 'itens': 100, 'pagina': pagina} 67 | resposta = requests.get(url, parametros) 68 | 69 | # Captura os dados 70 | for vez in resposta.json()['dados']: 71 | dicionario = {"id": str(vez['id']).strip(), 72 | "uri": str(vez['uri']).strip(), 73 | "siglaTipo": str(vez['siglaTipo']).strip(), 74 | "codTipo": str(vez['codTipo']).strip(), 75 | "numero": str(vez['numero']).strip(), 76 | "ano": str(vez['ano']).strip(), 77 | "ementa": str(vez['ementa']).strip() 78 | } 79 | proposicoes.append(dicionario) 80 | 81 | df_proposicoes_api = pd.DataFrame(proposicoes) 82 | #df_proposicoes_api.info() 83 | 84 | 85 | # Isola apenas proposicoes de interesse 86 | df_proposicoes_api['ementa_copia'] = df_proposicoes_api['ementa'] 87 | df_proposicoes_api['ementa_copia'] = df_proposicoes_api['ementa_copia'].str.upper() 88 | 89 | df_proposicoes_api_final = df_proposicoes_api[pd.notnull(df_proposicoes_api['ementa_copia'])].copy() 90 | 91 | 92 | # Coleta autores 93 | endpoint = "https://www.camara.leg.br/SitCamaraWS/Proposicoes.asmx/ListarAutoresProposicao?codProposicao=" 94 | 95 | conta = 0 96 | 97 | for num, row in df_proposicoes_api_final.iterrows(): 98 | id = row['id'] 99 | 100 | url = endpoint + id 101 | #print(url) 102 | 103 | try: 104 | r = requests.get(url) 105 | except requests.exceptions.RequestException as e: 106 | print("Requests exception: {}".format(e)) 107 | 108 | jsonString = json.dumps(xmltodict.parse(r.text), indent=4) 109 | 110 | d = json.loads(jsonString) 111 | 112 | lista = [d['autores']] 113 | 114 | df_lista = pd.DataFrame(lista) 115 | df_lista["id"] = id 116 | 117 | if conta == 0: 118 | df_autores = df_lista.copy() 119 | else: 120 | df_autores = df_autores.append(df_lista) 121 | 122 | conta = conta + 1 123 | #df_autores.info() 124 | 125 | seleciona = jornal(df_proposicoes_api_final, 'camara') 126 | 127 | # Testa se há frases no dia 128 | tamanho = len(seleciona) 129 | if tamanho == 0: 130 | return seleciona 131 | 132 | # Busca a última situação das proposicoes 133 | endpoint = "https://dadosabertos.camara.leg.br/api/v2/proposicoes/" 134 | 135 | projetos = [] 136 | parametros = {'formato': 'json'} 137 | 138 | for num, row in seleciona.iterrows(): 139 | id = row['id'] 140 | 141 | url = endpoint + id 142 | #print(url) 143 | 144 | # captura os dados de detalhes 145 | try: 146 | r = requests.get(url, parametros) 147 | except requests.exceptions.RequestException as e: 148 | print("Requests exception: {}".format(e)) 149 | 150 | vez = r.json()['dados'] 151 | 152 | dicionario = {"id": str(vez['id']).strip(), 153 | "uri": str(vez['uri']).strip(), 154 | "siglaTipo": str(vez['siglaTipo']).strip(), 155 | "codTipo": str(vez['codTipo']).strip(), 156 | "numero": str(vez['numero']).strip(), 157 | "ano": str(vez['ano']).strip(), 158 | "ementa": str(vez['ementa']).strip(), 159 | "dataApresentacao": str(vez['dataApresentacao']).strip(), 160 | "statusProposicao_dataHora": str(vez['statusProposicao']['dataHora']).strip(), 161 | "statusProposicao_siglaOrgao": str(vez['statusProposicao']['siglaOrgao']).strip(), 162 | "statusProposicao_siglaOrgao": str(vez['statusProposicao']['siglaOrgao']).strip(), 163 | "statusProposicao_descricaoTramitacao": str(vez['statusProposicao']['descricaoTramitacao']).strip(), 164 | "statusProposicao_descricaoSituacao": str(vez['statusProposicao']['descricaoSituacao']).strip(), 165 | "statusProposicao_despacho": str(vez['statusProposicao']['despacho']).strip(), 166 | "keywords": str(vez['keywords']).strip(), 167 | "urlInteiroTeor": str(vez['urlInteiroTeor']).strip(), 168 | "uriAutores": str(vez['uriAutores']).strip() 169 | } 170 | 171 | projetos.append(dicionario) 172 | 173 | df_proposicoes_situacao = pd.DataFrame(projetos) 174 | # Inclui autores 175 | df_proposicoes_situacao_autor = pd.merge(df_proposicoes_situacao.drop_duplicates('id'), df_autores, left_on='id', right_on='id') 176 | #df_projetos_situacao.info() 177 | 178 | 179 | df_proposicoes_situacao_autor['ementa_minuscula'] = df_proposicoes_situacao_autor['ementa'] 180 | df_proposicoes_situacao_autor['ementa_minuscula'] = df_proposicoes_situacao_autor['ementa_minuscula'].str.lower() 181 | 182 | return df_proposicoes_situacao_autor 183 | 184 | 185 | 186 | 187 | 188 | ### FUNÇÃO DO SENADO 189 | # função para ler todas chaves nas APIs do senado 190 | def get_by_key(key, value): 191 | try: 192 | if '.' in key: 193 | old_key, new_key = key.split('.', 1) 194 | new_value = value[old_key] 195 | return get_by_key(new_key, new_value) 196 | else: 197 | return value[key] 198 | except (KeyError, TypeError) as _: 199 | return None 200 | 201 | 202 | def senado(ano_anterior, mes_anterior, dia_anterior): 203 | # Define header padrão 204 | headers = {"Accept" : "application/json"} 205 | 206 | # Forma url de pesquisa principal 207 | url = "http://legis.senado.leg.br/dadosabertos/materia/tramitando?data=%s%s%s" % (ano_anterior, mes_anterior, dia_anterior) 208 | print(url) 209 | 210 | tramitando = [] 211 | 212 | try: 213 | r = requests.get(url, headers=headers) 214 | tramit = r.json() 215 | except requests.exceptions.RequestException as e: 216 | print("Requests exception: {}".format(e)) 217 | 218 | # Testa se a url tem alguma proposicao 219 | try: 220 | teste = str(tramit["ListaMateriasTramitando"]["Materias"]["Materia"]) 221 | except KeyError: 222 | column_names = ["a"] 223 | df = pd.DataFrame(columns = column_names) 224 | return df 225 | except TypeError: 226 | column_names = ["a"] 227 | df = pd.DataFrame(columns = column_names) 228 | return df 229 | 230 | # Captura dados de proposicoes tramitando 231 | for item in tramit["ListaMateriasTramitando"]["Materias"]["Materia"]: 232 | dicionario = { 233 | "CodigoMateria": get_by_key('IdentificacaoMateria.CodigoMateria', item), 234 | "SiglaCasaIdentificacaoMateria": get_by_key('IdentificacaoMateria.SiglaCasaIdentificacaoMateria', item), 235 | "NomeCasaIdentificacaoMateria": get_by_key('IdentificacaoMateria.NomeCasaIdentificacaoMateria', item), 236 | "SiglaSubtipoMateria": get_by_key('IdentificacaoMateria.SiglaSubtipoMateria', item), 237 | "DescricaoSubtipoMateria": get_by_key('IdentificacaoMateria.DescricaoSubtipoMateria', item), 238 | "NumeroMateria": get_by_key('IdentificacaoMateria.NumeroMateria', item), 239 | "AnoMateria": get_by_key('IdentificacaoMateria.AnoMateria', item), 240 | "DescricaoIdentificacaoMateria": get_by_key('IdentificacaoMateria.DescricaoIdentificacaoMateria', item), 241 | "IndicadorTramitando": get_by_key('IdentificacaoMateria.IndicadorTramitando', item), 242 | "DataUltimaAtualizacao": get_by_key('DataUltimaAtualizacao', item) 243 | } 244 | 245 | tramitando.append(dicionario) 246 | 247 | df_tramitando = pd.DataFrame(tramitando) 248 | #df_tramitando.info() 249 | 250 | #df_tramitando.to_csv('resultados/senado/proposicoes_senado_do_dia.csv',index=False) 251 | 252 | 253 | # Dados de cada materia 254 | prefixo = 'http://legis.senado.leg.br/dadosabertos/materia/' 255 | 256 | projetos_det = [] 257 | 258 | for num, row in df_tramitando.iterrows(): 259 | codigo = row['CodigoMateria'] 260 | 261 | url = prefixo + codigo 262 | #print(url) 263 | 264 | try: 265 | r = requests.get(url, headers=headers) 266 | except requests.exceptions.HTTPError as errh: 267 | print ("Http Error:",errh) 268 | except requests.exceptions.ConnectionError as errc: 269 | print ("Error Connecting:",errc) 270 | except requests.exceptions.Timeout as errt: 271 | print ("Timeout Error:",errt) 272 | except requests.exceptions.RequestException as err: 273 | print ("OOps: Something Else",err) 274 | 275 | projects = r.json() 276 | 277 | dicionario = { 278 | "CodigoMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.CodigoMateria', projects), 279 | "SiglaCasaIdentificacaoMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.SiglaCasaIdentificacaoMateria', projects), 280 | "NomeCasaIdentificacaoMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.NomeCasaIdentificacaoMateria', projects), 281 | "SiglaSubtipoMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.SiglaSubtipoMateria', projects), 282 | "DescricaoSubtipoMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.DescricaoSubtipoMateria', projects), 283 | "NumeroMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.NumeroMateria', projects), 284 | "AnoMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.AnoMateria', projects), 285 | "DescricaoObjetivoProcesso": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.DescricaoObjetivoProcesso', projects), 286 | "DescricaoIdentificacaoMateria": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.DescricaoIdentificacaoMateria', projects), 287 | "IndicadorTramitando": get_by_key('DetalheMateria.Materia.IdentificacaoMateria.IndicadorTramitando', projects), 288 | "EmentaMateria": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.EmentaMateria', projects), 289 | "ExplicacaoEmentaMateria": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.ExplicacaoEmentaMateria', projects), 290 | "ApelidoMateria": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.ApelidoMateria', projects), 291 | "IndicadorComplementar": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.IndicadorComplementar', projects), 292 | "DataApresentacao": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.DataApresentacao', projects), 293 | "DataLeitura": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.DataLeitura', projects), 294 | "SiglaCasaLeitura": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.SiglaCasaLeitura', projects), 295 | "NomeCasaLeitura": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.NomeCasaLeitura', projects), 296 | "CodigoNatureza": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.NaturezaMateria.CodigoNatureza', projects), 297 | "NomeNatureza": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.NaturezaMateria.NomeNatureza', projects), 298 | "DescricaoNatureza": get_by_key('DetalheMateria.Materia.DadosBasicosMateria.NaturezaMateria.DescricaoNatureza', projects), 299 | "Codigo_assunto": get_by_key('DetalheMateria.Materia.Assunto.AssuntoEspecifico.Codigo', projects), 300 | "Descricao_assunto": get_by_key('DetalheMateria.Materia.Assunto.AssuntoEspecifico.Descricao', projects), 301 | "Codigo_assunto_geral": get_by_key('DetalheMateria.Materia.Assunto.AssuntoGeral.Codigo', projects), 302 | "Descricao_assunto_geral": get_by_key('DetalheMateria.Materia.Assunto.AssuntoGeral.Descricao', projects), 303 | "NomePoderOrigem": get_by_key('DetalheMateria.Materia.OrigemMateria.NomePoderOrigem', projects), 304 | "SiglaCasaOrigem": get_by_key('DetalheMateria.Materia.OrigemMateria.SiglaCasaOrigem', projects), 305 | "NomeCasaOrigem": get_by_key('DetalheMateria.Materia.OrigemMateria.NomeCasaOrigem', projects), 306 | "SiglaCasaIniciadora": get_by_key('DetalheMateria.Materia.CasaIniciadoraNoLegislativo.SiglaCasaIniciadora', projects), 307 | "NomeCasaIniciadora": get_by_key('DetalheMateria.Materia.CasaIniciadoraNoLegislativo.NomeCasaIniciadora', projects) 308 | } 309 | 310 | try: 311 | NomeAutor = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['NomeAutor']) 312 | except KeyError: 313 | NomeAutor = None 314 | except TypeError: 315 | NomeAutor = None 316 | 317 | try: 318 | SiglaTipoAutor = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['SiglaTipoAutor']) 319 | except KeyError: 320 | SiglaTipoAutor = None 321 | except TypeError: 322 | SiglaTipoAutor = None 323 | 324 | try: 325 | DescricaoTipoAutor = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['DescricaoTipoAutor']) 326 | except KeyError: 327 | DescricaoTipoAutor = None 328 | except TypeError: 329 | DescricaoTipoAutor = None 330 | 331 | try: 332 | UfAutor = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['UfAutor']) 333 | except KeyError: 334 | UfAutor = None 335 | except TypeError: 336 | UfAutor = None 337 | 338 | try: 339 | NumOrdemAutor = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['NumOrdemAutor']) 340 | except KeyError: 341 | NumOrdemAutor = None 342 | except TypeError: 343 | NumOrdemAutor = None 344 | 345 | try: 346 | IndicadorOutrosAutores = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IndicadorOutrosAutores']) 347 | except KeyError: 348 | IndicadorOutrosAutores = None 349 | except TypeError: 350 | IndicadorOutrosAutores = None 351 | 352 | try: 353 | CodigoParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['CodigoParlamentar']) 354 | except KeyError: 355 | CodigoParlamentar = None 356 | except TypeError: 357 | CodigoParlamentar = None 358 | 359 | try: 360 | CodigoPublicoNaLegAtual = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['CodigoPublicoNaLegAtual']) 361 | except KeyError: 362 | CodigoPublicoNaLegAtual = None 363 | except TypeError: 364 | CodigoPublicoNaLegAtual = None 365 | 366 | try: 367 | NomeParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['NomeParlamentar']) 368 | except KeyError: 369 | NomeParlamentar = None 370 | except TypeError: 371 | NomeParlamentar = None 372 | 373 | try: 374 | NomeCompletoParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['NomeCompletoParlamentar']) 375 | except KeyError: 376 | NomeCompletoParlamentar = None 377 | except TypeError: 378 | NomeCompletoParlamentar = None 379 | 380 | try: 381 | SexoParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['SexoParlamentar']) 382 | except KeyError: 383 | SexoParlamentar = None 384 | except TypeError: 385 | SexoParlamentar = None 386 | 387 | try: 388 | FormaTratamento = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['FormaTratamento']) 389 | except KeyError: 390 | FormaTratamento = None 391 | except TypeError: 392 | FormaTratamento = None 393 | 394 | try: 395 | UrlFotoParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['UrlFotoParlamentar']) 396 | except KeyError: 397 | UrlFotoParlamentar = None 398 | except TypeError: 399 | UrlFotoParlamentar = None 400 | 401 | try: 402 | UrlPaginaParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['UrlPaginaParlamentar']) 403 | except KeyError: 404 | UrlPaginaParlamentar = None 405 | except TypeError: 406 | UrlPaginaParlamentar = None 407 | 408 | try: 409 | EmailParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['EmailParlamentar']) 410 | except KeyError: 411 | EmailParlamentar = None 412 | except TypeError: 413 | EmailParlamentar = None 414 | 415 | try: 416 | SiglaPartidoParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['SiglaPartidoParlamentar']) 417 | except KeyError: 418 | SiglaPartidoParlamentar = None 419 | except TypeError: 420 | SiglaPartidoParlamentar = None 421 | 422 | try: 423 | UfParlamentar = str(projects['DetalheMateria']['Materia']['Autoria']['Autor'][0]['IdentificacaoParlamentar']['UfParlamentar']) 424 | except KeyError: 425 | UfParlamentar = None 426 | except TypeError: 427 | UfParlamentar = None 428 | 429 | try: 430 | NumeroAutuacao = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['NumeroAutuacao']) 431 | except KeyError: 432 | NumeroAutuacao = None 433 | except TypeError: 434 | NumeroAutuacao = None 435 | 436 | try: 437 | DataSituacao = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Situacao']['DataSituacao']) 438 | except KeyError: 439 | DataSituacao = None 440 | except TypeError: 441 | DataSituacao = None 442 | 443 | try: 444 | CodigoSituacao = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Situacao']['CodigoSituacao']) 445 | except KeyError: 446 | CodigoSituacao = None 447 | except TypeError: 448 | CodigoSituacao = None 449 | 450 | try: 451 | SiglaSituacao = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Situacao']['SiglaSituacao']) 452 | except KeyError: 453 | SiglaSituacao = None 454 | except TypeError: 455 | SiglaSituacao = None 456 | 457 | try: 458 | DescricaoSituacao = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Situacao']['DescricaoSituacao']) 459 | except KeyError: 460 | DescricaoSituacao = None 461 | except TypeError: 462 | DescricaoSituacao = None 463 | 464 | try: 465 | DataLocal = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Local']['DataLocal']) 466 | except KeyError: 467 | DataLocal = None 468 | except TypeError: 469 | DataLocal = None 470 | 471 | try: 472 | CodigoLocal = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Local']['CodigoLocal']) 473 | except KeyError: 474 | CodigoLocal = None 475 | except TypeError: 476 | CodigoLocal = None 477 | 478 | try: 479 | TipoLocal = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Local']['TipoLocal']) 480 | except KeyError: 481 | TipoLocal = None 482 | except TypeError: 483 | TipoLocal = None 484 | 485 | try: 486 | SiglaCasaLocal = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Local']['SiglaCasaLocal']) 487 | except KeyError: 488 | SiglaCasaLocal = None 489 | except TypeError: 490 | SiglaCasaLocal = None 491 | 492 | try: 493 | NomeCasaLocal = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Local']['NomeCasaLocal']) 494 | except KeyError: 495 | NomeCasaLocal = None 496 | except TypeError: 497 | NomeCasaLocal = None 498 | 499 | try: 500 | SiglaLocal = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Local']['SiglaLocal']) 501 | except KeyError: 502 | SiglaLocal = None 503 | except TypeError: 504 | SiglaLocal = None 505 | 506 | try: 507 | NomeLocal = str(projects['DetalheMateria']['Materia']['SituacaoAtual']['Autuacoes']['Autuacao'][0]['Local']['NomeLocal']) 508 | except KeyError: 509 | NomeLocal = None 510 | except TypeError: 511 | NomeLocal = None 512 | 513 | try: 514 | url_emendas = str(projects['DetalheMateria']['Materia']['OutrasInformacoes']['Servico'][0]['UrlServico']) 515 | except KeyError: 516 | url_emendas = None 517 | except TypeError: 518 | url_emendas = None 519 | 520 | try: 521 | url_movimentacoes = str(projects['DetalheMateria']['Materia']['OutrasInformacoes']['Servico'][1]['UrlServico']) 522 | except KeyError: 523 | url_movimentacoes = None 524 | except TypeError: 525 | url_movimentacoes = None 526 | 527 | try: 528 | url_relatorias = str(projects['DetalheMateria']['Materia']['OutrasInformacoes']['Servico'][2]['UrlServico']) 529 | except KeyError: 530 | url_relatorias = None 531 | except TypeError: 532 | url_relatorias = None 533 | 534 | try: 535 | url_texto = str(projects['DetalheMateria']['Materia']['OutrasInformacoes']['Servico'][3]['UrlServico']) 536 | except KeyError: 537 | url_texto = None 538 | except TypeError: 539 | url_texto = None 540 | 541 | try: 542 | url_votacoes_materia = str(projects['DetalheMateria']['Materia']['OutrasInformacoes']['Servico'][4]['UrlServico']) 543 | except KeyError: 544 | url_votacoes_materia = None 545 | except TypeError: 546 | url_votacoes_materia = None 547 | 548 | try: 549 | url_votacoes_comissoes = str(projects['DetalheMateria']['Materia']['OutrasInformacoes']['Servico'][5]['UrlServico']) 550 | except KeyError: 551 | url_votacoes_comissoes = None 552 | except TypeError: 553 | url_votacoes_comissoes = None 554 | 555 | dicionario['NomeAutor'] = NomeAutor 556 | dicionario['SiglaTipoAutor'] = SiglaTipoAutor 557 | dicionario['DescricaoTipoAutor'] = DescricaoTipoAutor 558 | dicionario['UfAutor'] = UfAutor 559 | dicionario['NumOrdemAutor'] = NumOrdemAutor 560 | dicionario['IndicadorOutrosAutores'] = IndicadorOutrosAutores 561 | dicionario['CodigoParlamentar'] = CodigoParlamentar 562 | dicionario['CodigoPublicoNaLegAtual'] = CodigoPublicoNaLegAtual 563 | dicionario['NomeParlamentar'] = NomeParlamentar 564 | dicionario['NomeCompletoParlamentar'] = NomeCompletoParlamentar 565 | dicionario['SexoParlamentar'] = SexoParlamentar 566 | dicionario['FormaTratamento'] = FormaTratamento 567 | dicionario['UrlFotoParlamentar'] = UrlFotoParlamentar 568 | dicionario['UrlPaginaParlamentar'] = UrlPaginaParlamentar 569 | dicionario['EmailParlamentar'] = EmailParlamentar 570 | dicionario['SiglaPartidoParlamentar'] = SiglaPartidoParlamentar 571 | dicionario['UfParlamentar'] = UfParlamentar 572 | dicionario['NumeroAutuacao'] = NumeroAutuacao 573 | dicionario['DataSituacao'] = DataSituacao 574 | dicionario['CodigoSituacao'] = CodigoSituacao 575 | dicionario['SiglaSituacao'] = SiglaSituacao 576 | dicionario['DescricaoSituacao'] = DescricaoSituacao 577 | dicionario['DataLocal'] = DataLocal 578 | dicionario['CodigoLocal'] = CodigoLocal 579 | dicionario['TipoLocal'] = TipoLocal 580 | dicionario['SiglaCasaLocal'] = SiglaCasaLocal 581 | dicionario['NomeCasaLocal'] = NomeCasaLocal 582 | dicionario['SiglaLocal'] = SiglaLocal 583 | dicionario['NomeLocal'] = NomeLocal 584 | dicionario['url_emendas'] = url_emendas 585 | dicionario['url_movimentacoes'] = url_movimentacoes 586 | dicionario['url_relatorias'] = url_relatorias 587 | dicionario['url_texto'] = url_texto 588 | dicionario['url_votacoes_materia'] = url_votacoes_materia 589 | dicionario['url_votacoes_comissoes'] = url_votacoes_comissoes 590 | 591 | 592 | projetos_det.append(dicionario) 593 | 594 | df_propdia_det = pd.DataFrame(projetos_det) 595 | df_propdia_det = df_propdia_det[pd.notnull(df_propdia_det['EmentaMateria'])].copy() 596 | #df_propdia_det.info() 597 | 598 | 599 | # Captura link do inteiro teor 600 | prefixo = 'http://legis.senado.leg.br/dadosabertos/materia/textos/' 601 | 602 | prop_teor = [] 603 | 604 | for num, row in df_propdia_det.iterrows(): 605 | codigo = row['CodigoMateria'] 606 | 607 | url = prefixo + codigo 608 | #print(url) 609 | 610 | try: 611 | r = requests.get(url, headers=headers) 612 | except requests.exceptions.HTTPError as errh: 613 | print ("Http Error:",errh) 614 | except requests.exceptions.ConnectionError as errc: 615 | print ("Error Connecting:",errc) 616 | except requests.exceptions.Timeout as errt: 617 | print ("Timeout Error:",errt) 618 | except requests.exceptions.RequestException as err: 619 | print ("OOps: Something Else",err) 620 | 621 | projects = r.json() 622 | 623 | dicionario = { 624 | "CodigoMateria": get_by_key('TextoMateria.Materia.IdentificacaoMateria.CodigoMateria', projects)} 625 | 626 | try: 627 | CodigoTexto = str(projects['TextoMateria']['Materia']['Textos']['Texto'][0]['CodigoTexto']) 628 | except KeyError: 629 | CodigoTexto = None 630 | except TypeError: 631 | CodigoTexto = None 632 | 633 | try: 634 | UrlTexto = str(projects['TextoMateria']['Materia']['Textos']['Texto'][0]['UrlTexto']) 635 | except KeyError: 636 | UrlTexto = None 637 | except TypeError: 638 | UrlTexto = None 639 | 640 | dicionario['CodigoTexto'] = CodigoTexto 641 | dicionario['UrlTexto'] = UrlTexto 642 | 643 | prop_teor.append(dicionario) 644 | 645 | df_prop_teor = pd.DataFrame(prop_teor) 646 | #df_prop_teor.info() 647 | 648 | # Une os dois dataframes 649 | df_proposicoes = pd.merge(df_propdia_det, df_prop_teor, left_on='CodigoMateria', right_on='CodigoMateria') 650 | #df_proposicoes.info() 651 | #df_proposicoes.to_csv('resultados/senado/proposicoes_senado_detalhes_do_dia.csv',index=False) 652 | 653 | 654 | # Isola apenas proposicoes de interesse 655 | df_proposicoes['ementa_copia'] = df_proposicoes['EmentaMateria'] 656 | df_proposicoes['ementa_copia'] = df_proposicoes['ementa_copia'].str.upper() 657 | df_proposicoes['ementa_minuscula'] = df_proposicoes['EmentaMateria'] 658 | df_proposicoes['ementa_minuscula'] = df_proposicoes['EmentaMateria'].str.lower() 659 | 660 | seleciona = jornal(df_proposicoes, 'senado') 661 | #seleciona.info() 662 | 663 | return seleciona 664 | 665 | 666 | 667 | 668 | 669 | ### FUNÇÃO PARA TERMOS DE INTERESSE 670 | def jornal(dados, origem): 671 | # Define termos de interesse 672 | search_list = ["JORNALISMO", "JORNALISTA", "JORNALISTAS", "COMUNICADORES", "IMPRENSA", "VERIFICADORES DE FATOS", "CHECAGEM DE FATOS", "FAKE NEWS", "DESINFORMAÇÃO", "TRANSPARÊNCIA NA INTERNET", "RADIODIFUSÃO", "LIBERDADE DE EXPRESSÃO"] 673 | 674 | mask = dados['ementa_copia'].str.contains('|'.join(search_list)) 675 | seleciona = dados[mask] 676 | return seleciona 677 | 678 | 679 | 680 | 681 | ### CRIA FRASES 682 | def frases(dados, origem): 683 | lista_sentencas = [] 684 | #dados.info() 685 | conta = 1 686 | for num, row in dados.iterrows(): 687 | 688 | if origem == 'senado': 689 | proposicao_ementa = row['ementa_minuscula'] 690 | proposicao_tipo = row['SiglaSubtipoMateria'] 691 | proposicao_numero = row['NumeroMateria'] 692 | proposicao_ano = row['AnoMateria'] 693 | tramitacao = row['NomeLocal'] 694 | status = row['DescricaoSituacao'] 695 | endereco = row['UrlTexto'] 696 | nome = row['NomeAutor'] 697 | casa = 'SENADO' 698 | pagina = "https://www25.senado.leg.br/web/atividade/materias/-/materia/" + str(row['CodigoMateria']) 699 | elif origem == 'camara': 700 | proposicao_ementa = row['ementa_minuscula'] 701 | proposicao_tipo = row['siglaTipo'] 702 | proposicao_numero = row['numero'] 703 | proposicao_ano = row['ano'] 704 | tramitacao = row['statusProposicao_descricaoTramitacao'] 705 | status = row['statusProposicao_descricaoSituacao'] 706 | endereco = row['urlInteiroTeor'] 707 | nome = str(row['autor']).replace("[", "") 708 | nome = nome.replace("]", "") 709 | nome = nome.replace("'", "") 710 | casa = 'CÂMARA' 711 | pagina = "https://www.camara.leg.br/propostas-legislativas/" + str(row['id']) 712 | 713 | sentencas = {} 714 | 715 | if 'jornalismo' in proposicao_ementa: 716 | sentencas['texto3/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre jornalismo e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 717 | elif 'jornalista' in proposicao_ementa or 'jornalistas' in proposicao_ementa: 718 | sentencas['texto4/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre jornalistas e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 719 | elif 'comunicadores' in proposicao_ementa: 720 | sentencas['texto5/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre ccomunicadores e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 721 | elif 'imprensa' in proposicao_ementa: 722 | sentencas['texto6/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre imprensa e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 723 | elif 'desinformação' in proposicao_ementa: 724 | sentencas['texto11/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre desinformação e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 725 | elif 'notícias falsas' in proposicao_ementa or 'fake news' in proposicao_ementa: 726 | sentencas['texto7/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre fake news ou notícias falsas e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 727 | elif 'verificadores de fatos' in proposicao_ementa or 'checagem de fatos' in proposicao_ementa: 728 | sentencas['texto8/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre verificadores de fatos ou checagem de fatos e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 729 | elif 'transparência na internet' in proposicao_ementa: 730 | sentencas['texto9/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre transparência na internet e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 731 | elif 'radiodifusão' in proposicao_ementa: 732 | sentencas['texto10/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre radiodifusão e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 733 | elif 'liberdade de expressão' in proposicao_ementa: 734 | sentencas['texto12/' + str(conta)] = f'{casa}: {proposicao_tipo} {proposicao_numero}/{proposicao_ano}, de autoria de {nome}, fala sobre liberdade de expressão e sofreu alterações em sua tramitação. Tramitação: {tramitacao}. Situação: {status}. Página: {pagina}. Teor: {endereco}' 735 | 736 | 737 | #print(sentencas) 738 | # Testa se dicionario veio vazio 739 | res = not bool(sentencas) 740 | if res == False: 741 | lista_sentencas.append(sentencas) 742 | 743 | #print(lista_sentencas) 744 | conta = conta + 1 745 | 746 | #print(lista_sentencas) 747 | df_lista_sentencas = pd.DataFrame(lista_sentencas) 748 | #df_lista_sentencas.info() 749 | #df_lista_sentencas.to_csv('teste_sen2.csv',index=False) 750 | #df_lista_sentencas.info() 751 | #print(df_lista_sentencas) 752 | 753 | with open('resultados/tweets.json', 'w') as outfile: 754 | json.dump(lista_sentencas, outfile) 755 | 756 | 757 | return df_lista_sentencas 758 | 759 | 760 | 761 | 762 | 763 | ### MANDA E-MAIL 764 | def mandamail(dados): 765 | now = datetime.now() 766 | dia_hoje = now.strftime("%d") 767 | mes_hoje = now.strftime("%m") 768 | ano_hoje = now.strftime("%Y") 769 | 770 | recipients = ['reinaldo@abraji.org.br'] 771 | msg = MIMEMultipart() 772 | msg['From'] = "Robot jornalista" # sender name 773 | msg['To'] = ", ".join(recipients) # for one recipient just enter a valid email address 774 | msg['Subject'] = str(dia_hoje) + "/" + str(mes_hoje) + "/" + str(ano_hoje) + " Tramitacoes de interesse do jornalismo no Congresso" 775 | 776 | # Isola apenas primeiras linhas 777 | df = dados.bfill().iloc[[0]] 778 | columns = list(df) 779 | 780 | # Itera nas colunas de cada frase 781 | lista = [] 782 | for i in columns: 783 | texto = df[i][0] 784 | if texto != None: 785 | lista.append(texto) 786 | #print(lista) 787 | 788 | body = "Olá seres humanos!\n\nEu sou um robô que vasculha as APIs da Câmara e do Senado em busca de proposições de interesse dos jornalistas.\n\nVeja as que tiveram alguma tramitação entre hoje e anteontem (todo dia eu vasculho esse intervalo):\n\n" + '\n'.join(lista)+ "\n\nNo momento eu procuro estas palavras-chave JORNALISMO, JORNALISTA, JORNALISTAS, COMUNICADORES, IMPRENSA, VERIFICADORES DE FATOS, CHECAGEM DE FATOS, FAKE NEWS, DESINFORMAÇÃO, TRANSPARÊNCIA NA INTERNET. Posso procurar quantas quiserem.\n\nPara mais detalhes consulte meu mestre: reinaldo@abraji.org.br" 789 | 790 | msg.attach(MIMEText(body, 'plain')) 791 | server = smtplib.SMTP('smtp.gmail.com', 587) # put your relevant SMTP here 792 | 793 | server.ehlo() 794 | server.starttls() 795 | server.ehlo() 796 | server.login('email', 'senha') # use your real gmail account user name and password 797 | server.send_message(msg) 798 | server.quit() 799 | 800 | 801 | return 802 | 803 | 804 | 805 | 806 | 807 | ### DEFINIR BLOCO DE EXECUÇÃO PRINCIPAL 808 | def main(): 809 | 810 | # Captura o dia, mês e ano de ontem 811 | dia_anterior = (datetime.now() - timedelta(1)).strftime('%d') 812 | mes_anterior = (datetime.now() - timedelta(1)).strftime('%m') 813 | ano_anterior = (datetime.now() - timedelta(1)).strftime('%Y') 814 | 815 | # Captura o dia, mês e ano de hoje 816 | now = datetime.now() 817 | dia_hoje = now.strftime("%d") 818 | mes_hoje = now.strftime("%m") 819 | ano_hoje = now.strftime("%Y") 820 | 821 | #Captura proposicoes Camara 822 | prop_cam = camara(dia_anterior,mes_anterior,ano_anterior,dia_hoje,mes_hoje,ano_hoje) 823 | tamanho = len(prop_cam.index) 824 | print("Quantidade de proposicoes de interesse na Camara: ", tamanho) 825 | prop_cam.info() 826 | 827 | # Cria frases da Camara 828 | if tamanho != 0: 829 | nome = "resultados/" + dia_anterior + "_" + mes_anterior + "_" + ano_anterior + "_" + "proposicoes_camara_jornalismo" 830 | prop_cam.to_csv(f'{nome}.csv',index=False) 831 | 832 | df_lista_sentencas = frases(prop_cam, 'camara') 833 | #print(df_lista_sentencas) 834 | #a = input("-----------------") 835 | 836 | # Manda e-mail 837 | tam_frases = len(df_lista_sentencas.index) 838 | if tam_frases > 0: 839 | mandamail(df_lista_sentencas) 840 | 841 | print("/////////////////////////////////////") 842 | 843 | # Captura proposicoes Senado 844 | prop_sen = senado(ano_anterior, mes_anterior, dia_anterior) 845 | tamanho = len(prop_sen.index) 846 | print("Quantidade de proposicoes de interesse no Senado: ", tamanho) 847 | #prop_sen.info() 848 | 849 | # Cria frases do Senado 850 | if tamanho != 0: 851 | nome = "resultados/" + dia_anterior + "_" + mes_anterior + "_" + ano_anterior + "_" + "proposicoes_senado_jornalismo" 852 | prop_sen.to_csv(f'{nome}.csv',index=False) 853 | 854 | df_lista_sentencas = frases(prop_sen, 'senado') 855 | #print(df_lista_sentencas) 856 | 857 | # Manda e-mail 858 | tam_frases = len(df_lista_sentencas.index) 859 | if tam_frases > 0: 860 | mandamail(df_lista_sentencas) 861 | 862 | 863 | 864 | # executar bloco principal 865 | if __name__ == '__main__': 866 | main() 867 | 868 | 869 | -------------------------------------------------------------------------------- /rsiconfi/gastos_estaduais_SP_com_saude_2018.R: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Abraji (https://www.abraji.org.br) 3 | # Reinaldo Chaves (reinaldo@abraji.org.br) 4 | # Script exemplo de uso do rsiconfi 5 | # Baixa gastos com saúde do Estado de SP 6 | # 7 | 8 | #install.packages("devtools") 9 | #devtools::install_github("tchiluanda/rsiconfi") 10 | 11 | library(rsiconfi) 12 | library(dplyr) 13 | library(tidyr) 14 | 15 | # Códigos de UFs do Brasil 16 | # https://atendimento.tecnospeed.com.br/hc/pt-br/articles/360021494734-Tabela-de-C%C3%B3digo-de-UF-do-IBGE 17 | # São Paulo é 35 - entity 18 | 19 | # Vamos ver Despesas por Função (I-E) 20 | # A função get_account_dca retorna os códigos possíveis 21 | # Coloco o ano 2018, o I-E e um código relacionado com SP 22 | # Aqui a lista de todos: 23 | # https://siconfi.tesouro.gov.br/siconfi/pages/public/conteudo/conteudo.jsf?id=581 clique em Tabela dos códigos de instituição utilizados no Siconfi - Código das Instituições 24 | 25 | df_conta_dca <- get_account_dca(2018, "I-E", c("35") ) 26 | 27 | 28 | ## Captura gastos de SP com Saúde (11) 29 | gasto_uf_sp_2019 <- get_dca(year = 2018, 30 | annex = "I-E", 31 | entity = "35", 32 | arg_cod_conta = "10") 33 | 34 | # Os dados de 2019 ainda não estão na API 35 | 36 | 37 | # Com um vetor dos anos posso baixar tudo e comparar depois 38 | gasto_uf_sp <- get_dca(year = c(2013, 2014, 2015, 2016, 2017, 2018), 39 | annex = "I-E", 40 | entity = "35", 41 | arg_cod_conta = "10") 42 | 43 | 44 | -------------------------------------------------------------------------------- /rsiconfi/mg_rsiconfi.R: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Abraji (https://www.abraji.org.br) 3 | # Reinaldo Chaves (reinaldo@abraji.org.br) 4 | # Script exemplo de uso do rsiconfi 5 | # Baixa gastos com saúde de municípios de MG com Legislativo e Administração 6 | # 7 | 8 | #install.packages("devtools") 9 | #devtools::install_github("tchiluanda/rsiconfi") 10 | 11 | library(rsiconfi) 12 | library(dplyr) 13 | library(tidyr) 14 | 15 | 16 | # Códigos de UFs do Brasil 17 | # https://atendimento.tecnospeed.com.br/hc/pt-br/articles/360021494734-Tabela-de-C%C3%B3digo-de-UF-do-IBGE 18 | # Minas Gerais é 31 - entity 19 | 20 | # Vamos ver Despesas por Função (I-E) 21 | # A função get_account_dca retorna os códigos possíveis 22 | # Coloco o ano 2018, o I-E e um código relacionado com MG 23 | # Aqui a lista de todos: 24 | # https://siconfi.tesouro.gov.br/siconfi/pages/public/conteudo/conteudo.jsf?id=581 clique em Tabela dos códigos de instituição utilizados no Siconfi - Código das Instituições 25 | 26 | df_conta_dca <- get_account_dca(2018, "I-E", c("31") ) 27 | 28 | # Cria um vetor com códigos sobre Legislativo e Administração 29 | contas_sel <- c("01", #Despesa com legislativo, 30 | "04" #Despesa com administração do estado 31 | ) 32 | 33 | 34 | # Chama função get_dca_mun_state 35 | # Pode demorar vários minutos 36 | df_dca_mun <- get_dca_mun_state( #busca informações de anexos de contas anuais para todos os municípios de um estado indicado 37 | year = c(2018), #ano 38 | annex = "I-E", #anexo de despesa por função 39 | arg_cod_conta = contas_sel,#vetor previamente montado com as conta que serão usadas no filtro 40 | state = c(31), #estado cujos municípios serão selecionados 41 | In_QDCC=FALSE) 42 | 43 | # Neste teste gerou gerou um dataframe de 7.076 linhas e 12 colunas -------------------------------------------------------------------------------- /rsiconfi/script_indice_FIRJAN.R: -------------------------------------------------------------------------------- 1 | # Fernando A Barbalho 2 | # @barbalhofernand 3 | 4 | # install.packages("devtools") 5 | #devtools::install_github("tchiluanda/rsiconfi") 6 | 7 | library(rsiconfi) 8 | library(dplyr) 9 | library(tidyr) 10 | 11 | ###########Trabalhando as despesas 12 | 13 | #Monta um vetor com todos os códigos de UFs do Brasil 14 | #Vide https://atendimento.tecnospeed.com.br/hc/pt-br/articles/360021494734-Tabela-de-C%C3%B3digo-de-UF-do-IBGE 15 | 16 | todos_estados<-28 #para efeito de teste considera-se aqui apenas o estado de Rondônia 17 | #todos_estados<-c(11:17,21:29,31:35,41:43,50:53) #para execução completa tire o comentário dessa linha 18 | 19 | 20 | #Monta um vetor com as contas que se referem às despesas com a burocracia nos municípios 21 | #para saber as contas disponíveis use a função get_account_dca, como indicado abaixo 22 | # df_conta_dca<- get_account_dca(2018, "I-E", c("2312908") ) 23 | 24 | df_conta_dca <- get_account_dca(2018, "I-E", c("2312908") ) 25 | 26 | contas_depesas_burocaracia<- c("01", #Despesa com legislativo, 27 | "04" #Despesa com administração do estado 28 | ) 29 | 30 | 31 | 32 | 33 | #chama função que traz dados contábeis anuais de todos os municípios de um conjunto de estados 34 | #Atenção, a execução da linha abaixo pode demorar várias horas para execução. 35 | #Caso queira fazer somente um teste sugerimos substituir o vetor de estados. 36 | #Considere usar apenas o estado 11-Rondônia para testes 37 | df_desp_mun<- get_dca_mun_state(year= 2018, #ano a que se refere os dados. poderia ser um vetor de anos 38 | annex= "I-E", #Anexo de Contas Anuais que se refere a despesa por função 39 | state = todos_estados, #Informa o conjunto de UFs a que se refere os dados recuperados. nesse caso todos as UFs 40 | arg_cod_conta = contas_depesas_burocaracia#Contas associadas a despesa com burocracia 41 | ) 42 | 43 | #O vetor df_rec_mun apresenta várias linhas para o mesma chave composta de cod_ibge e conta. 44 | #Deve-se escolher a fase da despesa para não haver distorção nos dados. 45 | #Para esse caso vamos filtar as despesas liquidadas, presentes na variável coluna 46 | #Aproveitamos para usar no dataset apenas as variáveis cod_ibge, conta e valor 47 | 48 | df_desp_mun<- df_desp_mun %>% 49 | filter(coluna== "Despesas Liquidadas") %>% 50 | select(cod_ibge, conta, valor) 51 | 52 | #Transpõe a matriz de despesa para os tipos de despesa virarem coluna 53 | df_desp_mun_tidy <- df_desp_mun %>% 54 | spread(conta,valor) 55 | 56 | names(df_desp_mun_tidy)[2:3]<- c("desp_legislativa","desp_administracao") 57 | 58 | ###########Trabalhando as receitas 59 | 60 | #Monta um vetor com as contas que se referem às receitas que são consideradas no cálculo 61 | #para saber as contas disponíveis use a função get_account_dca, como indicado abaixo 62 | # df_conta_dca<- get_account_dca(2018, "I-C", c("2312908") ) 63 | 64 | contas_receita<- c("1.0.0.0.00.0.0", #Receitas Correntes , 65 | "1.7.0.0.00.0.0", #Transferências correntes, 66 | "RO1.7.2.8.01.1.0", #Cota-parte do ICMS, 67 | "RO1.7.2.8.01.2.0", #Cota-parte do IPVA, 68 | "RO1.7.1.8.01.5.0", #Cota-parte do ITR, 69 | "1.7.2.8.01.3.0 Cota-Parte do IPI"#Cota-parte do IPI 70 | ) 71 | 72 | df_rec_mun<- get_dca_mun_state(year= 2018, #ano a que se refere os dados. poderia ser um vetor de anos 73 | annex= "I-C", #Anexo de Contas Anuais que se refere a receita orçamentária 74 | state = todos_estados, #Informa o conjunto de UFs a que se refere os dados recuperados. nesse caso todas as UFs 75 | arg_cod_conta = contas_receita#Contas associadas a receitas econômicas municipais 76 | ) 77 | 78 | 79 | #para todas as receitas devem ser excluídas as deduções relativas a FUNDEB, transferências constitucionais e outras deduções da receita da receita bruta realizada. 80 | #Para tanto, deve-se trabalhar com as informações que estão na variável "coluna" 81 | 82 | 83 | df_rec_liq<- df_rec_mun %>% 84 | mutate(valor = ifelse(coluna== "Receitas Brutas Realizadas", valor, -valor)) %>% #Se não for Receita Bruta realizada, trata-se de dedução, o valor deve ser multipliado por -1 85 | group_by(cod_ibge, cod_conta) %>% 86 | summarise( 87 | valor_liquido = sum(valor) 88 | ) %>% 89 | spread(cod_conta, valor_liquido) %>% 90 | ungroup() %>% 91 | mutate(rec_econ = RO1.0.0.0.00.0.0 - RO1.7.0.0.00.0.0 + rowSums(.[4:7])) %>% 92 | select(1,2,8) 93 | 94 | 95 | names(df_rec_liq)[2:3]<-c("receitas_correntes_liq", "receita_economica_mun") 96 | 97 | 98 | ####Trabalha em conjunto as informações de receita e despesa e calcula o índice FIRJAN de autonomia 99 | 100 | 101 | 102 | df_resultado<-df_desp_mun_tidy %>% 103 | inner_join(df_rec_liq) %>% 104 | mutate(indicador = (receita_economica_mun- 105 | desp_legislativa- 106 | desp_administracao)/ 107 | receitas_correntes_liq, 108 | IFGF_autonomia = case_when( 109 | indicador > 0.25 ~ 1, 110 | indicador < 0.25 & indicador >0 ~ indicador/0.25, 111 | TRUE ~ 0)) 112 | -------------------------------------------------------------------------------- /twitter/acessa_api_twitter_final.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# -*- coding: utf-8\n", 10 | "# Abraji (https://www.abraji.org.br)\n", 11 | "# Reinaldo Chaves (reinaldo@abraji.org.br)\n", 12 | "# \n", 13 | "# Programa do curso Técnicas de raspagem de dados e acesso a APIs\n", 14 | "#\n", 15 | "# Alguns exemplos de como usar a API do Twitter para acessar tweets da rede social\n" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 4, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "import tweepy\n", 25 | "import pandas as pd\n", 26 | "import csv" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "# Digita chaves de acesso pessoais do seu Twitter - obtidas em https://developer.twitter.com" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 3, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "consumer_key = ''\n", 52 | "consumer_secret = ''\n", 53 | "access_token = ''\n", 54 | "access_token_secret = ''" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": null, 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 4, 67 | "metadata": {}, 68 | "outputs": [], 69 | "source": [ 70 | "# Autenticações na API do Twitter" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 5, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [ 79 | "auth = tweepy.OAuthHandler(consumer_key, consumer_secret)\n", 80 | "auth.set_access_token(access_token, access_token_secret)\n", 81 | "api = tweepy.API(auth)" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": null, 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 6, 94 | "metadata": {}, 95 | "outputs": [], 96 | "source": [ 97 | "# Acessa os tweets recentes de um usuário" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 7, 103 | "metadata": {}, 104 | "outputs": [], 105 | "source": [ 106 | "lista = api.user_timeline('jairbolsonaro')" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": null, 112 | "metadata": {}, 113 | "outputs": [], 114 | "source": [] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 8, 119 | "metadata": {}, 120 | "outputs": [], 121 | "source": [ 122 | "# Mostra na tela" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 9, 128 | "metadata": {}, 129 | "outputs": [ 130 | { 131 | "name": "stdout", 132 | "output_type": "stream", 133 | "text": [ 134 | "{'created_at': 'Wed May 29 20:59:10 +0000 2019', 'id': 1133840226672095234, 'id_str': '1133840226672095234', 'text': '- Recebi hoje cedo uma visita mais que especial dos alunos da escola Céu Azul, de Valparaíso de Goiás. A essas cria… https://t.co/Kfxg6Gg7WY', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/Kfxg6Gg7WY', 'expanded_url': 'https://twitter.com/i/web/status/1133840226672095234', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 314, 'favorite_count': 2176, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}\n", 135 | "{'created_at': 'Wed May 29 15:34:44 +0000 2019', 'id': 1133758579805233153, 'id_str': '1133758579805233153', 'text': 'Aprovada ontem, no Senado, a MP 870. Redução dos ministérios mantida. Saldo positivo! Demos um passo importante par… https://t.co/KELlpcsX59', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/KELlpcsX59', 'expanded_url': 'https://twitter.com/i/web/status/1133758579805233153', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4708, 'favorite_count': 35593, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 136 | "{'created_at': 'Wed May 29 01:40:36 +0000 2019', 'id': 1133548665912664068, 'id_str': '1133548665912664068', 'text': 'Divulgado o resultado da Operação Cronos II, realizada hoje em todo o Brasil, que contou com apoio do MJSP via Seop… https://t.co/kb4H8GzuWe', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/kb4H8GzuWe', 'expanded_url': 'https://twitter.com/i/web/status/1133548665912664068', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4544, 'favorite_count': 37811, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 137 | "{'created_at': 'Wed May 29 00:57:50 +0000 2019', 'id': 1133537901868965889, 'id_str': '1133537901868965889', 'text': '@CutrimCris Abraço São Luís 👍', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'CutrimCris', 'name': 'Cris', 'id': 1040646529080545280, 'id_str': '1040646529080545280', 'indices': [0, 11]}], 'urls': []}, 'source': 'Twitter for Android', 'in_reply_to_status_id': 1133536652717154305, 'in_reply_to_status_id_str': '1133536652717154305', 'in_reply_to_user_id': 1040646529080545280, 'in_reply_to_user_id_str': '1040646529080545280', 'in_reply_to_screen_name': 'CutrimCris', 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 81, 'favorite_count': 1325, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 138 | "{'created_at': 'Wed May 29 00:56:41 +0000 2019', 'id': 1133537611883130880, 'id_str': '1133537611883130880', 'text': '@MattheuusBr Um forte abraço aos fãs de Bleach! 👍', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'MattheuusBr', 'name': 'Matheus', 'id': 225072496, 'id_str': '225072496', 'indices': [0, 12]}], 'urls': []}, 'source': 'Twitter for Android', 'in_reply_to_status_id': 1133536762352087046, 'in_reply_to_status_id_str': '1133536762352087046', 'in_reply_to_user_id': 225072496, 'in_reply_to_user_id_str': '225072496', 'in_reply_to_screen_name': 'MattheuusBr', 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4702, 'favorite_count': 13305, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 139 | "{'created_at': 'Wed May 29 00:55:34 +0000 2019', 'id': 1133537329602338817, 'id_str': '1133537329602338817', 'text': '@KelvinO_BR Forte abraço!', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'KelvinO_BR', 'name': 'Kelvin🇧🇷🇺🇸🇮🇱', 'id': 1056300732134158338, 'id_str': '1056300732134158338', 'indices': [0, 11]}], 'urls': []}, 'source': 'Twitter for Android', 'in_reply_to_status_id': 1133536693162790912, 'in_reply_to_status_id_str': '1133536693162790912', 'in_reply_to_user_id': 1056300732134158338, 'in_reply_to_user_id_str': '1056300732134158338', 'in_reply_to_screen_name': 'KelvinO_BR', 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 23, 'favorite_count': 1085, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 140 | "{'created_at': 'Wed May 29 00:55:17 +0000 2019', 'id': 1133537261402939395, 'id_str': '1133537261402939395', 'text': '@feitosamaria Boa noite e muito obrigado! 👍', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'feitosamaria', 'name': 'Maria Maria', 'id': 98445476, 'id_str': '98445476', 'indices': [0, 13]}], 'urls': []}, 'source': 'Twitter for Android', 'in_reply_to_status_id': 1133536633893130240, 'in_reply_to_status_id_str': '1133536633893130240', 'in_reply_to_user_id': 98445476, 'in_reply_to_user_id_str': '98445476', 'in_reply_to_screen_name': 'feitosamaria', 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 50, 'favorite_count': 1348, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 141 | "{'created_at': 'Wed May 29 00:52:06 +0000 2019', 'id': 1133536458810306560, 'id_str': '1133536458810306560', 'text': 'Uma enorme satisfação receber essa lenda da televisão brasileira, que há décadas alegra a todos nós em seu velho e… https://t.co/ecUvedxZkG', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/ecUvedxZkG', 'expanded_url': 'https://twitter.com/i/web/status/1133536458810306560', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 8607, 'favorite_count': 58391, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}\n", 142 | "{'created_at': 'Tue May 28 19:20:40 +0000 2019', 'id': 1133453050805407744, 'id_str': '1133453050805407744', 'text': 'Com o apoio do Ministério da Justiça e Segurança Pública, o Conselho Nacional de Chefes de Polícia Civil realiza ho… https://t.co/dr0gMisjUb', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/dr0gMisjUb', 'expanded_url': 'https://twitter.com/i/web/status/1133453050805407744', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4671, 'favorite_count': 34706, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 143 | "{'created_at': 'Tue May 28 19:05:13 +0000 2019', 'id': 1133449161473429505, 'id_str': '1133449161473429505', 'text': 'RT @tarcisiogdf: Mais uma obra importante que estava parada há anos e foi retomada pelo Governo @jairbolsonaro. Um grande feito para a infr…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'tarcisiogdf', 'name': 'Tarcísio Gomes de Freitas', 'id': 1078618844007157761, 'id_str': '1078618844007157761', 'indices': [3, 15]}, {'screen_name': 'jairbolsonaro', 'name': 'Jair M. Bolsonaro', 'id': 128372940, 'id_str': '128372940', 'indices': [96, 110]}], 'urls': []}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Tue May 28 15:37:04 +0000 2019', 'id': 1133396781503537152, 'id_str': '1133396781503537152', 'text': 'Mais uma obra importante que estava parada há anos e foi retomada pelo Governo @jairbolsonaro. Um grande feito para… https://t.co/oMFn2cjhMJ', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'jairbolsonaro', 'name': 'Jair M. Bolsonaro', 'id': 128372940, 'id_str': '128372940', 'indices': [79, 93]}], 'urls': [{'url': 'https://t.co/oMFn2cjhMJ', 'expanded_url': 'https://twitter.com/i/web/status/1133396781503537152', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 1078618844007157761, 'id_str': '1078618844007157761', 'name': 'Tarcísio Gomes de Freitas', 'screen_name': 'tarcisiogdf', 'location': '', 'description': 'Engenharia (AMAN); Engenheiro Civil (IME); Companhia de Engenharia na Missão de Paz no Haiti; ex-DNIT; ex-PPI; ministro da Infraestrutura de @JairBolsonaro', 'url': None, 'entities': {'description': {'urls': []}}, 'protected': False, 'followers_count': 117151, 'friends_count': 116, 'listed_count': 304, 'created_at': 'Fri Dec 28 11:49:06 +0000 2018', 'favourites_count': 2894, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': True, 'statuses_count': 687, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'F5F8FA', 'profile_background_image_url': None, 'profile_background_image_url_https': None, 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1088840156973596674/LQF3jaIf_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1088840156973596674/LQF3jaIf_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/1078618844007157761/1556132895', 'profile_link_color': '1DA1F2', 'profile_sidebar_border_color': 'C0DEED', 'profile_sidebar_fill_color': 'DDEEF6', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': True, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': True, 'quoted_status_id': 1133384298525003777, 'quoted_status_id_str': '1133384298525003777', 'quoted_status': {'created_at': 'Tue May 28 14:47:28 +0000 2019', 'id': 1133384298525003777, 'id_str': '1133384298525003777', 'text': 'Importante para o fluxo de veículos entre Natal e o interior do Rio Grande do Norte, a BR-304/RN, trecho também con… https://t.co/4EDfjpr6BX', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/4EDfjpr6BX', 'expanded_url': 'https://twitter.com/i/web/status/1133384298525003777', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 455069103, 'id_str': '455069103', 'name': 'DNIT', 'screen_name': 'DNIToficial', 'location': 'Brasília - Brasil', 'description': 'Departamento Nacional de Infraestrutura de Transportes - DNIT 🇧🇷', 'url': 'https://t.co/bz7hKktgov', 'entities': {'url': {'urls': [{'url': 'https://t.co/bz7hKktgov', 'expanded_url': 'https://www.instagram.com/dnit.oficial', 'display_url': 'instagram.com/dnit.oficial', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 29611, 'friends_count': 215, 'listed_count': 96, 'created_at': 'Wed Jan 04 18:07:14 +0000 2012', 'favourites_count': 1441, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 2557, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '092F70', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1123638873979011074/M47NEZ9d_normal.png', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1123638873979011074/M47NEZ9d_normal.png', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/455069103/1556832053', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 879, 'favorite_count': 3936, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}, 'retweet_count': 4477, 'favorite_count': 22007, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}, 'is_quote_status': True, 'quoted_status_id': 1133384298525003777, 'quoted_status_id_str': '1133384298525003777', 'retweet_count': 4477, 'favorite_count': 0, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 144 | "{'created_at': 'Tue May 28 14:58:01 +0000 2019', 'id': 1133386950935830530, 'id_str': '1133386950935830530', 'text': '\"Não queremos ser o pai da criança, queremos destravar nossa economia e fazer nosso país prosperar.\" MAIS BRASIL, M… https://t.co/qkAgsfxgec', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/qkAgsfxgec', 'expanded_url': 'https://twitter.com/i/web/status/1133386950935830530', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 7217, 'favorite_count': 45960, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}\n", 145 | "{'created_at': 'Tue May 28 14:10:54 +0000 2019', 'id': 1133375095030910978, 'id_str': '1133375095030910978', 'text': 'RT @MinEconomia: #DESESTATIZAÇÃO | Estados receberão ajuda do governo federal para privatizar suas empresas. Dois terços das estatais brasi…', 'truncated': False, 'entities': {'hashtags': [{'text': 'DESESTATIZAÇÃO', 'indices': [17, 32]}], 'symbols': [], 'user_mentions': [{'screen_name': 'MinEconomia', 'name': 'Ministério da Economia', 'id': 216777909, 'id_str': '216777909', 'indices': [3, 15]}], 'urls': []}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Mon May 27 16:42:01 +0000 2019', 'id': 1133050738698051588, 'id_str': '1133050738698051588', 'text': '#DESESTATIZAÇÃO | Estados receberão ajuda do governo federal para privatizar suas empresas. Dois terços das estatai… https://t.co/chzukUBI8X', 'truncated': True, 'entities': {'hashtags': [{'text': 'DESESTATIZAÇÃO', 'indices': [0, 15]}], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/chzukUBI8X', 'expanded_url': 'https://twitter.com/i/web/status/1133050738698051588', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 216777909, 'id_str': '216777909', 'name': 'Ministério da Economia', 'screen_name': 'MinEconomia', 'location': 'Brasília, DF, Brasil', 'description': 'Perfil do Ministério da Economia no Twitter.', 'url': 'https://t.co/l3dyt83q8M', 'entities': {'url': {'urls': [{'url': 'https://t.co/l3dyt83q8M', 'expanded_url': 'http://www.economia.gov.br', 'display_url': 'economia.gov.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 408784, 'friends_count': 383, 'listed_count': 972, 'created_at': 'Wed Nov 17 17:58:17 +0000 2010', 'favourites_count': 5794, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': True, 'statuses_count': 14420, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '981CEB', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme14/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme14/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1130570106151591936/25_Rvd-D_normal.png', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1130570106151591936/25_Rvd-D_normal.png', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/216777909/1558383874', 'profile_link_color': '1B95E0', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'EFEFEF', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 908, 'favorite_count': 5712, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}, 'is_quote_status': False, 'retweet_count': 908, 'favorite_count': 0, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 146 | "{'created_at': 'Tue May 28 14:08:54 +0000 2019', 'id': 1133374594105139200, 'id_str': '1133374594105139200', 'text': 'RT @MinEconomia: O brasileiro está investindo mais! 😊🇧🇷📈 https://t.co/MrjwID35Mf', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'MinEconomia', 'name': 'Ministério da Economia', 'id': 216777909, 'id_str': '216777909', 'indices': [3, 15]}], 'urls': [{'url': 'https://t.co/MrjwID35Mf', 'expanded_url': 'https://twitter.com/TesouroNacional/status/1133083843865583617', 'display_url': 'twitter.com/TesouroNaciona…', 'indices': [57, 80]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Tue May 28 12:01:45 +0000 2019', 'id': 1133342591867596800, 'id_str': '1133342591867596800', 'text': 'O brasileiro está investindo mais! 😊🇧🇷📈 https://t.co/MrjwID35Mf', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/MrjwID35Mf', 'expanded_url': 'https://twitter.com/TesouroNacional/status/1133083843865583617', 'display_url': 'twitter.com/TesouroNaciona…', 'indices': [40, 63]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 216777909, 'id_str': '216777909', 'name': 'Ministério da Economia', 'screen_name': 'MinEconomia', 'location': 'Brasília, DF, Brasil', 'description': 'Perfil do Ministério da Economia no Twitter.', 'url': 'https://t.co/l3dyt83q8M', 'entities': {'url': {'urls': [{'url': 'https://t.co/l3dyt83q8M', 'expanded_url': 'http://www.economia.gov.br', 'display_url': 'economia.gov.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 408784, 'friends_count': 383, 'listed_count': 972, 'created_at': 'Wed Nov 17 17:58:17 +0000 2010', 'favourites_count': 5794, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': True, 'statuses_count': 14420, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '981CEB', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme14/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme14/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1130570106151591936/25_Rvd-D_normal.png', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1130570106151591936/25_Rvd-D_normal.png', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/216777909/1558383874', 'profile_link_color': '1B95E0', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'EFEFEF', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': True, 'quoted_status_id': 1133083843865583617, 'quoted_status_id_str': '1133083843865583617', 'quoted_status': {'created_at': 'Mon May 27 18:53:34 +0000 2019', 'id': 1133083843865583617, 'id_str': '1133083843865583617', 'text': 'Abril foi incrível para o #TesouroDireto! Superamos a marca de 1 milhão de investidores ativos e atingimos os 4 mil… https://t.co/no9rZV27eb', 'truncated': True, 'entities': {'hashtags': [{'text': 'TesouroDireto', 'indices': [26, 40]}], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/no9rZV27eb', 'expanded_url': 'https://twitter.com/i/web/status/1133083843865583617', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 268325212, 'id_str': '268325212', 'name': 'Tesouro Nacional', 'screen_name': 'TesouroNacional', 'location': 'Brasília / Brasil', 'description': 'Perfil oficial da Secretaria do Tesouro Nacional do Ministério da Economia', 'url': 'https://t.co/YrZG9c6HMa', 'entities': {'url': {'urls': [{'url': 'https://t.co/YrZG9c6HMa', 'expanded_url': 'http://tesourotransparente.gov.br', 'display_url': 'tesourotransparente.gov.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 55471, 'friends_count': 135, 'listed_count': 375, 'created_at': 'Fri Mar 18 15:01:45 +0000 2011', 'favourites_count': 284, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': True, 'statuses_count': 3709, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '123E4C', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1056898338786869249/X0jjr2zU_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1056898338786869249/X0jjr2zU_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/268325212/1550697600', 'profile_link_color': '123E4C', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'DDEEF6', 'profile_text_color': '333333', 'profile_use_background_image': False, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 123, 'favorite_count': 573, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}, 'retweet_count': 935, 'favorite_count': 6870, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}, 'is_quote_status': True, 'quoted_status_id': 1133083843865583617, 'quoted_status_id_str': '1133083843865583617', 'retweet_count': 935, 'favorite_count': 0, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}\n", 147 | "{'created_at': 'Tue May 28 01:03:42 +0000 2019', 'id': 1133176989806977024, 'id_str': '1133176989806977024', 'text': 'O Ministério da Infraestrutura lançou o Documento Eletrônico de Transporte para reduzir a burocracia, as longas fil… https://t.co/ci7rwTFtUm', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/ci7rwTFtUm', 'expanded_url': 'https://twitter.com/i/web/status/1133176989806977024', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 6658, 'favorite_count': 37257, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}\n", 148 | "{'created_at': 'Mon May 27 20:19:08 +0000 2019', 'id': 1133105376747040775, 'id_str': '1133105376747040775', 'text': 'Recebo com grande pesar a notícia do acidente aéreo ocorrido hoje em Sergipe envolvendo o jovem e talentoso cantor… https://t.co/C0sH6oEWtf', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/C0sH6oEWtf', 'expanded_url': 'https://twitter.com/i/web/status/1133105376747040775', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 6693, 'favorite_count': 80069, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 149 | "{'created_at': 'Mon May 27 16:39:01 +0000 2019', 'id': 1133049983454859266, 'id_str': '1133049983454859266', 'text': '- PRESIDENTE JAIR BOLSONARO CONCEDE ENTREVISTA EXCLUSIVA APÓS AS MANIFESTAÇÕES DE 26 DE MAIO. Confira:\\n\\nhttps://t.co/3YgxfUqOkI', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/3YgxfUqOkI', 'expanded_url': 'https://youtu.be/PtUTngk95BQ', 'display_url': 'youtu.be/PtUTngk95BQ', 'indices': [104, 127]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 2910, 'favorite_count': 21563, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'pt'}\n", 150 | "{'created_at': 'Mon May 27 16:31:31 +0000 2019', 'id': 1133048092977225728, 'id_str': '1133048092977225728', 'text': '@OnlySomeone3 Muitas felicidades! 👍 Forte abraço aos baianos!', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'OnlySomeone3', 'name': 'Only Someone', 'id': 1071983724068331520, 'id_str': '1071983724068331520', 'indices': [0, 13]}], 'urls': []}, 'source': 'Twitter for Android', 'in_reply_to_status_id': 1133041931452321792, 'in_reply_to_status_id_str': '1133041931452321792', 'in_reply_to_user_id': 1071983724068331520, 'in_reply_to_user_id_str': '1071983724068331520', 'in_reply_to_screen_name': 'OnlySomeone3', 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 207, 'favorite_count': 2704, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 151 | "{'created_at': 'Mon May 27 16:06:19 +0000 2019', 'id': 1133041754129731584, 'id_str': '1133041754129731584', 'text': 'Dentro desse contexto, somando a desinformação e a falta de apoio de diversos setores às peculiaridades já citadas… https://t.co/d1JucYTjfN', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/d1JucYTjfN', 'expanded_url': 'https://twitter.com/i/web/status/1133041754129731584', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': 1133041752758194176, 'in_reply_to_status_id_str': '1133041752758194176', 'in_reply_to_user_id': 128372940, 'in_reply_to_user_id_str': '128372940', 'in_reply_to_screen_name': 'jairbolsonaro', 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 5304, 'favorite_count': 45741, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 152 | "{'created_at': 'Mon May 27 16:06:19 +0000 2019', 'id': 1133041752758194176, 'id_str': '1133041752758194176', 'text': 'Devemos considerar que não há no país outro movimento com estrutura tão sólida e organizada quanto a esquerda, que… https://t.co/aSXmECbZCy', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/aSXmECbZCy', 'expanded_url': 'https://twitter.com/i/web/status/1133041752758194176', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': 1133041751453765632, 'in_reply_to_status_id_str': '1133041751453765632', 'in_reply_to_user_id': 128372940, 'in_reply_to_user_id_str': '128372940', 'in_reply_to_screen_name': 'jairbolsonaro', 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 5546, 'favorite_count': 46034, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n", 153 | "{'created_at': 'Mon May 27 16:06:19 +0000 2019', 'id': 1133041751453765632, 'id_str': '1133041751453765632', 'text': 'Quando imaginaríamos uma manifestação expressiva a favor de reformas consideradas impopulares? A população mostrou-… https://t.co/6oM1PlBkxk', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/6oM1PlBkxk', 'expanded_url': 'https://twitter.com/i/web/status/1133041751453765632', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter for Android', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 128372940, 'id_str': '128372940', 'name': 'Jair M. Bolsonaro', 'screen_name': 'jairbolsonaro', 'location': 'Brasília, Brasil', 'description': 'Capitão do Exército Brasileiro, eleito 38° Presidente da República Federativa do Brasil. 🇧🇷', 'url': 'https://t.co/bqpNS6l0al', 'entities': {'url': {'urls': [{'url': 'https://t.co/bqpNS6l0al', 'expanded_url': 'http://www.bolsonaro.com.br', 'display_url': 'bolsonaro.com.br', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 4368796, 'friends_count': 345, 'listed_count': 4450, 'created_at': 'Wed Mar 31 23:13:44 +0000 2010', 'favourites_count': 1943, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 6887, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '175C17', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1057631480459886595/9VPdGJJz_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/128372940/1540929521', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'A4E37F', 'profile_text_color': '1414FF', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 10187, 'favorite_count': 76059, 'favorited': False, 'retweeted': False, 'lang': 'pt'}\n" 154 | ] 155 | } 156 | ], 157 | "source": [ 158 | "for status in lista:\n", 159 | " print (status._json)" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": null, 165 | "metadata": {}, 166 | "outputs": [], 167 | "source": [] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": null, 172 | "metadata": {}, 173 | "outputs": [], 174 | "source": [ 175 | "# Estratégia para armazenar os Tweets mais recentes\n", 176 | "# Programa pode ser rodado todos os dias" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": null, 182 | "metadata": {}, 183 | "outputs": [], 184 | "source": [] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 24, 189 | "metadata": {}, 190 | "outputs": [], 191 | "source": [ 192 | "def get_all_tweets(screen_name, partido, politico, cargo):\n", 193 | " \n", 194 | " #Inicializa uma lista para conter todos os tweets possíveis\n", 195 | " alltweets = [] \n", 196 | "\n", 197 | " #Faça o pedido inicial para os tweets mais recentes (200 é a contagem máxima permitida)\n", 198 | " new_tweets = api.user_timeline(screen_name = screen_name,count=200)\n", 199 | "\n", 200 | " #salvar os tweets mais recentes\n", 201 | " alltweets.extend(new_tweets)\n", 202 | "\n", 203 | " #salvar o id do tweet mais antigo menos um\n", 204 | " oldest = alltweets[-1].id - 1\n", 205 | "\n", 206 | " # Continue segurando os tweets até que não haja mais tweets para pegar\n", 207 | " while len(new_tweets) > 0:\n", 208 | " #print \"getting tweets before %s\" % (oldest)\n", 209 | "\n", 210 | " # Todos os pedidos subsequentes usam max_id para evitar duplicatas\n", 211 | " new_tweets = api.user_timeline(screen_name = screen_name,count=200,max_id=oldest)\n", 212 | "\n", 213 | " # Salva os mais recentes tweets\n", 214 | " alltweets.extend(new_tweets)\n", 215 | "\n", 216 | " # atualizar o id do tweet mais antigo menos um\n", 217 | " oldest = alltweets[-1].id - 1\n", 218 | "\n", 219 | " #print \"...% s tweets baixados até agora\"% (len (alltweets))\n", 220 | "\n", 221 | " # Transforme os tweets tweepy em uma matriz 2D que preencherá o csv\n", 222 | " # outra opção: tweet.text.encode (\"utf-8\")\n", 223 | " # Podem ser adicionados mais campos da API do Twitter no arquivo final, não apenas esses 3 \n", 224 | " outtweets = [[screen_name, partido, politico, tweet.id_str, tweet.created_at, tweet.text, cargo] for tweet in alltweets]\n", 225 | "\n", 226 | " #Escreve o CSV\n", 227 | " with open('resultados/%s_tweets.csv' % screen_name, 'w') as f:\n", 228 | " writer = csv.writer(f)\n", 229 | " writer.writerow([\"conta_twitter\", \"partido\", \"politico\", \"id\",\"created_at\",\"text\", \"cargo\"])\n", 230 | " writer.writerows(outtweets)\n", 231 | "\n", 232 | " pass" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": null, 238 | "metadata": {}, 239 | "outputs": [], 240 | "source": [] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 25, 245 | "metadata": {}, 246 | "outputs": [ 247 | { 248 | "name": "stdout", 249 | "output_type": "stream", 250 | "text": [ 251 | "Jader Fontenelle Barbalho\n", 252 | "Sergio Olimpio Gomes\n", 253 | "Airton Luiz Faleiro\n", 254 | "Jair Messias Bolsonaro\n" 255 | ] 256 | } 257 | ], 258 | "source": [ 259 | "if __name__ == '__main__':\n", 260 | " # Neste exemplo o arquivo é lido para pegar o endereço de Twitter, pode ser um arquivo com qualquer endereço\n", 261 | " candidatos = pd.read_excel('redes_sociais_politicos_exemplo.xlsx',sheet_name='Planilha1')\n", 262 | " candidatos.reset_index().head()\n", 263 | " \n", 264 | " for num, row in candidatos.iterrows():\n", 265 | " partido = (row['Partido']).strip()\n", 266 | " politico = (row['Nome']).strip()\n", 267 | " \n", 268 | " print(politico)\n", 269 | " \n", 270 | " endereco = (row['Twitter']).strip()\n", 271 | " cargo = (row['Cargo (ultima alteração)']).strip()\n", 272 | " get_all_tweets(endereco, partido, politico, cargo)" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": null, 278 | "metadata": {}, 279 | "outputs": [], 280 | "source": [] 281 | } 282 | ], 283 | "metadata": { 284 | "kernelspec": { 285 | "display_name": "Python 3", 286 | "language": "python", 287 | "name": "python3" 288 | }, 289 | "language_info": { 290 | "codemirror_mode": { 291 | "name": "ipython", 292 | "version": 3 293 | }, 294 | "file_extension": ".py", 295 | "mimetype": "text/x-python", 296 | "name": "python", 297 | "nbconvert_exporter": "python", 298 | "pygments_lexer": "ipython3", 299 | "version": "3.6.8" 300 | } 301 | }, 302 | "nbformat": 4, 303 | "nbformat_minor": 2 304 | } 305 | -------------------------------------------------------------------------------- /twitter/pega_tweets.R: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 2 | # Sharon Machlis (@sharon000) 3 | # Tutorial para investigar tweets com rtweet e R 4 | # https://www.infoworld.com/article/3515712/how-to-search-twitter-with-rtweet-and-r.html 5 | # (Texto adaptado por Reinaldo Chaves) 6 | 7 | # Se você precisar instalar qualquer um destes, desmarque 8 | # install.packages("rtweet") 9 | # install.packages("reactable") 10 | # install.packages("glue") 11 | # install.packages("stringr") 12 | # install.packages("httpuv") 13 | # install.packages("dplyr") 14 | # install.packages("purrr") 15 | 16 | library(rtweet) 17 | library(dplyr) 18 | library(readr) 19 | 20 | ## Seta diretórios 21 | # Mostra o atual 22 | getwd() 23 | # Escolha o da sua preferência no seu computador 24 | setwd("/home/reinaldo/Documentos/Code/abraji") 25 | 26 | 27 | ## Armazenar chaves da API do Twitter (esses são valores de exemplo estão em branco; substitua por suas próprias chaves) 28 | ## ATENÇÃO: TOME CUIDADO COM SUAS CHAVES DO TWITTER, NÃO MOSTRE PARA NINGUÉM! 29 | api_key <- "" 30 | api_secret_key <- "" 31 | access_token <- "" 32 | access_token_secret <- "" 33 | 34 | ## Autenticar via web browser 35 | token <- create_token( 36 | app = "o nome do seu app", 37 | consumer_key = api_key, 38 | consumer_secret = api_secret_key, 39 | access_token = access_token, 40 | access_secret = access_token_secret) 41 | 42 | ## Checar se o token foi carregado 43 | ## Ou para carregar direto nas próximas vezes, sem precisar pegar as chaves de novo 44 | get_token() 45 | 46 | ## Exempo de uma busca básica pela hashtag #rstudioconf 47 | tweet_df <- search_tweets("#rstudioconf", n = 200, 48 | include_rts = FALSE) 49 | 50 | ## Exempo de uma busca básica pela hashtag #jornalismo 51 | tweet_df_jorn <- search_tweets("#jornalismo", n = 200, 52 | include_rts = FALSE) 53 | ## Você pode salvar em CSV para usar depois - boa prática! 54 | save_as_csv(tweet_df_jorn, "tweets_jorn_09_03_2020", prepend_ids = FALSE, na = "", 55 | fileEncoding = "UTF-8") 56 | 57 | # Seleciona apenas algumas colunas do dataframe tweet_df 58 | tweet_table_data <- select(tweet_df, -user_id, -status_id) 59 | 60 | library(reactable) 61 | 62 | # Chama o reactable para o dataframe selecionado 63 | reactable(tweet_table_data) 64 | 65 | # Customiza a visualização 66 | reactable(tweet_table_data, 67 | filterable = TRUE, searchable = TRUE, bordered = TRUE, 68 | striped = TRUE, highlight = TRUE, 69 | defaultPageSize = 25, showPageSizeOptions = TRUE, 70 | showSortable = TRUE, pageSizeOptions = c(25, 50, 75, 100, 200), defaultSortOrder = "desc", 71 | columns = list( 72 | created_at = colDef(defaultSortOrder = "asc"), 73 | screen_name = colDef(defaultSortOrder = "asc"), 74 | text = colDef(html = TRUE, minWidth = 190, resizable = TRUE), 75 | favorite_count = colDef(filterable = FALSE), 76 | retweet_count = colDef(filterable = FALSE), 77 | urls_expanded_url = colDef(html = TRUE) 78 | ) 79 | ) 80 | 81 | # Cria novo dataframe com a URL 82 | tweet_table_data <- tweet_df %>% 83 | select(user_id, status_id, created_at, screen_name, text, favorite_count, retweet_count, urls_expanded_url) %>% 84 | mutate( 85 | Tweet = glue::glue("{text} >> ") 86 | )%>% 87 | select(DateTime = created_at, User = screen_name, Tweet, Likes = favorite_count, RTs = retweet_count, URLs = urls_expanded_url) 88 | 89 | 90 | library(glue) 91 | 92 | # Criação uma função para transformar as URL em objeto clicável 93 | make_url_html <- function(url) { 94 | if(length(url) < 2) { 95 | if(!is.na(url)) { 96 | as.character(glue("{url}") ) 97 | } else { 98 | "" 99 | } 100 | } else { 101 | paste0(purrr::map_chr(url, ~ paste0("", .x, "", collapse = ", ")), collapse = ", ") 102 | } 103 | } 104 | # Aciona a função make_url_html 105 | tweet_table_data$URLs <- purrr::map_chr(tweet_table_data$URLs, make_url_html) 106 | 107 | 108 | # Refaz o reactable agora com o dataframe já alterado 109 | reactable(tweet_table_data, 110 | filterable = TRUE, searchable = TRUE, bordered = TRUE, striped = TRUE, highlight = TRUE, 111 | showSortable = TRUE, defaultSortOrder = "desc", defaultPageSize = 25, showPageSizeOptions = TRUE, pageSizeOptions = c(25, 50, 75, 100, 200), 112 | columns = list( 113 | DateTime = colDef(defaultSortOrder = "asc"), 114 | User = colDef(defaultSortOrder = "asc"), 115 | Tweet = colDef(html = TRUE, minWidth = 190, resizable = TRUE), 116 | Likes = colDef(filterable = FALSE, format = colFormat(separators = TRUE)), 117 | RTs = colDef(filterable = FALSE, format = colFormat(separators = TRUE)), 118 | URLs = colDef(html = TRUE) 119 | ) 120 | ) 121 | 122 | 123 | 124 | ### Faz o mesmo para o dataframe tweet_df_jorn 125 | tweet_table_data_jorn <- tweet_df_jorn %>% 126 | select(user_id, status_id, created_at, screen_name, text, favorite_count, retweet_count, urls_expanded_url) %>% 127 | mutate( 128 | Tweet = glue::glue("{text} >> ") 129 | )%>% 130 | select(DateTime = created_at, User = screen_name, Tweet, Likes = favorite_count, RTs = retweet_count, URLs = urls_expanded_url) 131 | 132 | tweet_table_data_jorn$URLs <- purrr::map_chr(tweet_table_data_jorn$URLs, make_url_html) 133 | 134 | reactable(tweet_table_data_jorn, 135 | filterable = TRUE, searchable = TRUE, bordered = TRUE, striped = TRUE, highlight = TRUE, 136 | showSortable = TRUE, defaultSortOrder = "desc", defaultPageSize = 25, showPageSizeOptions = TRUE, pageSizeOptions = c(25, 50, 75, 100, 200), 137 | columns = list( 138 | DateTime = colDef(defaultSortOrder = "asc"), 139 | User = colDef(defaultSortOrder = "asc"), 140 | Tweet = colDef(html = TRUE, minWidth = 190, resizable = TRUE), 141 | Likes = colDef(filterable = FALSE, format = colFormat(separators = TRUE)), 142 | RTs = colDef(filterable = FALSE, format = colFormat(separators = TRUE)), 143 | URLs = colDef(html = TRUE) 144 | ) 145 | ) 146 | -------------------------------------------------------------------------------- /twitter/redes_sociais_politicos_exemplo.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abraji/APIs/f595f40a5952555e23422847b4f726bcec42cbc5/twitter/redes_sociais_politicos_exemplo.xlsx --------------------------------------------------------------------------------