-
Notifications
You must be signed in to change notification settings - Fork 1
/
extrae.py
179 lines (158 loc) · 6.03 KB
/
extrae.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# -*- coding: iso-8859-15 -*-
# Aca se definen las funciones necesarias para descargar y filtrar
# la data
import threading
from filtro import Filtro
import json
import time
import requests as req
# Intenta importar requesocks
try:
import requesocks as req_socks
except ImportError as err:
_tor_available = False
_tor_error = err
else:
_tor_available = True
_tor_proxies = {'http': 'socks5://127.0.0.1:9050',
'https': 'socks5://127.0.0.1:9050'}
lock_print = threading.Lock()
_base_url = "http://aplicaciones013.jne.gob.pe/pecaoe/servicios/"
_dic_urls = {
"principal": (_base_url + "declaracion.asmx/" +
"CandidatoListarPorID"),
"familia": (_base_url + "declaracion.asmx/" +
"CandidatoFamiliaListarPorCandidato"),
"otraExperiencia": (_base_url + "declaracion.asmx/" +
"CandidatoAdicionalListarPorCandidato"),
"observaciones": (_base_url + "simulador.asmx/" +
"Soporte_CandidatoAnotMarginal"),
"ingresos": (_base_url + "declaracion.asmx/" +
"IngresoListarPorCandidato"),
"experiencia": (_base_url + "declaracion.asmx/" +
"CandidatoExperienciaListarPorCandidato"),
"educacionSuperior": (_base_url + "declaracion.asmx/" +
"EducacionSuperiorListarPorCandidato"),
"educacionBasica": (_base_url + "declaracion.asmx/" +
"EducacionBasicaListarPorCandidato"),
"militancia": (_base_url + "declaracion.asmx/" +
"RenunciasOPListarPorCandidato"),
"eleccion": (_base_url + "declaracion.asmx/" +
"CargoEleccionListarPorCandidato"),
"partidario": (_base_url + "declaracion.asmx/" +
"CargoPartidarioListarPorCandidato"),
"bienes": (_base_url + "declaracion.asmx/" +
"BienesListarPorCandidato"),
"penal": (_base_url + "declaracion.asmx/" +
"AmbitoPenalListarPorCandidato"),
"civil": (_base_url + "declaracion.asmx/" +
"AmbitoCivilListarPorCandidato"),
"acreencias": (_base_url + "declaracion.asmx/" +
"EgresosListarPorCandidato"),
}
_headers = {"Content-Type": "application/json; charset=UTF-8",
"Accept": "application/json",
# User-Agent falso, solo por si las dudas
"User-Agent": ("Mozilla/5.0 (Windows NT 6.1; WOW64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/" +
"36.0.1985.67 Safari/537.36")}
def imprime(cad):
with lock_print:
print cad
def genera_mensaje(id_Candidato):
return {
"objCandidatoBE":
{"objProcesoElectoralBE": {"intIdProceso": "72"},
"objOpInscritasBE": {"intCod_OP": "140"},
"intEstado": 1,
"intId_Candidato": str(id_Candidato)}
}
def realiza_peticion(key, id_candidato, tor=False, timeout=2):
"""Realiza una peticion a una de las apis. Devuelve la
respuesta (json) como un diccionario"""
payload = genera_mensaje(id_candidato)
url = _dic_urls[key]
kargs = {
"data": json.dumps(payload),
"headers": _headers,
"timeout": timeout}
while True:
try:
if tor is True:
tor_req = req_socks.session()
tor_req.proxies = _tor_proxies
r = tor_req.post(url, **kargs)
else:
r = req.post(url, **kargs)
except req.exceptions.Timeout:
imprime("Timeout error")
continue
except req.exceptions.ConnectionError as error:
errno = error.errno
err_msg = "ConnectionError"
if errno == 101:
err_msg += (": Esta conectado a internet?")
imprime(err_msg)
time.sleep(0.5)
continue
except Exception as e:
imprime("Excepcion: " + str(e))
time.sleep(0.5)
continue
else:
if r.text.find("Attack Detected") != -1:
imprime(r.text)
imprime("Ataque detectado!! A dormir")
time.sleep(60)
continue
if hasattr(r, 'json'):
return r.json()
else:
return json.loads(r.content)
def filtra_data(key, raw_data):
"""Filtra uno de los diccionarios devueltos por las apis"""
data = getattr(Filtro, "f_" + key)(raw_data)
return data
def descarga_candidato(id_cand, filtrar=True, tor=False):
"""Descarga los datos de un candidato.
"filtrar" indica si se devuelve un diccionario con la data
filtrada o sin filtrar
si es un id invalido, devuelve un diccionario con solo los
campos de "_id" y "ok" """
dic_candidato = {"_id": id_cand}
raw_principal = realiza_peticion("principal", id_cand, tor)
data_principal = filtra_data("principal", raw_principal)
# Verifica si el id es valido
if not data_principal:
dic_candidato["ok"] = False
return dic_candidato
else:
dic_candidato["ok"] = True
# Verifica si se pudo importar requesocks. En caso contrario,
# manda una excepcion
if tor and (not _tor_available):
raise _tor_error
if filtrar:
dic_candidato.update(data_principal)
for key in _dic_urls.keys():
if key == "principal":
continue
raw_data = realiza_peticion(key, id_cand, tor)
dic_candidato[key] = filtra_data(key, raw_data)
else:
dic_candidato["principal"] = raw_principal
for key in _dic_urls.keys():
if key == "principal":
continue
dic_candidato[key] = realiza_peticion(key, id_cand, tor)
return dic_candidato
def descarga_campo(id_cand, key, filtrar=True, tor=False):
"""Descarga un campo de un candidato"""
dic_candidato = {"_id": id_cand}
raw_data = realiza_peticion(key, id_cand, tor)
if filtrar:
dic_data = filtra_data(key, raw_data)
dic_candidato[key] = dic_data
else:
dic_candidato[key] = raw_data
return dic_candidato