use requirements.txt for venv
This commit is contained in:
parent
34b6b0cde1
commit
9e7226db24
4 changed files with 29 additions and 18 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -3,3 +3,7 @@
|
||||||
.env
|
.env
|
||||||
|
|
||||||
*.html
|
*.html
|
||||||
|
|
||||||
|
bin/
|
||||||
|
lib/
|
||||||
|
pyvenv.cfg
|
||||||
|
|
|
@ -1,12 +1,7 @@
|
||||||
# Wrapper de notes pour [uPortal](https://github.com/uPortal-Project/uPortal-start)
|
# Wrapper de notes pour [uPortal](https://github.com/uPortal-Project/uPortal-start)
|
||||||
|
|
||||||
## Pré-requis
|
|
||||||
```
|
|
||||||
requests-html==0.10.0
|
|
||||||
python-dotenv==0.19.2
|
|
||||||
```
|
|
||||||
|
|
||||||
## Utilisation
|
## Utilisation
|
||||||
|
|
||||||
```
|
```
|
||||||
python3 main.py "<lien-vers-l'instance-CAS-pour-la-connexion-à-uPortal>" "<pseudo>" "<mot-de-passe>"
|
python3 main.py "<lien-vers-l'instance-CAS-pour-la-connexion-à-uPortal>" "<pseudo>" "<mot-de-passe>"
|
||||||
|
|
||||||
|
@ -16,4 +11,5 @@ python3 main.py "<lien-vers-l'instance-CAS-pour-la-connexion-à-uPortal>" "<pseu
|
||||||
Vous pouvez aussi utilisez un fichier `.env` (recommandé) avec : `URL`, `LOGIN` et `PASSWORD` comme nom de variables.
|
Vous pouvez aussi utilisez un fichier `.env` (recommandé) avec : `URL`, `LOGIN` et `PASSWORD` comme nom de variables.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Testé avec l'[instance de Paris 8](https://e-p8.univ-paris8.fr).
|
Testé avec l'[instance de Paris 8](https://e-p8.univ-paris8.fr).
|
||||||
|
|
31
main.py
31
main.py
|
@ -1,10 +1,10 @@
|
||||||
from difflib import restore
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from os import environ
|
from os import environ
|
||||||
from sys import argv
|
from sys import argv
|
||||||
|
|
||||||
from requests_html import HTMLSession
|
from requests_html import HTMLSession
|
||||||
|
|
||||||
|
|
||||||
class Universite:
|
class Universite:
|
||||||
def __init__(self, url: str, pseudo: str, motDePasse: str):
|
def __init__(self, url: str, pseudo: str, motDePasse: str):
|
||||||
self.url = url
|
self.url = url
|
||||||
|
@ -26,23 +26,28 @@ class Universite:
|
||||||
reponse = session.get(self.url)
|
reponse = session.get(self.url)
|
||||||
|
|
||||||
# login
|
# login
|
||||||
self.loginData["lt"] = [element.attrs["value"] for element in reponse.html.find("input") if element.attrs["name"] == "lt"][0]
|
self.loginData["lt"] = [element.attrs["value"] for element in reponse.html.find(
|
||||||
self.loginData["execution"] = [element.attrs["value"] for element in reponse.html.find("input") if element.attrs["name"] == "execution"][0]
|
"input") if element.attrs["name"] == "lt"][0]
|
||||||
reponse = session.post(self.url, data = self.loginData)
|
self.loginData["execution"] = [element.attrs["value"] for element in reponse.html.find(
|
||||||
|
"input") if element.attrs["name"] == "execution"][0]
|
||||||
|
reponse = session.post(self.url, data=self.loginData)
|
||||||
|
|
||||||
# page des résultats intermédiaire
|
# page des résultats intermédiaire
|
||||||
try:
|
try:
|
||||||
url = [element.attrs["href"] for element in reponse.html.find('a') if "id" in element.attrs if element.attrs["id"] == "service-407"][0]
|
url = [element.attrs["href"] for element in reponse.html.find(
|
||||||
|
'a') if "id" in element.attrs if element.attrs["id"] == "service-407"][0]
|
||||||
except IndexError: # Arrive quand "An Error Has Occurred"
|
except IndexError: # Arrive quand "An Error Has Occurred"
|
||||||
raise TimeoutError("Le site a prit trop de temps pour répondre, veuillez réessayez plus tard.")
|
raise TimeoutError(
|
||||||
reponse = session.get(url, allow_redirects = False)
|
"Le site a prit trop de temps pour répondre, veuillez réessayez plus tard.")
|
||||||
|
reponse = session.get(url, allow_redirects=False)
|
||||||
url = reponse.headers["Location"]
|
url = reponse.headers["Location"]
|
||||||
reponse = session.get(url)
|
reponse = session.get(url)
|
||||||
|
|
||||||
# choix des années
|
# choix des années
|
||||||
url = f"{url}?{[element.attrs['action'] for element in reponse.html.find('form') if 'enctype' in element.attrs if element.attrs['enctype'] == 'application/x-www-form-urlencoded'][0].split('?')[1].replace('welcome', 'notes')}"
|
url = f"{url}?{[element.attrs['action'] for element in reponse.html.find('form') if 'enctype' in element.attrs if element.attrs['enctype'] == 'application/x-www-form-urlencoded'][0].split('?')[1].replace('welcome', 'notes')}"
|
||||||
reponse = session.get(url)
|
reponse = session.get(url)
|
||||||
anneesTemp = [element for element in reponse.html.find('a') if "href" in element.attrs if element.attrs["href"] == '#'][6:]
|
anneesTemp = [element for element in reponse.html.find(
|
||||||
|
'a') if "href" in element.attrs if element.attrs["href"] == '#'][6:]
|
||||||
|
|
||||||
# on retire un item sur deux car : ['L2MINF/210', 'L2 Informatique', 'L1MINF/210', 'L1 Informatique'] -> il y a des doublons
|
# on retire un item sur deux car : ['L2MINF/210', 'L2 Informatique', 'L1MINF/210', 'L1 Informatique'] -> il y a des doublons
|
||||||
annees = []
|
annees = []
|
||||||
|
@ -56,9 +61,11 @@ class Universite:
|
||||||
resultat[annee.text] = None
|
resultat[annee.text] = None
|
||||||
|
|
||||||
reponse.html.render(script=annee.attrs["onclick"][7:])
|
reponse.html.render(script=annee.attrs["onclick"][7:])
|
||||||
reponse = session.post(url.replace("render", "action").replace("detail", ""))
|
reponse = session.post(url.replace(
|
||||||
|
"render", "action").replace("detail", ""))
|
||||||
|
|
||||||
reponse = session.get(url.replace("action", "render").replace("notes", "detailnotes"))
|
reponse = session.get(url.replace(
|
||||||
|
"action", "render").replace("notes", "detailnotes"))
|
||||||
self.ecrirePageHTML(annee.text, reponse.text)
|
self.ecrirePageHTML(annee.text, reponse.text)
|
||||||
|
|
||||||
return resultat
|
return resultat
|
||||||
|
@ -71,6 +78,7 @@ class Universite:
|
||||||
"""Affiche les notes dans stdout."""
|
"""Affiche les notes dans stdout."""
|
||||||
print(self.affichageNotes(self.recuperationNotes()))
|
print(self.affichageNotes(self.recuperationNotes()))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
nom = argv.pop(0)
|
nom = argv.pop(0)
|
||||||
if len(argv) == 3:
|
if len(argv) == 3:
|
||||||
|
@ -78,7 +86,8 @@ if __name__ == "__main__":
|
||||||
else:
|
else:
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
try:
|
try:
|
||||||
Universite(environ["URL"], environ["LOGIN"], environ["PASSWORD"]).notes()
|
Universite(environ["URL"], environ["LOGIN"],
|
||||||
|
environ["PASSWORD"]).notes()
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise Exception(f"""
|
raise Exception(f"""
|
||||||
\nMerci de renseigner l'URL, le pseudo et le mot de passe (avec des \"). \
|
\nMerci de renseigner l'URL, le pseudo et le mot de passe (avec des \"). \
|
||||||
|
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
requests-html==0.10.0
|
||||||
|
python-dotenv==0.19.2
|
Reference in a new issue