Comment j'ai eu un rdv médical grâce à une tâche CRON
anecdote de rétro-ingénieurie Web
Un peu de contexte
Cet article est une anecdote personnelle d'un membre de CLUB1. Dans celui-ci, Vincent nous présente un usage du serveur un peu moins connu que l'hébergement de sites Web.
Désert médical
Dans le coin du Lot où j'habite, ya pas foule au niveau des médecins généralistes. On peut même dire que j'habite dans un désert médical. J'ai voulu prendre un rdv, sauf que tout était bouché. L'un des seul cabinet de Cahors qui accueille des nouveau·elles patient·es s'appelle : Agir pour Mieux Vivre et la seule façon de prendre RDV est sur la plateforme en ligne https://www.maiia.com/ (qui semble assez équivalente à Doctolib).

La plateforme annonce des RDV dispo dans 8 jours, sauf que, je n'ai pas le droit de réserver de première consultation dans des délais supérieurs à 72h (3 jours). Ça semble un paramètre réglable du site, ce qui veut dire que c'est un parti pris du cabinet médical.
J'aurais pu me dire que c'était une situation exceptionnelle, sauf que ma coloc m'avait prévenu qu'elle n’avait jamais réussi à prendre rendez-vous quand elle était allée voir sur le site.
Bon eh bien il ne me reste plus qu'à retourner consulter cette page plusieurs fois par jour dans l'espoir de tomber sur une annulation récente.
Ou alors....
Faire qu'un programme informatique consulte la page pour moi !
En fait ça m'a rappelé la période du COVID, pendant laquelle des scripts avaient émergés pour "choper les RDV dès qu'ils sont dispo", par exemple avec : DoctoShotGun
Bon là ça va méga loin car le programme s'occupe même de prendre le RDV.
De mon côté je me suis dit que si j'arrivai à faire une sorte d'alerte, ça serait déjà pas mal.
frappe chirurgicale
Je commence donc à essayer de comprendre le fonctionnement du site pour voir si il est possible de "scrapper" les infos qui m'intéressent.
Je suis un peu dérouté car je ne suis pas très familier de ce genre de Web-app où tout est chargé en cours de route via du Javascript. J'ai donc bien pataugé au début.
Par exemple j'ai perdu 5 minutes à bugger sur le script suivant :
<script data-cfasync="false" src="/tarteaucitron/tarteaucitron.js"></script>
tarteaucitron ?? Mais trop chelou d'avoir appelé un de leur scripts comme ça !!! 😵💫 je me suis demandé si c'était un nom généré aléatoirement pour camoufler leur fonctionnement. Bon, finalement il s'avère que c'était juste le code de la bannière de cookie 😑
En fait, plutôt que regarder le code, j'ai compris qu'avec ce genre de site, il valait mieux regarder les requêtes que celui-ci effectue. Et là j'ai trouvé en deux secondes !

