Toutes les réalisations

06 — Fleet Services Group

Un extracteur qui réapprend à lire, et un générateur XLSX écrit de zéro

Une extension de navigateur qui exporte en fichier tableur la liste des personnes ayant réagi à une publication. Quand le site change et casse l'export, elle réapprend seule à lire la page.

Savoir qui a réagi à une publication est un signal commercial utile : ces gens-là se sont manifestés. Encore faut-il pouvoir sortir la liste. Une extension de navigateur est le seul endroit d'où c'est possible — et c'est aussi l'environnement le plus contraint qui soit.

Contexte
Interne — Fleet Services Group
Rôle
Conception et réalisation
Période
2026
État
En service

Deux contraintes qui dictent tout

La page change sans prévenir. Les classes CSS sont générées et illisibles, la structure évolue au fil des mises à jour. Un extracteur écrit de façon classique casse en quelques semaines — et il casse silencieusement : on s'en aperçoit en ouvrant un export vide.

Une extension ne peut embarquer aucune dépendance raisonnablement. Chaque bibliothèque ajoutée gonfle le paquet, complique la revue, et devient une surface de risque dans un contexte où l'extension a accès aux pages de l'utilisateur. Or il fallait produire un vrai fichier tableur, pas un CSV renommé.

Décisions structurantes

01Ne s’appuyer que sur ce qui est stable

Aucun nom de classe n'est utilisé. L'extraction repose sur des ancres structurelles — le type d'élément, les attributs de rôle — et surtout sur les descriptions d'accessibilité, qui décrivent en une phrase le nom de la personne, sa réaction, son niveau de relation et sa fonction. C'est du contenu sémantique : il change beaucoup moins souvent que la présentation, parce qu'il est là pour les lecteurs d'écran.

02Un répertoire de stratégies plutôt qu’une méthode de lecture

L'extension ne code pas une seule façon de lire la page : elle en connaît plusieurs — par description d'accessibilité, par paragraphes visibles, par lignes de texte génériques. La stratégie active n'est pas dans le code : elle est stockée dans un fichier de règles lu à chaque extraction.

03Un test de référence avec vérité terrain figée

Une publication repère, dont les dix-sept réacteurs sont figés dans le code comme vérité terrain. Un bouton ouvre la publication, déploie seul la liste complète, extrait, et compare au repère. Le verdict est explicite : tous retrouvés avec nom, fonction et lien, ou bien la liste de ce qui manque. Une fonction dont le libellé a changé est signalée comme une mise à jour du profil, pas comme une casse — la distinction évite les fausses alertes.

04La réparation est automatique, et ses limites sont affichées

Quand l'extraction casse, le test rejoue chaque stratégie contre les dix-sept repères, garde celle qui les reproduit le mieux, réécrit le fichier de règles, puis ré-extrait pour vérifier. Le code n'est pas modifié. Le verdict dit alors quelle stratégie a été retenue. Et la limite est écrite noir sur blanc : la mécanique choisit la meilleure méthode parmi celles qu'elle connaît — si l'information disparaît de la page, aucune stratégie ne la retrouve, et il faut en ajouter une. Un outil doit dire quand il ne peut plus faire son travail.

05Écrire le format XLSX plutôt que d’importer une bibliothèque

Un fichier tableur est une archive ZIP contenant du XML. J'ai donc écrit les deux : le conteneur ZIP en mode « stocké » (sans compression, ce qui évite d'implémenter aussi un compresseur) avec sa table de contrôle d'intégrité CRC32 calculée à la main, et le XML minimal qu'attend un tableur — classeur, feuille, table de chaînes partagées, relations. Une centaine de lignes contre plusieurs centaines de kilooctets de dépendance. On ne peut pas écrire ça sans avoir lu la spécification du format.

06Le CSV aussi mérite du soin

Séparateur point-virgule et marqueur d'ordre d'octets en tête : sans lui, un tableur en configuration française ouvre le fichier en écrasant tous les accents. C'est un détail d'une ligne qui fait la différence entre un export utilisable et un export que l'utilisateur va corriger à la main.

07Compatible deux moteurs, sans processus de fond

L'extension fonctionne à l'identique sur les navigateurs à base Chromium et sur Firefox, sans service worker — la partie du modèle d'extension qui diverge le plus entre les deux. Moins de surface, moins de cas particuliers, et un comportement identique partout.

Ce que j’en retiens

Prévoir la casse

Tout code qui lit une page qu'il ne contrôle pas est en sursis. La question n'est pas si ça cassera, mais ce qui se passera le jour où ça cassera.

La réponse par défaut — « on corrigera quand on s'en apercevra » — est mauvaise, parce qu'on ne s'en aperçoit pas : un export vide ressemble à une publication sans réactions. La réponse ici est un test de référence adossé à une vérité terrain, un répertoire de stratégies, et un verdict qui distingue « je me suis adapté » de « le code doit évoluer ».

Stack

Extension

  • Manifest V3
  • JavaScript natif
  • declarativeNetRequest
  • Chromium & Firefox

Écrit à la main

  • Conteneur ZIP
  • CRC32
  • OOXML / XLSX
  • CSV avec BOM

Fiabilité

  • Test de référence
  • Vérité terrain figée
  • Répertoire de stratégies
  • Réécriture des règles