├── 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 | " index | \n",
181 | " codigo | \n",
182 | " descricao | \n",
183 | "
\n",
184 | " \n",
185 | " \n",
186 | " \n",
187 | " 0 | \n",
188 | " 0 | \n",
189 | " 01000 | \n",
190 | " Câmara dos Deputados - Unidades com vínculo di... | \n",
191 | "
\n",
192 | " \n",
193 | " 1 | \n",
194 | " 1 | \n",
195 | " 01901 | \n",
196 | " Fundo Rotativo da Câmara dos Deputados | \n",
197 | "
\n",
198 | " \n",
199 | " 2 | \n",
200 | " 2 | \n",
201 | " 02000 | \n",
202 | " Senado Federal - Unidades com vínculo direto | \n",
203 | "
\n",
204 | " \n",
205 | " 3 | \n",
206 | " 3 | \n",
207 | " 02001 | \n",
208 | " Fundo Especial do Senado Federal | \n",
209 | "
\n",
210 | " \n",
211 | " 4 | \n",
212 | " 4 | \n",
213 | " 02002 | \n",
214 | " Senado Federal/ FUNSEEP | \n",
215 | "
\n",
216 | " \n",
217 | "
\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 | " codigo | \n",
315 | " descricao | \n",
316 | "
\n",
317 | " \n",
318 | " \n",
319 | " \n",
320 | " 10 | \n",
321 | " 24000 | \n",
322 | " Ministério da Ciência, Tecnologia, Inovações e... | \n",
323 | "
\n",
324 | " \n",
325 | " 12 | \n",
326 | " 26284 | \n",
327 | " Fundação Universidade Federal de Ciências da S... | \n",
328 | "
\n",
329 | " \n",
330 | " 3 | \n",
331 | " 26356 | \n",
332 | " Instituto Federal de Educação, Ciência e Tecno... | \n",
333 | "
\n",
334 | " \n",
335 | " 5 | \n",
336 | " 26402 | \n",
337 | " Instituto Federal de Educação, Ciência e Tecno... | \n",
338 | "
\n",
339 | " \n",
340 | " 6 | \n",
341 | " 26403 | \n",
342 | " Instituto Federal de Educação, Ciência e Tecno... | \n",
343 | "
\n",
344 | " \n",
345 | "
\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 | " index | \n",
536 | " codigo | \n",
537 | " descricao | \n",
538 | "
\n",
539 | " \n",
540 | " \n",
541 | " \n",
542 | " 0 | \n",
543 | " 0 | \n",
544 | " 00001 | \n",
545 | " IGNORADO - CONVERSAO DO SIPEFAZ | \n",
546 | "
\n",
547 | " \n",
548 | " 1 | \n",
549 | " 1 | \n",
550 | " 00005 | \n",
551 | " Exc - Empresa Privada | \n",
552 | "
\n",
553 | " \n",
554 | " 2 | \n",
555 | " 2 | \n",
556 | " 00006 | \n",
557 | " Exc - Empresas Públicas / CLT | \n",
558 | "
\n",
559 | " \n",
560 | " 3 | \n",
561 | " 3 | \n",
562 | " 00008 | \n",
563 | " Exc - Entidades em Extinção / L.80 | \n",
564 | "
\n",
565 | " \n",
566 | " 4 | \n",
567 | " 4 | \n",
568 | " 00009 | \n",
569 | " Exc - Estados / Municípios / Outros | \n",
570 | "
\n",
571 | " \n",
572 | "
\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
--------------------------------------------------------------------------------