-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathalerte.py
167 lines (122 loc) · 5.31 KB
/
alerte.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
import smtplib
import urllib.request
import urllib.parse
import re
import http.cookiejar
import pickle
from email.mime.text import MIMEText
login ="nom_pre" #Tapez ici votre login de supelec
mdp ="mdpsdesupelec" #Ici le mot de passe supelec
adress ="[email protected]" #Tapez ici votre adresse supelec
# Fonction finale se sers d'un json pour récuper les utilisateurs
def alerteENT(login,mdp,adress) :
page = connexionENT(login,mdp)
page = reduction(page)
liste = compare(page)
envoyerMail(liste,login,mdp,adress)
#Fonction se connectant a l'ENT Supelec grace au login et au mot de passe et revoyant la page sous forme de string
def connexionENT(login,mdp):
urlLogin="http://portail-appliweb.supelec.fr:81/ENT/Connexion.aspx?ReturnUrl=%2fENT%2fDefault.aspx"
urlNotes="http://portail-appliweb.supelec.fr:81/Choix/Resulcourant.aspx"
viewstate="dDw3MDUzNDg1NDt0PDtsPGk8MT47PjtsPHQ8O2w8aTwxMD47aTwxMz47aTwxNT47aTwxNz47aTwxOT47aTwyMT47PjtsPHQ8cDw7cDxsPG9ua2V5KmRvd247PjtsPGphdmFzY3JpcHQ6aWYoKGV2ZW50LndoaWNoICYmIGV2ZW50LndoaWNoID09IDEzKSB8fCAoZXZlbnQua2V5Q29kZSAmJiBldmVudC5rZXlDb2RlID09MTMpKXtldmVudC5rZXlDb2RlPTlcO31lbHNlIHJldHVybiB0cnVlXDs7Pj4+Ozs+O3Q8cDw7cDxsPG9ua2V5KmRvd247PjtsPGphdmFzY3JpcHQ6aWYoKGV2ZW50LndoaWNoICYmIGV2ZW50LndoaWNoID09IDEzKSB8fCAoZXZlbnQua2V5Q29kZSAmJiBldmVudC5rZXlDb2RlID09MTMpKXtCdENvbm5leGlvbi5DbGljaygpXDt9Oz4+Pjs7Pjt0PHA8cDxsPFZpc2libGU7PjtsPG88Zj47Pj47Pjs7Pjt0PHA8cDxsPFZpc2libGU7PjtsPG88Zj47Pj47Pjs7Pjt0PHA8cDxsPFZpc2libGU7PjtsPG88Zj47Pj47Pjs7Pjt0PHA8cDxsPFZpc2libGU7PjtsPG88Zj47Pj47Pjs7Pjs+Pjs+Pjs+sNV/WrqDOPaKsy8zINqFVF5DDE8="
Bt ="Se+connecter+à+l'ENT"
#On récupère les cookies indipensable à la connexion
CookieProcessor=urllib.request.HTTPCookieProcessor()
#On construit les requètes : la première sans rien et la deuxième avec les infos
data = urllib.parse.urlencode({'__VIEWSTATE':viewstate, 'Utilisateur':login, 'MotdePasse':mdp, 'BtConnexion':Bt})
data = data.encode('utf-8')
req1 = urllib.request.Request(url=urlLogin)
req2 = urllib.request.Request(url=urlLogin,data=data)
req2.add_header("Content-Type","application/x-www-form-urlencoded;charset=utf-8")
# On construit l'opener
opener = urllib.request.build_opener(CookieProcessor)
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open(req1)
opener.open(req2)
g=opener.open(urlNotes)
#On retourne la page sous forme de texte
page = g.read().decode('utf-8')
return page
#Fonction netoyant la page de toute les balises et lignes inutiles
def reduction(page) :
page = re.sub('<[^<]+?>', '', page)
page = re.sub('( )?\t?\r?', '', page)
search = re.search("Moyenne des modules obligatoires : ",page)
page=page[0:search.start()]
search = re.search("ECTS",page)
page=page[search.end():]
return page
# Fonction recevant la page netoyée et retournant la liste des nom d'electifs alternés avec leurs notes
def notesElectif(page) :
liste =[]
for i in range(1, 5) :
pattern = re.compile("Electif([A-Za-z éêè'])+" + str(i))
search = pattern.search(page)
j = 1
while search :
end=search.end()
#liste.append(page[search.start()+7:search.end()-1]+" Seq"+page[end-1])
#liste.append(floatNote(page[end:end+6]))
liste.append(page[search.start()+7:search.end()-1]+" Seq"+page[end-1]+" : "+floatNote(page[end:end+6]))
search = pattern.search(page, search.end() )
j+=1
return liste
# Fonction recevant la page netoyée et retournant la liste des nom de modules obligatoires alternés avec leurs notes
def notesOblig(page) :
liste = []
for i in range(1, 5) :
pattern = re.compile("Oblig([A-Za-zéèê '])+(- [1-9])?" + str(i))
search = pattern.search(page)
while search :
end=search.end()
liste.append(page[search.start()+5:search.end()-1]+" Seq"+page[end-1]+" : "+floatNote(page[end:end+5]))
#liste.append(floatNote(page[end:end+5]))
search = pattern.search(page, search.end() )
return liste
#Fonction reperant si une note est de la forme 11 ou 11.50 et retourne la string adaptée
def floatNote(string) :
if len(string)>6 :
return "problème float note"
elif string[1]=="," :
return string[0]
elif string[2]=="," :
return string
else :
return string[0:2]
# Fonction comparant les liste de notes sauvegardée et en temps reel pour retourner la liste de difference
def compare(page) :
listeSite = notesElectif(page) + notesOblig(page)
liste = []
#On essaiye d'ouvrir le fichier, si il n'existe pas on le crée et on revoie toutes les notes
try:
listeSave = pickle.load(open('save.p', 'rb'))
except (IOError,EOFError):
pickle.dump(listeSite,open('save.p','wb'))
return listeSite
for i in range(0, len(listeSave)-1) :
if listeSite[i]!=listeSave[i] :
listeSave.insert(i,listeSite[i])
liste.append(listeSite[i])
for i in range(len(listeSave), len(listeSite)) :
liste.append(listeSite[i])
pickle.dump(listeSite,open('save.p','wb'))
return liste
#Fonction qui envoie un mail avec les notes
def envoyerMail(liste, login, mdp, adress) :
if len(liste) != 0 :
server = smtplib.SMTP_SSL('smtp.supelec.fr')
server.login(login, mdp)
msg = MIMEText(ecrireNotes(liste))
msg['Subject'] = "Nouvelle notes"
msg['From'] = adress
msg['To'] = adress
server.send_message(msg)
server.quit()
print("mail envoyé")
#Fonction qui écrit les notes finalement
def ecrireNotes(liste) :
str = ""
for i, elt in enumerate(liste) :
str += elt+"\n"
return str
alerteENT(login,mdp,adress)