API – Flux Dashboard Campus =========================== Cette API permet d’accéder en temps réel aux données du dashboard Campus (statistiques, historique, derniers invités, etc.). L’accès est protégé par une clé API fournie séparément. ------------------------------------------------------------ 1. URL d’accès ------------------------------------------------------------ JSON (format recommandé) https://dev.campus.cul.nu/dashboard_feed.php?key=VOTRE_CLE_API XML https://dev.campus.cul.nu/dashboard_feed.php?key=VOTRE_CLE_API&format=xml Jour spécifique (ex. 2025-01-01) https://dev.campus.cul.nu/dashboard_feed.php?key=VOTRE_CLE_API&day=2025-01-01 ------------------------------------------------------------ 2. Authentification ------------------------------------------------------------ - L’accès se fait via key=VOTRE_CLE_API - Si la clé est incorrecte → HTTP 403 Forbidden - Aucun autre système d’authentification n’est nécessaire ------------------------------------------------------------ 3. Structure du JSON renvoyé ------------------------------------------------------------ Le fichier contient 5 blocs principaux : - meta - stats - days - hourly - last_invites Exemple simplifié : { "meta": { "generated_at": "2025-01-22T01:42:13+01:00", "selected_day": "2025-01-22" }, "stats": { "total_invites": 2034, "total_nouveaux_arrivants": 351, "total_staff": 842, "invites_today": 124, "invites_last_60": 18 }, "days": [ { "date": "2025-01-15", "total": 350 }, { "date": "2025-01-16", "total": 420 } ], "hourly": { "labels": ["00h","01h","02h", ... "23h"], "values": [0, 2, 1, ...] }, "last_invites": [ { "id": 15592, "invite_prenom": "Laura", "invite_nom": "Martin", "invite_full": "Laura Martin", "staff_prenom": "Jean", "staff_nom": "Dubois", "staff_full": "Jean Dubois", "created_at": "2025-01-22 01:39:44" } ] } ------------------------------------------------------------ 4. Description des sections ------------------------------------------------------------ 4.1 meta - generated_at : date/heure ISO8601 - selected_day : jour utilisé pour le tableau "hourly" 4.2 stats - total_invites - total_nouveaux_arrivants - total_staff - invites_today - invites_last_60 4.3 days Chaque entrée contient : - date (YYYY-MM-DD) - total (invités ce jour-là) 4.4 hourly - labels (24 valeurs de "00h" à "23h") - values (24 entiers) 4.5 last_invites Chaque entrée contient : - id - invite_prenom / invite_nom / invite_full - staff_prenom / staff_nom / staff_full - created_at (timestamp) ------------------------------------------------------------ 5. Codes d’erreur ------------------------------------------------------------ 403 Forbidden { "error": "Accès refusé (clé API invalide)." } 500 Internal Server Error { "error": "Erreur interne.", "message": "Détail." } ------------------------------------------------------------ 6. Conseils d’intégration ------------------------------------------------------------ - Rafraîchir toutes les 5–10 secondes maximum. - "days" et "hourly" sont parfaits pour les graphiques. - "last_invites" permet un flux d’activité en direct (live feed). ------------------------------------------------------------ 7. Exemples de code pour consommer l’API ------------------------------------------------------------ --- PHP --- Invités aujourd'hui : " . $json['stats']['invites_today'] . ""; echo "

Derniers invités :

"; foreach ($json['last_invites'] as $invite) { echo "- " . $invite['invite_full'] . " (staff: " . $invite['staff_full'] . ")
"; } ?> --- Python --- import requests url = "https://dev.campus.cul.nu/dashboard_feed.php?key=VOTRE_CLE_API" data = requests.get(url).json() print("Invités aujourd'hui :", data["stats"]["invites_today"]) print("\nDerniers invités :") for entry in data["last_invites"]: print("-", entry["invite_full"], "| Staff:", entry["staff_full"]) --- JavaScript (fetch + HTML) --- fetch("https://dev.campus.cul.nu/dashboard_feed.php?key=VOTRE_CLE_API") .then(res => res.json()) .then(data => { document.getElementById("today").innerText = data.stats.invites_today; let list = ""; data.last_invites.forEach(inv => { list += `
  • ${inv.invite_full} (staff: ${inv.staff_full})
  • `; }); document.getElementById("list").innerHTML = list; }); HTML minimal :

    Invités aujourd'hui :

    ---------------------- exemple 0) { return $data; } // 2) Fallback avec cURL if (!function_exists('curl_init')) { return false; } $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_TIMEOUT => 10, CURLOPT_SSL_VERIFYPEER => false, // à durcir si nécessaire CURLOPT_SSL_VERIFYHOST => false, ]); $response = curl_exec($ch); $err = curl_error($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($response === false) { echo "

    Erreur cURL : " . htmlspecialchars($err) . " (HTTP $code)

    "; return false; } if ($code !== 200) { echo "

    Erreur HTTP : $code

    "; } return $response; } // ---------- APPEL API ---------- $jsonRaw = callApi($apiUrl); if (!$jsonRaw) { die("Erreur : impossible de charger le flux API."); } // Pour vérifier ce que renvoie l'API en cas de doute : // echo "
    "; echo htmlspecialchars($jsonRaw); echo "
    "; exit; $data = json_decode($jsonRaw, true); if (!$data) { echo "
    JSON brut :\n" . htmlspecialchars($jsonRaw) . "
    "; die("Erreur : format JSON invalide. Détail : " . json_last_error_msg()); } // Vérif de la structure attendue if (!isset($data["stats"], $data["hourly"], $data["last_invites"], $data["meta"])) { echo "
    JSON décodé :\n" . htmlspecialchars(print_r($data, true)) . "
    "; die("Erreur : structure inattendue dans la réponse API."); } // Raccourcis $stats = $data["stats"]; $days = $data["days"] ?? []; $hourly = $data["hourly"]; $lastInvites = $data["last_invites"]; ?> Monitoring Campus

    📊 Monitoring Campus

    Invités total

    Nouveaux arrivants

    Staff inscrit

    Invités aujourd'hui

    Invités (60 dernières min)

    🕒 Invités par heure ()
    🧍 Derniers invités

    Aucun invité trouvé.

    ID Invité Staff Date / heure