Repository navigation
Pourriez vous fournir un exemple de code s'il vous plaît ? #47
Description
Activity
+1
C’est normal, ils ont modifié le système de connexion. J’ai l’impression qu’ils le changent assez fréquemment, en ajoutant des méthodes d’authentification parfois assez farfelues, ce qui me laisse penser qu’ils souhaitent décourager son utilisation non officielle.
Je vais créer un fork en début de semaine, avec des exemples clairs sur la manière de se connecter, de récupérer les devoirs, etc.
https://github.com/fischer-c187/ecoledirecte-api-docs
j'ai mis à jour le README et j'ai ajouté un exemple d'utilisation
bonjour,
moi aussi j'ai un probleme avec l'api pourriez vous me donner des indications svp
voici mon code:const axios = require('axios');
const qs = require('qs');async function getGtkCookie() {
try {
const response = await axios.get('https://api.ecoledirecte.com/v3/login.awp?gtk=1&v=4.77.5', {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
});const setCookieHeader = response.headers['set-cookie']; const gtkLine = setCookieHeader.find(cookie => cookie.toLowerCase().startsWith('gtk=')); if (!gtkLine) { throw new Error("Le cookie 'gtk=' n’a pas été trouvé dans la réponse."); } const gtkCookie = gtkLine.split(';')[0].split('=')[1]; console.log('GTK récupéré :', gtkCookie); return gtkCookie; } catch (error) { console.error('❌ Erreur lors de la récupération du cookie GTK :', error.message); throw error; }}
async function obtenirToken(gtk) {
try {
const data = qs.stringify({
data: JSON.stringify({
identifiant: '',
motdepasse: '',
isReLogin: false,
uuid: ''
})
});const response = await axios.post( 'https://api.ecoledirecte.com/v3/login.awp?verbe=post&v=4.77.5', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'x-gtk': gtk, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } } ); console.log('Réponse complète :', response.data); if (response.data.code === 200 && response.data.token) { console.log('✅ Token obtenu :', response.data.token); } else { console.error("❌ Erreur lors de l'obtention du token : ", response.data.message); } } catch (error) { console.error('❌ Erreur de requête :', error.response?.data || error.message); }}
async function main() {
try {
const gtk = await getGtkCookie();
await obtenirToken(gtk);
} catch (error) {
console.error('❌ Erreur dans le processus principal :', error.message);
}
}main();
je recois toujours l'erreur 505 identifiants erronés or ce sont les bons j'ai essaye de encode aussi mais rien n'y fait
L'API EcoleDirecte a modifié le processus d'authentification depuis le 28/03/2024. Désormais, la réponse contient deux parties de cookie qui doivent être utilisées ensemble :
- Le cookie GTK standard (commençant par GTK=)
- Un second élément avec un identifiant unique
Les deux parties doivent être incluses dans l'en-tête Cookie lors des requêtes suivantes. La documentation a été mise à jour dans le README pour refléter ce changement.
Si votre code ne fonctionne plus, vérifiez que vous traitez correctement les deux parties du cookie comme expliqué dans la section "Récupération du cookie GTK" du README.
try { const response = await axios.get('https://api.ecoledirecte.com/v3/login.awp?gtk=1&v=4.77.5', { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } }); const setCookieHeader = response.headers['set-cookie']; if (!setCookieHeader || !setCookieHeader.length) { throw new Error("Aucun cookie trouvé dans la réponse"); } // Traiter les parties du cookie séparées par des virgules const cookieString = setCookieHeader.join(', '); const cookieParts = cookieString.split(', '); let gtkCookie = null; let secondCookie = null; for (const part of cookieParts) { const cookieMain = part.split(';')[0]; if (cookieMain.startsWith('GTK=')) { gtkCookie = cookieMain; } else { secondCookie = cookieMain; } } if (!gtkCookie) { throw new Error("Le cookie 'GTK=' n'a pas été trouvé dans la réponse"); } // Extraire la valeur du GTK (sans le préfixe "GTK=") const gtkValue = gtkCookie.substring(4); // Créer l'objet de retour contenant la valeur du GTK et la chaîne complète du cookie const cookieFullString = secondCookie ? `${gtkCookie}; ${secondCookie}` : gtkCookie; return { gtk: gtkValue, cookieString: cookieFullString }; } catch (error) { console.error('❌ Erreur lors de la récupération du cookie GTK :', error.message); throw error; } }```MultiwareInteractiveStudios commented
on May 2, 2025 More actionsBonjour,
Je suis dans le même cas, j'utilise un script php qui me permet d'éviter une erreur cors. Cependant lorsque j'éxécute mon script je reçoit bien le gtk et autre mais j'ai : Réponse de connexion (Code: 200): {"code":505, "token":"", "message":"Identifiant et/ou mot de passe invalide !", "data":{"changementMDP":false, "nbJourMdpExire":0, "accounts":[]}}. J'ai vérifié mes identifiants et l'encodage et normalement je respecte. Voici le scriptphp.<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);$versionAPI = '4.79.0'; // Utilisation de la version recommandée $identifiant = urlencode('ID'); // Identifiant encodé $motdepasse = urlencode('MDP'); // Mot de passe encodé $userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'; // Étape 1 : Récupérer le cookie GTK et l'identifiant unique $urlGTK = "https://api.ecoledirecte.com/v3/login.awp?gtk=1&v={$versionAPI}"; $chGTK = curl_init($urlGTK); curl_setopt($chGTK, CURLOPT_RETURNTRANSFER, true); curl_setopt($chGTK, CURLOPT_USERAGENT, $userAgent); curl_setopt($chGTK, CURLOPT_HEADER, true); // Inclure les en-têtes curl_setopt($chGTK, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // Forcer HTTP/1.1 $responseGTK = curl_exec($chGTK); $headerSizeGTK = curl_getinfo($chGTK, CURLINFO_HEADER_SIZE); $headerStrGTK = substr($responseGTK, 0, $headerSizeGTK); $httpCodeGTK = curl_getinfo($chGTK, CURLINFO_HTTP_CODE); curl_close($chGTK); $gtkValue = null; $secondCookieValue = null; $setCookieHeaders = []; // Récupérer tous les en-têtes Set-Cookie preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $headerStrGTK, $matches); $setCookieHeaders = $matches[1]; if (!empty($setCookieHeaders)) { $cookieString = implode(', ', $setCookieHeaders); $cookieParts = explode(', ', $cookieString); foreach ($cookieParts as $part) { $cookieMain = explode(';', $part)[0]; if (strpos($cookieMain, 'GTK=') === 0) { $gtkValue = substr($cookieMain, 4); } else { $secondCookieValue = $cookieMain; } } } $cookieHeader = ''; if ($gtkValue) { $cookieHeader = 'GTK=' . $gtkValue; if ($secondCookieValue) { $cookieHeader .= '; ' . $secondCookieValue; } } echo "Réponse récupération GTK (Code: {$httpCodeGTK}):\n"; echo "En-têtes Set-Cookie récupérés : " . print_r($setCookieHeaders, true) . "\n"; echo "GTK Value : " . $gtkValue . "\n"; echo "Second Cookie Value : " . $secondCookieValue . "\n"; echo "Cookie Header pour la connexion : " . $cookieHeader . "\n"; echo "X-GTK Header pour la connexion : " . $gtkValue . "\n\n"; // Étape 2 : Tenter la connexion $urlLogin = "https://api.ecoledirecte.com/v3/login.awp?v={$versionAPI}"; $postData = [ 'data' => json_encode([ 'identifiant' => $identifiant, 'motdepasse' => $motdepasse, 'isReLogin' => false, 'uuid' => '', 'fa' => [], 'cn' => '', 'cv' => '' ], JSON_UNESCAPED_UNICODE) ]; $postFields = http_build_query($postData); $chLogin = curl_init($urlLogin); curl_setopt($chLogin, CURLOPT_RETURNTRANSFER, true); curl_setopt($chLogin, CURLOPT_USERAGENT, $userAgent); curl_setopt($chLogin, CURLOPT_POST, true); curl_setopt($chLogin, CURLOPT_POSTFIELDS, $postFields); curl_setopt($chLogin, CURLOPT_HTTPHEADER, [ 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8', 'X-GTK: ' . $gtkValue, 'Cookie: ' . $cookieHeader ]); curl_setopt($chLogin, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // Forcer HTTP/1.1 $responseLogin = curl_exec($chLogin); $httpCodeLogin = curl_getinfo($chLogin, CURLINFO_HTTP_CODE); curl_close($chLogin); echo "Réponse de connexion (Code: {$httpCodeLogin}):\n"; echo $responseLogin . "\n";?>`
Merci beaucoup
bonjour,
1. Ne pas utiliser urlencode() sur les identifiants
Le problème principal est que vous encodez identifiant et mot de passe avec urlencode() AVANT de les inclure dans le JSON. EcoleDirecte s'attend à recevoir les valeurs brutes dans le JSON, pas pré-encodées.
Corrigez: $identifiant = 'ID'; et $motdepasse = 'MDP'; (sans urlencode)2. Format de la requête
Votre corps de requête doit être exactement au format attendu par l'API
Ajoutez sesouvenirdemoi: true qui semble obligatoireVoici le code fonctionnel avec l'ajout du QCM. Le mieux est d'avoir un objet avec les questions et les réponses aux QCM pour pouvoir avoir un login automatisé.
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Fonction pour décoder le Base64 function decodeBase64($str) { return base64_decode($str); } // Configuration $versionAPI = '4.79.0'; $identifiant = 'id'; $motdepasse = 'mdp'; $userAgent = 'Mozilla/5.0 (X11; Linux x86_64; rv:137.0) Gecko/20100101 Firefox/137.0'; // Étape 1 : Récupérer le cookie GTK $urlGTK = "https://api.ecoledirecte.com/v3/login.awp?gtk=1&v={$versionAPI}"; $chGTK = curl_init($urlGTK); curl_setopt($chGTK, CURLOPT_RETURNTRANSFER, true); curl_setopt($chGTK, CURLOPT_USERAGENT, $userAgent); curl_setopt($chGTK, CURLOPT_HEADER, true); curl_setopt($chGTK, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($chGTK, CURLOPT_SSL_VERIFYHOST, false); $responseGTK = curl_exec($chGTK); if ($responseGTK === false) { die('Erreur cURL (GTK) : ' . curl_error($chGTK)); } $headerSizeGTK = curl_getinfo($chGTK, CURLINFO_HEADER_SIZE); $headerStrGTK = substr($responseGTK, 0, $headerSizeGTK); $httpCodeGTK = curl_getinfo($chGTK, CURLINFO_HTTP_CODE); curl_close($chGTK); // Récupérer les cookies preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $headerStrGTK, $matches); $setCookieHeaders = $matches[1]; $gtkValue = null; $cookieString = ''; foreach ($setCookieHeaders as $cookiePart) { $cookieMain = explode(';', $cookiePart)[0]; if (strpos($cookieMain, 'GTK=') === 0) { $gtkValue = substr($cookieMain, 4); $cookieString = $cookieMain; } else if (!empty($cookieString)) { $cookieString .= '; ' . $cookieMain; } else { $cookieString = $cookieMain; } } echo "GTK récupéré : " . substr($gtkValue, 0, 10) . "...\n\n"; // Étape 2 : Tenter la connexion $urlLogin = "https://api.ecoledirecte.com/v3/login.awp?v={$versionAPI}"; $loginData = [ 'identifiant' => $identifiant, 'motdepasse' => $motdepasse, 'isReLogin' => false, 'uuid' => '', 'sesouvenirdemoi' => true ]; $postData = ['data' => json_encode($loginData, JSON_UNESCAPED_UNICODE)]; $postFields = http_build_query($postData); $chLogin = curl_init($urlLogin); curl_setopt($chLogin, CURLOPT_RETURNTRANSFER, true); curl_setopt($chLogin, CURLOPT_USERAGENT, $userAgent); curl_setopt($chLogin, CURLOPT_POST, true); curl_setopt($chLogin, CURLOPT_POSTFIELDS, $postFields); curl_setopt($chLogin, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($chLogin, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($chLogin, CURLOPT_HTTPHEADER, [ 'Content-Type: application/x-www-form-urlencoded', 'X-GTK: ' . $gtkValue, 'Cookie: ' . $cookieString, 'Accept: application/json, text/plain, */*', 'Origin: https://www.ecoledirecte.com', 'Referer: https://www.ecoledirecte.com/' ]); $responseLogin = curl_exec($chLogin); curl_close($chLogin); $loginJson = json_decode($responseLogin, true); echo "Code de réponse : " . $loginJson['code'] . "\n"; // Étape 3 : Gestion de la double authentification si nécessaire (code 250) if ($loginJson && isset($loginJson['code']) && $loginJson['code'] === 250) { echo "Double authentification requise (QCM)\n"; $token = $loginJson['token']; // Récupérer le QCM $urlQCM = "https://api.ecoledirecte.com/v3/connexion/doubleauth.awp?verbe=get"; // Important: créer le même format de données que dans TypeScript $qcmForm = ['data' => '{}']; // JSON vide, sans json_encode $qcmFields = http_build_query($qcmForm); $chQCM = curl_init($urlQCM); curl_setopt($chQCM, CURLOPT_RETURNTRANSFER, true); curl_setopt($chQCM, CURLOPT_USERAGENT, $userAgent); curl_setopt($chQCM, CURLOPT_POST, true); // Toujours POST curl_setopt($chQCM, CURLOPT_POSTFIELDS, $qcmFields); curl_setopt($chQCM, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($chQCM, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($chQCM, CURLOPT_HTTPHEADER, [ 'Content-Type: application/x-www-form-urlencoded', 'X-GTK: ' . $gtkValue, 'Cookie: ' . $cookieString, 'X-Token: ' . $token ]); $responseQCM = curl_exec($chQCM); curl_close($chQCM); $qcmJson = json_decode($responseQCM, true); if ($qcmJson && isset($qcmJson['data'])) { // Décoder la question et les propositions en Base64 $questionBase64 = $qcmJson['data']['question']; $propositionsBase64 = $qcmJson['data']['propositions']; $question = base64_decode($questionBase64); $propositions = array_map('base64_decode', $propositionsBase64); echo "\n=== Questionnaire de vérification ===\n"; echo "Question: $question\n\n"; echo "Propositions:\n"; foreach ($propositions as $index => $proposition) { echo ($index + 1) . ". $proposition\n"; } // Demander à l'utilisateur de choisir une réponse echo "\nEntrez le numéro de votre choix (1-" . count($propositions) . "): "; $choixUtilisateur = trim(fgets(STDIN)); $choixIndex = intval($choixUtilisateur) - 1; if ($choixIndex < 0 || $choixIndex >= count($propositions)) { echo "Choix invalide, sélection du premier choix par défaut.\n"; $choixIndex = 0; } $choixBase64 = $propositionsBase64[$choixIndex]; echo "Vous avez choisi: " . $propositions[$choixIndex] . "\n"; // Envoyer la réponse au QCM $urlReponseQCM = "https://api.ecoledirecte.com/v3/connexion/doubleauth.awp?verbe=post"; $reponseForm = ['data' => json_encode(['choix' => $choixBase64], JSON_UNESCAPED_UNICODE)]; $reponseFields = http_build_query($reponseForm); $chReponse = curl_init($urlReponseQCM); curl_setopt($chReponse, CURLOPT_RETURNTRANSFER, true); curl_setopt($chReponse, CURLOPT_USERAGENT, $userAgent); curl_setopt($chReponse, CURLOPT_POST, true); curl_setopt($chReponse, CURLOPT_POSTFIELDS, $reponseFields); curl_setopt($chReponse, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($chReponse, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($chReponse, CURLOPT_HTTPHEADER, [ 'Content-Type: application/x-www-form-urlencoded', 'X-GTK: ' . $gtkValue, 'Cookie: ' . $cookieString, 'X-Token: ' . $token ]); $responseReponse = curl_exec($chReponse); curl_close($chReponse); $reponseJson = json_decode($responseReponse, true); if ($reponseJson && isset($reponseJson['data']['cn']) && isset($reponseJson['data']['cv'])) { echo "Réponse validée avec succès\n"; // Récupérer les valeurs cn et cv $cn = $reponseJson['data']['cn']; $cv = $reponseJson['data']['cv']; // Obtenir un nouveau GTK $newGtk = getGTK($userAgent, $versionAPI); // Connexion finale avec les valeurs cn et cv $finalLoginData = [ 'identifiant' => $identifiant, 'motdepasse' => $motdepasse, 'isReLogin' => false, 'uuid' => '', 'sesouvenirdemoi' => true, 'fa' => [['cn' => $cn, 'cv' => $cv]] ]; $finalPostData = ['data' => json_encode($finalLoginData, JSON_UNESCAPED_UNICODE)]; $finalPostFields = http_build_query($finalPostData); $chFinalLogin = curl_init($urlLogin); curl_setopt($chFinalLogin, CURLOPT_RETURNTRANSFER, true); curl_setopt($chFinalLogin, CURLOPT_USERAGENT, $userAgent); curl_setopt($chFinalLogin, CURLOPT_POST, true); curl_setopt($chFinalLogin, CURLOPT_POSTFIELDS, $finalPostFields); curl_setopt($chFinalLogin, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($chFinalLogin, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($chFinalLogin, CURLOPT_HTTPHEADER, [ 'Content-Type: application/x-www-form-urlencoded', 'X-GTK: ' . $newGtk['gtk'], 'Cookie: ' . $newGtk['cookieString'] ]); $responseFinalLogin = curl_exec($chFinalLogin); curl_close($chFinalLogin); $finalLoginJson = json_decode($responseFinalLogin, true); if ($finalLoginJson && $finalLoginJson['code'] === 200) { echo "\n✅ Connexion réussie!\n"; echo "Token: " . substr($finalLoginJson['token'], 0, 20) . "...\n"; if (isset($finalLoginJson['data']['accounts']) && count($finalLoginJson['data']['accounts']) > 0) { echo "Comptes trouvés: " . count($finalLoginJson['data']['accounts']) . "\n"; } } else { echo "\n❌ Échec de la connexion finale: " . ($finalLoginJson['message'] ?? "erreur inconnue") . "\n"; } } else { echo "Échec de validation de la réponse QCM\n"; } } else { echo "Erreur lors de la récupération du QCM\n"; if (isset($qcmJson['message'])) { echo "Message: " . $qcmJson['message'] . "\n"; } } } else if (isset($loginJson['code']) && $loginJson['code'] === 200) { echo "✅ Connexion réussie sans QCM!\n"; echo "Token: " . substr($loginJson['token'], 0, 20) . "...\n"; } else { echo "❌ Échec de connexion: " . ($loginJson['message'] ?? "erreur inconnue") . "\n"; } // Fonction pour récupérer le GTK function getGTK($userAgent, $versionAPI) { $urlGTK = "https://api.ecoledirecte.com/v3/login.awp?gtk=1&v={$versionAPI}"; $ch = curl_init($urlGTK); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headerStr = substr($response, 0, $headerSize); curl_close($ch); preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $headerStr, $matches); $cookies = $matches[1]; $gtkValue = null; $cookieString = ''; foreach ($cookies as $cookiePart) { $cookieMain = explode(';', $cookiePart)[0]; if (strpos($cookieMain, 'GTK=') === 0) { $gtkValue = substr($cookieMain, 4); $cookieString = $cookieMain; } else if (!empty($cookieString)) { $cookieString .= '; ' . $cookieMain; } else { $cookieString = $cookieMain; } } return [ 'gtk' => $gtkValue, 'cookieString' => $cookieString ]; }
Pour le QCM le mieux c'est d'avoir un objet avec les questions et les réponses aux QCM pour pouvoir avoir un login automatisé.
Voici une liste de questions, je ne sais pas s'il en manque ou pas :{ "Quelle est votre année de naissance ?": "", "Quel est votre mois de naissance ?": "", "Quelle est votre classe ?": "", "Quel est votre jour de naissance ?": "", "Quel est le nom de famille de votre professeur principal ?": "", }Ces questions sont valables uniquement si vous utilisez l'ID d'un compte élève.
Reacted by MultiwareInteractiveStudiosMultiwareInteractiveStudios commented
on May 8, 2025 More actionsMerci pour votre aide, j'ai vraiment l'impression d'être une buse mais je souhaite désormais récupérer le data pour les notes, mais j'obtiens l'erreur 520, je suis les recommandations et je me reconnecte et toujours la même erreur. Je teste même avec un token utilisé par EcoleDirecte et où le chargement des notes fonctionne mais encore la même erreur. Je pense que le problème viens de mon script. Si quelqu'un m'aider.
Voici mon script (là l'extension est txt mais normalement c'est php).
https://github.com/fischer-c187/ecoledirecte-api-docs
j'ai mis à jour le README et j'ai ajouté un exemple d'utilisation
Merci !
Pourriez vous fournir un exemple de code (par exemple pour récupérer des devoirs ou des notes), ainsi que les étapes nécessaires pour faire fonctionner l'api s'il vous plaît ? J'essaie depuis des heures et rien ne semble marcher. De plus, il n'y a aucune autre documentation que celle-ci sur internet.
Merci beaucoup !