From b64d7fc46d18fb584ba29c36023b20a057fe17fc Mon Sep 17 00:00:00 2001 From: Adrien Nunes <adrien.nunes@ensiie.fr> Date: Sun, 19 Dec 2021 01:00:18 +0100 Subject: [PATCH] Python c moins bien --- main.py | 190 -------------------------------------------------------- 1 file changed, 190 deletions(-) delete mode 100644 main.py diff --git a/main.py b/main.py deleted file mode 100644 index 051143e..0000000 --- a/main.py +++ /dev/null @@ -1,190 +0,0 @@ -import time -import sys -import requests -from bs4 import BeautifulSoup - - -#Remplire ici -# (ou bien ils seront demandés avant l'execution) -webhook = None #Sous forme "https://discord.com/api/webhooks/???/???" -username = None -password = None -############# -if(not username): - username = input("Enter your username: ") -if(not password): - password = input("Enter your password: ") -if(not webhook): - webhook = input("Enter your Discord webhook (https://discord.com/api/webhooks/???/???)\n: ") - -url_cas = "https://cas.ensiie.fr/login" -url_notes = "https://aurionweb.ensiie.fr/faces/LearnerNotationListPage.xhtml" -url_aurion = "https://aurionweb.ensiie.fr/faces/MainMenuPage.xhtml" - -session = None -notes_dones = [] - - -def new_session(): - global session - session = requests.session() - -class AurionSession: - def __init__(self): - form_id = None - form_res_id = None - form_sub_res_id = None - viewState = None - - -# Recupere le champs <input> 'execution' de la page de connexion -def get_execution(): - field = 'name="execution" value="' - r = session.get(url_cas, verify=False) - start = r.text.index(field) + len(field) - end = r.text.index('"', start + 1) - return r.text[start:end] - -# Login sur le cas -def login(execution): - data = { - 'username': username, - 'password': password, - 'execution': execution, - '_eventId': 'submit', - 'geolocation': '' - } - session.post(url_cas, data=data) - - -#Parse une page pour update le nouvau 'viewState' -def parse_view_state(rep, aurion_session): - soup = BeautifulSoup(rep, 'html.parser') - element = soup.find('update', {'id':'j_id1:javax.faces.ViewState:0'}) - if(element != None): - aurion_session.viewState = element.string - else: - aurion_session.viewState = soup.find('input', {'id': 'j_id1:javax.faces.ViewState:0'})['value'] - - -#Parse une page et recupere l'id du menu -def parse_menu_id(text, aurion_session): - field = '{PrimeFaces.ab({s:"' - soup = BeautifulSoup(text, 'html.parser') - - for script in soup.find_all('script'): - content = script.string - if(content != None and "chargerSousMenu" in content): - start = content.find(field) - if(start > 0): - start += len(field) - end = content.find('"', start) - aurion_session.form_id = content[start:end] - return - - -#Parse une page et recupere l'id du menu 'Résultats' -def parse_menu_res(text, aurion_session): - soup = BeautifulSoup(text, 'html.parser') - for span in soup.findAll('span', {'class' : 'ui-menuitem-text'}): - if(span.string == "Résultats"): - for classMenu in span.parent.parent['class']: - if(classMenu.startswith('submenu_')): - aurion_session.form_res_id = classMenu - return - return - - -#Parse une page et recupere l'id du sous-menu 'Notes aux épreuves année en cours' -def parse_submenu_res(text, aurion_session): - field = "form:sidebar_menuid':'" - content = BeautifulSoup(text, 'html.parser') - for sub_menu in content.findAll('span', {'class' : 'ui-menuitem-text'}): - if(sub_menu.string == 'Notes aux épreuves année en cours'): - m = sub_menu.parent['onclick'] - start = m.index(field) + len(field) - end = m.index("'", start) - aurion_session.form_sub_res_id = m[start:end] - return - -#Demande les sous-menu du menu 'Résultats' -def init_result(aurion_session): - data = { - 'javax.faces.partial.ajax': 'true', - 'javax.faces.source': aurion_session.form_id, - 'javax.faces.partial.execute': aurion_session.form_id, - 'javax.faces.partial.render': 'form:sidebar', - aurion_session.form_id: aurion_session.form_id, - 'webscolaapp.Sidebar.ID_SUBMENU': aurion_session.form_res_id, - 'form': 'form', - 'javax.faces.ViewState': aurion_session.viewState - } - - r = session.post(url_aurion, data=data) - soup = BeautifulSoup(r.text, 'html.parser') - parse_submenu_res(soup.find('update').string, aurion_session) - parse_view_state(r.text, aurion_session) - - -#Envoi une alert Discord -def send_alert(note): - print(note) - data = { - 'content': note, - 'username': 'Notobot', - } - requests.post(webhook, json=data) - - -#Parse les notes -def process_note(note_element): - fields = note_element.findAll('td') - code = fields[1].string - title = fields[2].string - note = fields[3].string - - if( code not in notes_dones ): - notes_dones.append(code) - send_alert(title+' -> '+note) - time.sleep(1) - - -#Demande les notes -def get_result(aurion_session): - data = { - 'form': 'form', - 'form:sidebar': 'form:sidebar', - 'form:sidebar_menuid': aurion_session.form_sub_res_id, - 'javax.faces.ViewState': aurion_session.viewState - } - - r = session.post(url_aurion, data=data) - - soup = BeautifulSoup(r.text, 'html.parser') - - for line in soup.find('tbody').findAll('tr'): - process_note(line) - - - -def init_main(): - aurion_session = AurionSession() - r = session.get(url_aurion) - - parse_menu_id(r.text, aurion_session) - parse_menu_res(r.text, aurion_session) - parse_view_state(r.text, aurion_session) - init_result(aurion_session) - get_result(aurion_session) - - -if __name__ == '__main__': - while True: - try: - new_session() - execution = get_execution() - login(execution) - init_main() - except: - print("Error_ ", sys.exc_info()[0]) - time.sleep(600) \ No newline at end of file -- GitLab