This repository has been archived by the owner on Apr 28, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
twillmain.py
142 lines (120 loc) · 4.45 KB
/
twillmain.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
from twill.commands import *
from getpass import getpass
from datetime import datetime as dt, time, timedelta
import schedule
from functions import obtener_errores_de
avance = 0
def main():
# Ingresar usuario y contraseña
print('Creador con <3 por Dyotson (Max Militzer) y voluntarios de OSUC\n')
print("¡NO CIERRES EL PROGRAMA HASTA QUE ESTE TOME RAMOS Y TE CONFIRME!\n")
usuario = input("Usuario UC: ")
password = getpass("Contraseña UC: ")
chequeo = verificar_sesion(usuario, password)
if chequeo[0] is False:
exit()
NRC = input("NRC (Separados por un espacio, Ej: 1234 1234 1234): ")
NRC = NRC.split()
hora = input("Ingresa la hora en formato 24 hrs (Ej: 08:00 o 16:00): ")
if hora == 'debug':
tomar_ramos(NRC)
print('\n¡Toma agendada! ¡Recuerda no cerrar el programa hasta que este te confirme que tomo tus ramos!')
reservar(usuario, password, NRC, hora)
def tomar_ramos(NRC): # Esto debe ser de una corrida ya que usa Sessions
# Ya logeado, printea que va a tomar ramos y redirige el output
global avance
avance = 16
print('\nTomando ramos...')
redirect_output('output.log')
# Ingresar a Menu Principal
go("http://ssb.uc.cl/ERPUC/twbkwbis.P_GenMenu?name=bmenu.P_MainMnu")
avance = 32
# Ingresar a seleccionar periodo
go("http://ssb.uc.cl/ERPUC/bwskfreg.P_AltPin")
a = showforms()
semestre = a[1].fields['term_in']
avance = 48
# Seleccionar ultimo semestre
fv('2', 'term_in', semestre)
submit('0')
avance = 64
# Seleccionar primer plan de estudio
b = showforms()
plan = b[1].get_element_by_id('st_path_id').value_options
fv('2', 'st_path', plan[1])
submit('0')
avance = 80
# Aplicar NRC
if len(NRC) == 1:
fv('2', 'crn_id1', NRC[0])
elif len(NRC) == 2:
fv('2', 'crn_id1', NRC[0])
fv('2', 'crn_id2', NRC[1])
elif len(NRC) == 3:
fv('2', 'crn_id1', NRC[0])
fv('2', 'crn_id2', NRC[1])
fv('2', 'crn_id3', NRC[2])
submit(submit_button='Enviar Cambios')
reset_output()
avance = 100
print('\n¡Ramos tomados! Ya puedes cerrar el programa... Revisa los errores a continuacion:\n')
save_html('pruebadetoma.html')
ramos = obtener_errores_de('pruebadetoma.html')
for ramo in ramos:
print(ramo[1], '-', ramo[0])
exit()
def reservar(usuario, password, NRC, hora):
try:
if necesitaRelogin(hora):
hora_login = restar_minutos(hora, minutos=5)
schedule.every().day.at(hora_login).do(
verificar_sesion, usuario=usuario, password=password)
schedule.every().day.at(hora).do(tomar_ramos, NRC=NRC)
while True:
schedule.run_pending()
except schedule.ScheduleValueError:
print('Formato de hora invalido, recuerda ingresarlo en 24hrs')
def verificar_sesion(usuario, password) -> tuple:
# (True/False, Razón)
print('\nChequeando credenciales...')
redirect_output('output.log')
go('https://ssb.uc.cl/ERPUC/twbkwbis.P_WWWLogin')
formnum = f'{len(showforms())}'
formclear(formnum)
fv(formnum, 'sid', usuario)
fv(formnum, 'PIN', password)
submit('0')
go("http://ssb.uc.cl/ERPUC/twbkwbis.P_GenMenu?name=bmenu.P_MainMnu")
reset_output()
try:
find('Agregar o Eliminar Clases')
print('¡Credenciales aceptadas!')
return(True, '¡Credenciales aceptadas!')
except:
print('Credenciales rechazadas, porfavor intenta nuevamente')
return(False, 'Credenciales rechazadas, porfavor intenta nuevamente')
def necesitaRelogin(hora):
'''
Retorna True si "hora" ocurrirá en más de 10 minutos, False en caso contrario.
hora: Un string con la forma "%H:%M"
'''
actual = dt.now()
reserva = dt.combine(actual, time.fromisoformat(hora))
waittime = (reserva - actual).total_seconds()
minutos_espera = 10
if waittime >= minutos_espera*60 or waittime < 0:
return True
return False
def restar_minutos(hora, minutos):
'''
Resta a "hora" la cantidad de minutos ingresada en "minutos".
hora: Un string con la forma "%H:%M"
miutos: Un entero que representa la cantidad de minutos a restar
'''
hora_original = dt.combine(dt.now(), time.fromisoformat(hora))
hora_con_resta = hora_original - timedelta(minutes=minutos)
return hora_con_resta.strftime("%H:%M")
def cancelar_schedule():
schedule.clear()
if __name__ == '__main__':
main()