2021-05-24 22:22:03 +02:00
|
|
|
from sys import argv
|
2022-01-13 23:07:30 +01:00
|
|
|
from requests_html import BaseSession, HTMLResponse
|
|
|
|
from bs4 import BeautifulSoup # Peut-être retiré par les fonctions de requests_html ?
|
2021-05-24 22:22:03 +02:00
|
|
|
|
|
|
|
class Universite:
|
2022-01-13 23:07:30 +01:00
|
|
|
def __init__(self, url: str, pseudo: str, motDePasse: str):
|
2021-05-24 22:22:03 +02:00
|
|
|
self.url = url
|
|
|
|
self.loginData = {
|
|
|
|
"username": pseudo,
|
|
|
|
"password": motDePasse,
|
|
|
|
"_eventId": "submit",
|
|
|
|
"submit": "SE CONNECTER"
|
|
|
|
}
|
2022-01-13 21:23:22 +01:00
|
|
|
|
2022-01-13 23:07:30 +01:00
|
|
|
def maSoupe(self, page: HTMLResponse):
|
|
|
|
"""Macro pour utiliser le parser HTML de bs4."""
|
2021-05-24 22:22:03 +02:00
|
|
|
return BeautifulSoup(page.content, "html.parser")
|
|
|
|
|
2022-01-13 23:07:30 +01:00
|
|
|
def ecrirePageHTML(self, texte: str):
|
2022-01-13 22:52:32 +01:00
|
|
|
"""Affiche la page HTML pour le debug."""
|
2022-01-13 22:53:43 +01:00
|
|
|
with open("page.html", 'w') as f:
|
2022-01-13 22:52:32 +01:00
|
|
|
f.write(texte)
|
2021-05-25 00:25:59 +02:00
|
|
|
|
2022-01-13 23:07:30 +01:00
|
|
|
def recuperationNotes(self) -> str:
|
2022-01-13 22:52:32 +01:00
|
|
|
"""Récupère les notes."""
|
2022-01-13 23:07:30 +01:00
|
|
|
with BaseSession() as session:
|
2021-05-24 22:22:03 +02:00
|
|
|
# login
|
|
|
|
reponse = session.get(self.url)
|
2021-05-25 00:25:59 +02:00
|
|
|
soup = self.maSoupe(reponse)
|
2021-05-24 22:22:03 +02:00
|
|
|
self.loginData["lt"] = soup.find("input", attrs = {"name": "lt"})["value"]
|
|
|
|
self.loginData["execution"] = soup.find("input", attrs = {"name": "execution"})["value"]
|
|
|
|
reponse = session.post(self.url, data = self.loginData)
|
|
|
|
|
|
|
|
# page des résultats intermédiaire
|
2021-05-25 00:25:59 +02:00
|
|
|
soup = self.maSoupe(reponse)
|
|
|
|
try:
|
|
|
|
url = soup.find("a", attrs = {"id": "service-407"})["href"]
|
|
|
|
except:
|
|
|
|
raise TimeoutError("Le site a prit trop de temps pour répondre, veuillez réessayez plus tard.")
|
2021-05-24 22:22:03 +02:00
|
|
|
reponse = session.get(url, allow_redirects = False)
|
|
|
|
url = reponse.headers["Location"]
|
|
|
|
reponse = session.get(url)
|
|
|
|
|
2022-01-13 22:52:32 +01:00
|
|
|
# choix des années
|
2021-05-25 00:25:59 +02:00
|
|
|
soup = self.maSoupe(reponse)
|
2022-01-13 22:52:32 +01:00
|
|
|
url = f"{url}?{soup.find('form', attrs = {'enctype': 'application/x-www-form-urlencoded'})['action'].split('?')[1].replace('welcome', 'notes')}"
|
2021-05-24 22:22:03 +02:00
|
|
|
reponse = session.get(url)
|
2022-01-13 22:52:32 +01:00
|
|
|
self.ecrirePageHTML(reponse.text)
|
|
|
|
|
|
|
|
# page des notes
|
|
|
|
# TODO
|
2021-05-24 22:22:03 +02:00
|
|
|
|
2021-05-25 00:25:59 +02:00
|
|
|
# récupération tableaux des notes
|
|
|
|
soup = self.maSoupe(reponse)
|
|
|
|
for attrs in soup.findAll("table"):
|
|
|
|
try:
|
|
|
|
texte = str(attrs).split("thead")[1][2:-2]
|
2022-01-13 22:53:43 +01:00
|
|
|
while " " in texte:
|
|
|
|
texte = texte.replace(" ", ' ')
|
2021-05-25 00:25:59 +02:00
|
|
|
return texte
|
|
|
|
except:
|
|
|
|
pass
|
2021-05-24 22:22:03 +02:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
argv = argv[1:]
|
|
|
|
if len(argv) == 3:
|
|
|
|
print(Universite(*argv).recuperationNotes())
|
|
|
|
else:
|
|
|
|
print("Merci de renseigner l'URL, le pseudo et le mot de passe (avec des \").")
|