docs: nouveautes bodies live in admin_nouveautes (19MB), not parent list
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
# Nouveautés : corps des annonces et endpoint admin_nouveautes
|
||||
|
||||
Constat du 13-14 septembre 2026, vérifié en production avec les identifiants
|
||||
parent (aucune donnée personnelle stockée ici).
|
||||
|
||||
## Le piège : la liste `nouveautes` ne contient pas les corps
|
||||
|
||||
Le endpoint `nouveautes` (GET) renvoie la liste des 10 derniers posts avec
|
||||
seulement : id, title, categorie, date, intro, files, image. L'intro ne
|
||||
contient que le badge "Vu le ..." et éventuellement rien du tout. Les vrais
|
||||
corps ("Chers parents, ...") n'y figurent PAS.
|
||||
|
||||
Beaucoup d'annonces n'ont pas de texte du tout côté liste : elles semblent
|
||||
vides alors qu'elles ont un `description` complet côté admin.
|
||||
|
||||
## Où sont les corps : `admin_nouveautes`
|
||||
|
||||
`GET https://boti.education/p/greenwood/botiapi/admin_nouveautes` avec les
|
||||
params standard (user_id, parent_id, eleve_id, key) renvoie TOUTES les
|
||||
annonces de l'école depuis 2021, avec le champ `description` complet
|
||||
(HTML) et les fichiers joints. Attention :
|
||||
|
||||
- **~19 Mo de JSON** pour Greenwood. Ne pas le poller en boucle, c'est
|
||||
le genre de requête qui finit sur une liste de blocage.
|
||||
- C'est un endpoint "admin" côté nom mais il répond très bien au compte
|
||||
parent standard. Probablement l'endpoint utilisé par la vue détaillée
|
||||
d'un post dans l'app.
|
||||
|
||||
Les posts récents y apparaissent PARFOIS avant d'être visibles dans la
|
||||
liste parent `nouveautes` (constaté : note "Emploi du temps" du 14/09
|
||||
16:37 visible dans admin_nouveautes, absente de nouveautes).
|
||||
|
||||
## Fichiers joints
|
||||
|
||||
- `files[].link` sont des URLs media.boti.education/view/... signées,
|
||||
DOUBLE-encodées comme d'habitude : décoder exactement une fois avec
|
||||
parse_qs, garder %2B/%2F/%3D littéraux (server.viewer_to_real()).
|
||||
- Expiration ~15-20 min : télécharger dans la même exécution du script.
|
||||
- Beaucoup d'annonces n'ont pas de PDF : le contenu est uniquement dans
|
||||
`description` (HTML avec emojis, <p style="text-align: justify">).
|
||||
|
||||
## Historique des emplois du temps
|
||||
|
||||
L'école publie les EDT classe par classe via des notes "Emploi du temps"
|
||||
dans les nouveautés (PDF joints), généralement la 1re quinzaine de
|
||||
septembre. Le grille `cours_v2` reste vide en parallèle jusqu'à
|
||||
renseignement par l'admin. 2026 : publiés du 07/09 (maternelle GS/MS) au
|
||||
14/09 (TPS/PS) ; lycée/TC pas encore paru au 14/09.
|
||||
|
||||
## Script de récupération des corps
|
||||
|
||||
```python
|
||||
import sys, html, re
|
||||
sys.path.insert(0, "/home/iliasmouhcine/dev/boti-client")
|
||||
import server
|
||||
c = server.BotiClient()
|
||||
if not c.key: c.login()
|
||||
d = server.http_get("admin_nouveautes", {"user_id": c.user_id,
|
||||
"parent_id": c.parent_id, "eleve_id": c.eleve_id, "key": c.key})
|
||||
for p in d["data"][:10]:
|
||||
body = html.unescape(p.get("description") or "")
|
||||
body = re.sub(r"<br\s*/?>", "\n", re.sub(r"</p>", "\n", body))
|
||||
body = re.sub(r"<[^>]+>", "", body)
|
||||
print("=====", p["title"], "|", p["date"])
|
||||
print(body.strip())
|
||||
```
|
||||
+1
-1
@@ -17,7 +17,7 @@ https://boti.education/p/greenwood/botiapi/<endpoint>.
|
||||
| admin_demande_eleve | get, post | 1514.js, 9714.js, 9964.js |
|
||||
| admin_discipline_eleve | get, post | 1172.js, 9964.js |
|
||||
| admin_fiche_eleve | get | 9964.js |
|
||||
| admin_nouveautes | get | 6154.js |
|
||||
| admin_nouveautes | get | 6154.js | (renvoie TOUT l'historique avec le corps `description`, ~19 Mo Greenwood ; voir docs/NOUVEAUTES_BODIES.md)
|
||||
| admin_search_eleve | get | 6996.js |
|
||||
| admin_suivi_eleve | get, post | 3555.js, 9964.js |
|
||||
| album_photo | get | 6124.js, 6925.js |
|
||||
|
||||
Reference in New Issue
Block a user