On voit (en bas à gauche) que la page Web effectue 118 requêtes vers leur serveur et d'autres lorsque je demande d'afficher la page.
🔎 Pour info, on peut voir ça dans Firefox en ouvrant l'inspecteur (touche F12 ou la combinaison Ctrl Maj I), puis en sélectionnant l'onglet "⇅ réseau". En rechargeant la page, on voit alors tout les aller-retours entre notre ordinateur et le(s) serveur(s).
J'avais déjà vu le mot "availability" en auscultant un peu le HTML, j'ai donc filtré les requêtes utilisant ce mot. Et ça n'a pas loupé ! Je découvre une requête effectuée vers l'URL suivante :
https://www.maiia.com/api/pat-public/availability-closests?centerId=64abbc120870ca46e93017b2&from=2025-10-31T16%3A39%3A00.000Z&limit=200&page=0
availability-closests ? Tiens tiens... 🕵️
Et c'est bingo, car derrière cette URL, on obtient des données structurées sous forme d'un JSON :
{
"availabilityCount": 1,
"closestPhysicalAvailability": {
"id": "6904d42d025862180fb450c0",
"practitionerId": "64abbc120870ca46e93017b7",
"centerId": "64abbc120870ca46e93017b2",
"timeSlotId": "68216a1c285d2850f0ca1edd",
"weekId": "68216a1c285d2850f0ca1eb3",
"weekTemplateCycleId": "64ad0f8ca12ada5dd802c793",
"consultationReasonId": "66e00827bd69f40b1a87387c",
"creationDate": "2025-10-31T15:22:21.860Z",
"updateDate": "2025-10-31T15:22:21.860Z",
"startDateTime": "2025-11-05T07:30:00.000Z",
"endDateTime": "2025-11-05T07:45:00.000Z",
"percentageNewPatient": 0.0,
"usedResource": []
},
"firstAvailabilityStartDateTime": "2025-11-05T07:30:00.000Z",
"firstPhysicalStartDateTime": "2025-11-05T07:30:00.000Z"
}
Alors il y a toute une section closestPhysicalAvailability qui ne m'intéresse pas trop car c'est en fait des suggestions d'autres endroit où consulter à proximité. Mais en bas, on peut trouver firstAvailabilityStartDateTime et firstPhysicalStartDateTime. J'imagine que le premier intègre les RDV en visio, ce qui ne m'intéresse pas.
En tout cas, ça fait plaisir de voir une belle chaîne de caractères représentant une date ! Et surtout avec une une précision de l'ordre du millième de seconde 🤪.
2025-11-05T07:30:00.000Z
Tout ça s'avère être de bonne augure quant à la faisabilité d'un petit logiciel qui vérifierait cette URL régulièrement en mesurant si la date fournie est dans moins de 72h.
Écriture d'un Scénario
J'avais déjà en tête les outils qui pourrait m'aider sur ce coup là. C'est une combinaison assez classique de programmes qu'on trouve souvent déjà installés avec Linux (l'Operating System installé sur le serveur CLUB1).
Je ne vais donc pas "coder" tout un logiciel, mais plutôt mettre un peu de glue entre des logiciels existants pour former un outil minimaliste. Dans le jargon informatique, on appelle ça "un script" (scénario). J'ai choisi d'appeler le mien apmv.sh.
Équipe de choc

Bon, j'ai vraiment fait une équipe cheaté, j'ai mis que des gros bangers de la ligne de commande. Matez moi cette équipe de fou :
curlva contacter le serveur grâce au bon vieux protocole HTTP 🚀jqarrive à extraire l'info importante du fichier formaté en JSON 📂datesait lire les dates et les convertir 📅crontabpermet de déclencher régulièrement une action ⌛️mailxenvoie un email vite fait bien fait ✉️
Chronique des titans
Attardons nous un peu sur le délicieux crontab. C'est ce qu'on appelle communément "les tâches CRON" (sûrement une ref à ce bon vieux Cronos le titan). C'est un outil qui, lorsqu'il est lancé sur un serveur, tourne constamment en arrière plan et va déclencher régulièrement des tâches. Une tâche ? C'est un peu tout ce qu'on voudra, il faut surtout retenir que CRON n'est qu'un déclencheur. Le seul truc qu'il va falloir régler c'est donc la fréquence du déclenchement. Et la façon de la définir est assez déroutante au premier abord :
* * * * * 'truc à faire'
Ceci ne signifie pas un hôtel 5 étoiles, mais "une fois par minute". Vous l'aviez sûrement deviné, mais je le dis quand même ; Chaque partie séparée par un espace signifie dans l'ordre : minute, heure, jour, mois et jour de la semaine.
Par exemple :
15 14 1 * *
Signifie "chaque premier du mois à 14h15" en langage CRON.
Heureusement, on peut se faire aider par ce guru qui traduit en langue de Shakespeare la noble langue de Cron.
Au final, pour mon projet, c'était pas très compliqué :
*/10 * * * * /home/vincent/scripts/apmv.sh
Autrement dit : "lance le script apmv.sh toute les dix minutes !"
Moi aussi je veux trop avoir une tâche CRON !!!
C'est sûrement ce que vous vous dites. Ce rêve n'est peut-être pas si lointain. Par exemple si vous avez un compte sur un serveur, que vous avez la possibilité et la détermination pour vous connecter en SSH et que le logiciel crontab est installé. Eh bien, vous pouvez !
Pour créer votre première tâche cronique, vous devez lancer la commande suivante :
crontab -e
On atterrit dans l'éditeur de fichier par défaut sur ce serveur. En bas du fichier, chaque ligne correspond à une tâche. Vous pouvez par exemple ajouter :
0 10 * * 4 echo '🗑️ ne pas oublier de sortir les poubelles ce soir !'
Normalement echo renvoie un message dans le terminal, mais ici, vu qu'il s'agit d'une cronerie, on va recevoir le message sur notre adresse perso. (Bon il faut que le serveur gère les emails aussi, c'est le cas de club1 par exemple)
Ça marche aussi pour les anniversaires :
0 0 1 12 * echo '🎂 souhaiter son anniversaire à Vincent'
Avec la tâche ci-dessus, on recevra un email chaque premier décembre à minuit (l'heure du crime). Mais tant qu'à faire, autant rendre le truc encore plus déshumanisé en l'automatisant au max (parce que c'est bien ça qu'on veut !) :
3 0 1 12 * echo 'Je te souhaite un très bon anniversaire ! (sincèrement)' | mailx -s '🎉 surprise...' -- vincent@club1.fr
Tadaaa ! Cette fois ci la tâche est directement d'envoyer un email à la personne dont c'est l'anniversaire (en l'occurence moi). Encore une fois on est libéré des vielles traditions sociales qui nous enchaînaient grâce à l'informatique ! Que va t'on pouvoir faire de tout le temps libre qu'on a acquis ? 🤔
(Vous noterez que j'ai mis la tâche CRON à 00h03 pour que ça fasse plus humain 😎)
curling de date
C'est bon ? tout le monde a sa tâche CRON ? On va pouvoir avancer sur notre shmilblik.
Dans mon cas, je n'avais pas envie de recevoir un email toute les 10 minutes m'indiquant la dispo des RDV. Mon script va d’abord vérifier la disponibilité avant de me prévenir par email. Sa première action est de contacter le serveur Maiia grâce à l'URL que j'ai identifé lors de mon enquête. Cette fois c'est le job de curl :
curl -s 'https://www.maiia.com/api/pat-public/availability-closests?centerId=64abbc120870ca46e93017b2&consultationReasonName=Soins%20non%20programm%C3%A9s%20%28acc%C3%A8s%20libre%29&consultationReasonType=PHYSICAL&from=2025-10-25T18%3A35%3A00.000Z&limit=200&page=0&specialityId=5e185ddfb5346d1863161b4b'
D'ailleurs vous pouvez lancer cette commande sur votre ordinateur si vous avez un terminal et curl d'installé.
Pour filtrer les infos qui nous intéressent, on envoie ça dans jq grâce à un tuyaux | ("pipe" en anglais). Puis rebelote, on envoie la sortie de jq dans date. Ça donne ça :
curl -s 'https://www.maiia.com/api...' | jq -r .firstAvailabilityStartDateTime | date -f -
Lorsque je lance cette commande, le message suivant s'affiche en retour. C'est en français car mon ordinateur est réglé dans cette langue.
mer. 05 nov. 2025 08:30:00 CET
Ce genre de plomberie informatique est une des façon les plus courante pour combiner des logiciels entre eux.
Éviter de spammer
Dans la version simple de mon programme, j'avais donc une vérification toute les 10 minutes de la disponibilité d'un RDV dans moins de 72h. À chaque fois que c'était vrai, je recevrai un email.
Si on chipote un peu, on peut y voir un petit soucis. Lorsque qu'un RDV est dispo longtemps je vais recevoir des emails en boucle jusqu'à ce qu'il soit pris. Par exemple si un·e client·e annule son rdv à une heure du mat', je risque de me réveiller et découvrir une bonne quarantaine d'emails. À vous de voir si c'est si terrible que ça.
Le fait est que j'avais prévu de rajouter les adresses emails de mes colocs au script : une responsabilité supplémentaire. J'ai donc fait en sorte que, lorsque la vérification donne une réponse positive, en plus d'envoyer un petit mail, un fichier vide est également créé à un endroit précis dans mon espace sur le serveur. Je rajoute ensuite une condition disant que : si le fameux fichier existe, on laisse tomber la vérification. Cela signifie qu'un email a déjà été envoyé, on évite ainsi au script de se répéter. Le fichier joue le rôle d'interrupteur ! Si je le supprime ça va ré-activer le programme et il fonctionnera jusqu'au prochain RDV trouvé.
Assemblage
Voici le fameux script combinant tout ce qui a été évoqué ci-dessus. J'ai ajouté des petits commentaires pour décrire les différentes parties. Ce sont les lignes qui commencent par un croisillon #.
#/bin/bash -e
# check la dispo des rdv sur le site Maiia
# si le fichier interrupteur existe, on arrête le script
if test -e /home/vincent/apmv-off
then
exit 0
fi
# récupération de la date du prochain RDV
avail=$(curl -s 'https://www.maiia.com/api/pat-public/availability-closests?centerId=64abbc120870ca46e93017b2&consultationReasonName=Soins%20non%20programm%C3%A9s%20%28acc%C3%A8s%20libre%29&consultationReasonType=PHYSICAL&from=2025-10-25T18%3A35%3A00.000Z&limit=200&page=0&specialityId=5e185ddfb5346d1863161b4b'| jq -r .firstAvailabilityStartDateTime | date +%s -f - )
in3days=$(date --date='72 hours' +%s)
# si la date de dispo est dans plus de trois jours, on arrête le script
if test $avail -gt $in3days
then
exit 0
fi
# envoi de l'email
echo 'go prendre un rdv\n<https://www.maiia.com/centre-de-sante/46000-cahors/centre-de-sante-polyvalent-apmv>' \
| mailx -s '🚀 rdv disponible chez Agir pour mieux vivre' -- vincent@club1.fr
# crée le fichier interupteur
touch /home/vincent/apmv-off
Oasis is good
Vendredi 31 octobre, 9h00, Pantin : le script apmv.sh détecte un créneau de disponible dans moins de 72h et déclenche l'envoi d'un email.

Quelques minutes plus tard, je consulte mon téléphone et check mes emails. En découvrant la nouvelle, je me précipite sur le site pour vérifier qu'il ne s'agit pas d'un faux positif. Heureusement le créneau est bien là ! Je n'ai qu'à cliquer dessus pour le réserver.
Tel un oasis dans le désert médical, grâce à ce script et aux vénérables logiciels à moins de cinq lettres, j'ai pu décrocher un rendez-vous chez le médecin ! 🎉
Est ce que ça résout la problématique du manque de personnel médical ? Pas du tout. Ça illustre par contre le pouvoir qu'apporte la connaissance des technologies qui nous entourent. Et c'est plutôt flippant que ça ne soit qu'entre les mains d'une élite d'informaticiens comme moi. Donc j'espère que ça pourra inspirer des personnes ou des groupes à s'approprier ces outils pour faire des trucs chouettes !
UNIX vibe
Dans ce projet, j'ai fortement tiré parti de ce qu'on appelle la philosophie UNIX :
Écrivez des programmes qui effectuent une seule chose et qui le font bien.
Écrivez des programmes qui collaborent.
Écrivez des programmes pour gérer des flux de texte [en pratique des flux d'octets], car c'est une interface universelle.
C'est une citation de Douglas McIlroy, l'inventeur des tuyaux UNIX. Les programmes qu'il évoque sont ceux que j'ai appelé "les membres de mon équipe". Ils ne font chacun qu'une chose limitée, mais combiné à d'autres, ont peut alors réaliser des actions complexes et puissantes.
C'est une façon de voir les outils informatiques qui diffère totalement de la vision dominante actuelle. On connaît mieux les logiciels monolithique qui sont complexes et riches en fonctionnalités. Par exemple Microsoft Word, Excel, Photoshop ou même Firefox.
Il y a des différences dans la courbe d'apprentissage ainsi qu'au niveau de l'agentivité induite par ces deux approches. Je dirais que les petits outils Unix sont au moins aussi complexes que les gros logiciels à apprendre. Mais une bascule opère lorsque l'on veut faire quelque-chose qui est légèrement en dehors des possibilités permises par un outil monolithique. À ce moment là, on est un peu coincé et il faut chercher un autre programme qui fera exactement ce dont on a besoin. Et si on n'en trouve pas, abandonner, car c'est trop complexe de le coder soi-même. À l'inverse, si l'on maîtrise déjà quelques petits outils, on n'aura souvent qu'à chercher un module manquant pour le combiner à ceux que l'on connaît déjà et arriver à ses fins.
Bon c'est une version un peu idéaliste, mais qui permet de saisir la différence fondamentale. À titre personnel j'étais très content de découvrir une autre façon d'utiliser les ordinateurs. En composant à chaque fois de petits scénarios (les scripts) sur mesure, on passe du statut d'utilisateur à celui de compositeur·ice. Ça a son importance car les outils que nous utilisons nous conditionnent dans une certaine mesure.
Cette approche n'est pas nouvelle car UNIX est un système d'exploitation (OS) déchu datant des années 70 ! Il servira cependant d'inspiration à Linux, d'où la consonance.
Tools shape practices / Les outils influent les pratiques
Pour aller plus loin
Pour apprendre progressivement à utiliser ces petits outils, j'ai entamé mon propre mémo accessible en ligne. Ça me permet de retrouver plus vite mes réglages favoris pour chaque commande.
Et voici quelques pistes à explorer pour creuser le sujet :
The map is the territory
The map is the territory est un fanzine écrit par Zach AKA CoolGuy qui présente la pratique de la ligne de commande d'une façon spirituelle ! C'est en anglais car ce cool guy est australien. Mais on a justement entrepris de le traduire en français avec Nouckey !
Projet de traduction sur le forum Club1
Pas encore de lien sûr car la traduction n'est pas finie.
Le blog d'Arthur Pons
http://arthur.bebou.netlib.re/
J'ai rencontré Arthur à Strasbourg, il est membre du collectif Katzele qui explore l'usage convivial de l'informatique. Son blog personnel regorge de réflexions sur l'usage de l'ordinateur proche de celui qui est évoqué dans cet article.
Serveur tildes
Les serveur tildes sont une famille de serveurs qui permettent à leurs membres d'y accéder via SSH, leur permettant ainsi de construire des scripts. Le plus connu étant le https://tilde.club/. On peut dire que club1 est une sorte de serveur tilde.