Files
Omarchy-Big-PC b6f22ad7c1 Traduction française complète + courriel de divulgation responsable
- README, PROTOCOL, FINDINGS, endpoints, rapport et outils traduits en français
- docs/DISCLOSURE.md : courriel prêt à envoyer à hello@boti.education
  (compte démo codé en dur, transmission en clair, logging de production)
- extract_endpoints.py vérifié après traduction (100 points d'accès toujours extraits)
2026-09-01 17:29:25 +01:00

3.7 KiB

Boti Education app API : protocole (variante Green Wood School)

Rétro-ingénierie statique à partir de com.botieducation.greenwood 2.4.14 (bundle Capacitor/Ionic/Angular), vérifiée avec un seul appel de connexion réel le 2026-09-01.

URL de base

https://boti.education/p/greenwood/botiapi/

Motif par école : https://boti.education/p/<slug-école>/botiapi/ Tous les établissements Boti Education partagent un même backend. Hôte média : media.boti.education (URLs signées à durée limitée, token dans le chemin).

Authentification

Connexion

POST {base}/login            Content-Type: multipart/form-data

Champs :

  • login numéro de téléphone, ex. 06xxxxxxxx
  • password en clair
  • privacy booléen ("true"/"false")
  • remembreMe bool

Réponse (HTTP 200, application/json) :

{
  "status": 200, "msg": "Bienvenue !", "error": false,
  "keyToken": "<40 caractères hex>",       // clé de session
  "userId": "20887",
  "parentId": "1376",                      // quand role=parent
  "eleveId": "1739",
  "_acces": "parent", "role": "parent",
  "eleves": [ { id, nomcomplet, prenom, nom, datenaissance, sexe,
                niveau, img, parent_nom, parent_image } ],
  "parent": { id, nomcomplet, tel, email, sexe, image },
  "accessToken": "<jwt>",                  // présent sur certains comptes, peut être vide
  "refreshToken": "<jwt>"
}

Erreurs : {"error": true, "msg": "..."} avec HTTP 200.

Utilisation de la session sur chaque appel suivant

  • GET : paramètres d'URL, plus key= et user_id=
  • POST : champs multipart/form-data, plus key=
  • Voie moderne optionnelle (prise en charge par l'ApiService, souvent vide pour les comptes parents) : en-têtes Authorization: Bearer et X-refresh-token: Bearer

Contrôle de session côté serveur

  • Toute réponse contenant "disconnect": true signifie que la session a été tuée (l'app navigue vers la page de connexion).
  • "redirect": "" fait naviguer l'app vers ce chemin.
  • "showSLides": "<clé>" ouvre une modale de diapositives (écrans d'accueil ou d'actualités).

Enveloppe des requêtes

Paramètres GET observés dans le bundle (par fonctionnalité, sous-ensemble) : user_id, key, acces, versionCode, versionNumber, paltform (sic, la faute de frappe est dans l'app), eleveId, lang, date, startDate, endDate, classe, id, search, page

Conventions POST (FormData) :

  • champs plats ajoutés comme clé=valeur
  • objet imbriqué -> clé[sous-clé]=valeur
  • tableau -> clé[0]=..., clé[1]=...
  • File/Blob -> ajouté brut sous le nom du champ
  • key= ajouté automatiquement par l'ApiService

Notifications push

POST {base}/device_token     champs : token=<jeton fcm>, user_id, key, uid=<uuid appareil>

Inventaire des points d'accès

Voir endpoints.md (100 points d'accès de l'app, méthodes get/post et chunk source par point d'accès). Les noms sont stables et ajoutés tels quels à l'URL de base.

Médias / fichiers

  • Fichiers et images servis par media.boti.education avec un chemin signé à durée limitée (token base64url + horodatage ajoutés).
  • Les PDF sont ouverts en interne via pdf.js (chunk 7482.js).
  • getBlob(path, params, absolute) télécharge les blobs bruts pour les pièces jointes.

Particularités

  • L'ApiService ajoute le nom du point d'accès comme chaîne brute : les noms du tableau sont la route serveur complète (pas de préfixe /api, pas de .php).
  • La coquille de paramètre « paltform » est envoyée par l'app ; le serveur l'accepte, ne pas la « corriger » aveuglément.
  • Des console.log détaillés (paramètres, en-têtes) subsistent dans la version de production.