-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrun.py
134 lines (107 loc) · 4.42 KB
/
run.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
import os, stat
import json
import click
from scrapy.crawler import CrawlerProcess
from scraper.spiders.historico import HistoricoSpider
from scraper.spiders.horario import HorarioSpider
from util.credits import print_credits
DATA = os.path.expanduser('~') + '/Downloads'
CREDENTIALS = os.path.expanduser('~') + '/controleAcademico'
class User(object):
def __init__(self):
self.matricula = None
self.senha = None
PASS_USER = click.make_pass_decorator(User, ensure=True)
@PASS_USER
def authentication(user):
"""Recebe os dados de autenticação do usuário"""
try:
file_path = CREDENTIALS + '/user.json'
file = open(file_path, "r")
student = json.loads(file.read())
user.matricula = student["matricula"]
user.senha = student["senha"]
except:
user.matricula = click.prompt('\nInsira sua matricula', type=str)
user.senha = click.prompt('Insira sua senha', hide_input=True, type=str)
def setup_process():
"""Retorna o processo que executará o Spider"""
[file_name, file_extension] = file_config()
process = CrawlerProcess(settings={
'FEED_FORMAT': file_extension,
'FEED_URI': file_name,
'FEED_EXPORT_ENCODING':'utf-8',
'LOG_ENABLED': False
})
print('\nOs dados serão baixados para a pasta {}/data'.format(DATA))
return process
def file_config():
"""Recebe os dados referentes ao arquivo destino dos dados"""
file_name = click.prompt('\nQual será nome do arquivo?', default="dados")
file_extension = click.prompt('Qual será o formato do arquivo?', default="json")
file = '{}.{}'.format(file_name, file_extension)
file_path = '{}/data/{}'.format(DATA, file)
return [file_path, file_extension]
@click.group()
def cli():
"""CLI para obter dados do controle acadêmico"""
pass
@cli.command('historico', short_help="Retorna dados das disciplinas do historico acadêmico.")
@PASS_USER
def get_subjects(user):
""" Retorna os dados das disciplinas do aluno disponiveis no controle acadêmico. """
authentication()
process = setup_process()
process.crawl(HistoricoSpider, matricula=user.matricula, senha=user.senha)
process.start()
@cli.command('horario', short_help="Retorna os horários das disciplinas.")
@PASS_USER
def get_schedule(user):
"""Retorna as disciplinas que estão sendo cursadas e seus respectivos horários."""
authentication()
periodo = click.prompt('\nPeríodo', default="2019.1", type=str)
ano = periodo.split('.')[0]
semestre = periodo.split('.')[1]
process = setup_process()
process.crawl(HorarioSpider, matricula=user.matricula, senha=user.senha, ano=ano, semestre=semestre)
process.start()
@cli.command('colacao', short_help="Retorna a situação atual dos creditos para colação de grau")
@PASS_USER
def get_degree_collation(user):
"""Retorna uma visualização da situação do aluno em relação
a quantidade de créditos pagos e faltantes para colação de grau.
A quantidade de créditos no curso de CC são:\n
Obrigatórias: 132 créditos\n
Optativas específicas: 40 créditos\n
Optativas gerais: 16 créditos\n
PTCC + TCC: 8 créditos"""
authentication()
process = CrawlerProcess({'LOG_ENABLED':False})
process.crawl(HistoricoSpider, matricula=user.matricula, senha=user.senha)
process.start()
print_credits(HistoricoSpider.items)
def get_credentials_file():
"""Retorna o objeto file referente as credenciais do aluno"""
file_path = CREDENTIALS + '/user.json'
try:
open(file_path, "w+")
except:
os.mkdir(CREDENTIALS)
os.mkdir(DATA + '/data')
file = open(file_path, "w+")
os.chmod(file_path, stat.S_IRWXU)
return file
@cli.command('credenciais', short_help="Armazena as credenciais do aluno")
def store_user():
"""Guarda as credenciais do aluno para futuras requisições
"""
credentials_path = CREDENTIALS + '/user.json'
if click.confirm('\nAs credenciais serão salvas localmente em {} e estarão visiveis a todos que a utilizam, você realmente deseja salvar?\n'.format(credentials_path)):
file = get_credentials_file()
user = click.prompt('\nInsira sua matricula', type=str)
senha = click.prompt('Insira sua senha', hide_input=True, type=str)
file.write(json.dumps({"matricula": user, "senha": senha}))
file.close()
print('\nCredenciais salvas!\n')
if __name__ == '__main__':
cli()