Jour tempo UEM

Bonjour, je viens seulement de revenir sur le site et de voir vos demandes.

Petit problème: mon nouveau script n’a fonctionné que quelques jours, ensuite je ne pouvais plus me connecter (même par moi même) Je ne sais pas si c’était un bug du site ou si j’ai été blacklisté un certain temps (peut être ils ont remarqué que je me logger automatiquement trop souvent alors que j’avais augmenté le délai…)

Maintenant que je peux de nouveau me logger, j’ai arreté le script car j’ai reçu depuis le linky et j’ai mis le lyxee dessus. Je vous mets neanmoins le script en message suivant. je fais une tentative mais j’ai du mal à mettre du code ici.

Alors il faut avoir selenium d’opérationnel, de mon côté j’ai tout dans des docker. Il y a 3 lignes à modifier dans le code: ADRESSE SERVEUR, LOGIN ET PASSWORD. Je crois avoir mis 1 heure entre deux requetes dans mon automatisation et j’ai été bloqué.

import sys
import subprocess

# Auto-installation de selenium si absent (pour le conteneur HA)
try:
    import selenium
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", "selenium"])

# Tes imports habituels ensuite
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json
import time

options = Options()
options.add_argument("--headless")
options.add_argument("--window-size=1920,1080")

driver = webdriver.Remote(command_executor='http://192.168.ADRESSE DE MON SERVEUR:4444/wd/hub', options=options)

def identify_color_by_css(element):
    """Identifie la couleur en fonction de la classe CSS du bouton"""
    classes = element.get_attribute("class").lower()
    if "bg-primary-50" in classes or "blue" in classes: return "Bleu"
    if "bg-white" in classes or "white" in classes or "border-gray" in classes: return "Blanc"
    if "bg-red" in classes or "red" in classes or "rouge" in classes: return "Rouge"
    return "Inconnu"

try:
    driver.get("https://monagence.uem-metz.fr/#/login")
    wait = WebDriverWait(driver, 20)
    
    # Connexion
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='email']"))).send_keys("MON LOGIN")
    driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys("MON PASSWORD")
    btn_login = driver.find_element(By.XPATH, "//button[contains(., 'connecter')]")
    driver.execute_script("arguments[0].click();", btn_login)
    
    time.sleep(15)

    # On récupère tous les boutons dans la zone "Jours Tempo"
    # Sur ton image, ce sont les deux éléments arrondis côte à côte
    buttons = driver.find_elements(By.XPATH, "//div[contains(@class, 'flex')]//button | //div[contains(@class, 'flex')]//div[contains(@class, 'rounded')]")
    
    res = {"today": "Inconnu", "tomorrow": "Inconnu"}

    tempo_elements = []
    for el in buttons:
        txt = el.text.lower()
        if "aujourd'hui" in txt or "demain" in txt or "venir" in txt or "bleu" in txt or "blanc" in txt:
            tempo_elements.append(el)

    if len(tempo_elements) >= 1:
        # On analyse le premier bouton (Aujourd'hui)
        # S'il contient "blanc" dans son texte ou ses classes
        html_today = tempo_elements[0].get_attribute('outerHTML').lower()
        if "blanc" in html_today or "white" in html_today: res["today"] = "Blanc"
        elif "bleu" in html_today or "blue" in html_today: res["today"] = "Bleu"
        elif "rouge" in html_today or "red" in html_today: res["today"] = "Rouge"

    if len(tempo_elements) >= 2:
        # On analyse le deuxième bouton (Demain)
        html_tomorrow = tempo_elements[1].get_attribute('outerHTML').lower()
        if "à venir" in html_tomorrow: res["tomorrow"] = "À venir"
        elif "blanc" in html_tomorrow: res["tomorrow"] = "Blanc"
        elif "bleu" in html_tomorrow: res["tomorrow"] = "Bleu"
        elif "rouge" in html_tomorrow: res["tomorrow"] = "Rouge"

    print(json.dumps(res))

except Exception as e:
    print(json.dumps({"today": "Erreur", "tomorrow": str(e)[:30]}))

finally:
    driver.quit()

Merci Alain pour le partage. Je vais avoir le Linky la semaine prochaine. Je vais donc regarder pour une solution via le Linky

Merci Alain

Petite info à priori un json est dispo sans authentification

https://monagence.uem-metz.fr/application/rest/produits-public/jourTempoEjp?dateDebut=2025-12-31&dateFin=2026-01-01

Ça semble plus facile à parser ainsi :wink:

Ah oui merci pour l’info, de mon côté je n’en ai plus besoin mais cela permet effectivement de récupérer l’info beaucoup plus facilement et sans se logger