-
Notifications
You must be signed in to change notification settings - Fork 6
/
nombrerutfirma_util.py
218 lines (166 loc) · 6.99 KB
/
nombrerutfirma_util.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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# -*- coding: utf-8 -*-
import sqlite3
import requests
import pandas as pd
import distutils.spawn
from lxml import html
from datetime import datetime
import subprocess
from requests_tor import RequestsTor
from requests.exceptions import ConnectionError
from time import sleep
def invokeTor():
# checking whether tor exists in system path
cmd = distutils.spawn.find_executable('tor')
if cmd == None:
print('Tal parece que Tor no existe en tu sistema. Prueba iniciandolo manualmente e intenta otra vez.')
return None
else:
popen = subprocess.Popen(cmd,stdout=subprocess.DEVNULL)
tor_pid = popen.pid
return tor_pid
def chkTor(intentos):
try:
rt = RequestsTor(tor_ports=(9050,), tor_cport=9051)
ip = rt.get('https://icanhazip.com').text
print('Tor conectado después de {intentos} intentos. IPv4 asignada: {ip}.'.format(intentos=intentos, ip=ip))
return rt
except ConnectionError:
print('Tor aún no está listo, esperando 1 segundo ...')
sleep(1)
return False
def calculaDV(rut):
# Función calculaDV tomada de https://github.com/jdeloshoyos/genrut/blob/master/genrut.py
# (c) Junio 2013 por Jaime de los Hoyos M. Liberado bajo la licencia MIT: http://www.opensource.org/licenses/mit-license.php
rut_str = str(rut)[::-1] # Invierte string
# Variables para el cálculo
multiplicador = 2
suma = 0
for c in rut_str:
# Iteramos sobre todos los caracteres del RUT ya, invertido, sumando los dígitos * el multiplicador
suma += int(c) * multiplicador
multiplicador += 1
if multiplicador > 7:
multiplicador = 2
dv = str(11 - (suma % 11)) # 11 - Módulo
# Excepciones
if dv == '11':
dv = '0'
if dv == '10':
dv = 'K'
return dv
def generaRut(numero):
return str(numero) + '-' + calculaDV(numero)
def buscarRut(respuesta):
nombre = ''
rutSalida = ''
secssso = '' # en la playa hay de too
direccion = ''
comuna = ''
for cuenta, celda in enumerate(respuesta):
# print(cuenta, celda.text_content())
if cuenta == 0:
nombre = celda.text_content().replace("'","")
elif cuenta == 1:
rutSalida = celda.text_content().replace("'","")
elif cuenta == 2:
secssso = celda.text_content().replace("'","")
elif cuenta == 3:
direccion = celda.text_content().replace("'","").replace("-f", "")
elif cuenta == 4:
comuna = celda.text_content().replace("'","")
return nombre, rutSalida, secssso, direccion, comuna
def getStuff(rut, debug, tor_status, tor_renewflag):
# esta función genera la petición http al sitio y evaluará su estado, si efectívamente se puede usar, si tuvo un error o si fue baneada.
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36", # User Agent de Chrome en Windows. Windows es el SO con mayor cuota, no debiera ser necesario rotar el UA.
"referer": "https://nombrerutyfirma.com/"
}
url = "https://nombrerutyfirma.com/rut?term=" + str(rut)
xpath_columnas = "/html/body/div[2]/div/table/tbody/tr[1]/td" # Forzada a la primera fila de la tabla!
xpath_titulo = '/html/head/title'
if tor_status == True:
rt = RequestsTor(tor_ports=(9050,), tor_cport=9051)
if tor_renewflag == True:
rt.new_id()
response = rt.get(url, headers=headers)
else:
response = requests.get(url, headers=headers) # respuesta de html raw
parser = html.fromstring(response.text) # parseada
titulo = parser.xpath(xpath_titulo)[0].text
if debug == True:
print("Acá la respuesta en html:")
print("")
print(response.text)
print("")
print(titulo)
if 'Access denied' in titulo or 'Attention Required!':
print('Baneado papu! :(, abortando los procesos ...')
return 'banhammer'
celdas = parser.xpath(xpath_columnas)
if len(celdas) == 0:
print("No se encontró RUT {rut} en NombreRutYFirma.com, saltando...".format(rut=rut))
return 'not-found'
else:
return celdas # celdas ya validadas
def crearTabla(con):
cursorObj = con.cursor()
cursorObj.execute("create table \
ruts(rut varchar, \
nombre varchar, \
sexo varchar, \
direccion varchar, \
comuna varchar) \
")
con.commit()
def chkTable(con):
cursorObj = con.cursor()
cursorObj.execute("\
SELECT count(name) \
FROM sqlite_master \
WHERE type='table' \
and name='ruts'")
if cursorObj.fetchone()[0] == 1:
return True
else:
return False
con = sqlite3.connect('ruts.db')
if chkTable(con) == False:
crearTabla(con)
def insertRUT(con, nombre, rut, sexo, direccion, comuna):
if nombre != '':
cursor = con.cursor()
cursor.execute("insert into ruts \
values('{rut}', '{nombre}', \
'{sexo}', '{direccion}', \
'{comuna}')".format(rut=rut, nombre=nombre, sexo=sexo,
direccion=direccion, comuna=comuna))
con.commit()
print("Rut {} insertado en BD...".format(rut))
def cleanse(rut_raw):
if '-' in rut_raw:
rut_raw = rut_raw[0:rut_raw.find('-')]
rut_raw = str(rut_raw).upper().replace(".", "").replace("-", "").replace("K", "")
return "{:_}".format(int(rut_raw)).replace("_", ".") + '-' + calculaDV(rut_raw)
def connectDB(path):
return sqlite3.connect('ruts.db')
def leerListaRUT(path, delim):
if 'xls' in path.suffix:
return pd.read_excel(path, sheet_name=0,header=None)[0]
elif 'csv' in path.suffix:
return pd.read_csv(path, sep=delim, header=None)[0]
def exportToCSV(con, path):
ruts = pd.read_sql_query("select * from ruts", con)
archivo_str = "rutsprocesados_{horafecha}.csv".format(horafecha=str(datetime.now())[0:19])
destino = pathlib.Path(path) / archivo_str
ruts.to_csv(destino,index=False,sep=';')
print('Archivo guardado, con nombre: {nombre}'.format(nombre=archivo_str))
def exportPending(lista_rut, path):
archivo_str = "rutspendientes_{horafecha}.csv".format(horafecha=str(datetime.now())[0:19])
destino = pathlib.Path(path) / archivo_str
pd.Series(lista_rut).to_csv(destino, index=False, sep=';', header=False)
print('Archivo guardado con los ruts pendientes, nombre: {nombre}'.format(nombre=archivo_str))
def guardaRutGenerados(lista_rut_gen, path):
archivo_str = "rutgen_{horafecha}.csv".format(horafecha=str(datetime.now())[0:19])
destino = pathlib.Path(path) / archivo_str
pd.Series(lista_rut_gen).to_csv(destino, index=False, sep=';', header=False)