Ce projet a pour but d'automatiser et simplifier les réservations via Gymlib à l'UCPA, en minimisant les étapes manuelles.
Voici les différentes étapes pour pouvoir préparer correctement sa venue :
Sur ce schéma, on peut voir des tâches sans valeur ajoutée comme remplir le formulaire de contremarque et les deux temps d'attentes de validation.
Pour ces différentes raisons, j'ai automatisé les étapes facilement automatisables jusqu'à la réservation et après la réservation. Ce qui me permet d'avoir juste à faire une demande de code sur Gymlib, et choisir mon créneau horaire sur le site de l'UCPA. L'après-réservation est transparente pour moi, car je n'ai rien à faire pour avoir les réservations dans mon calendrier, et j'ai le QRCode sous la main à mon arrivée.
Dans le code, les différentes étapes sont lancées par un CRON et sont découpées de cette manière :
Le code analyse les e-mails reçus en provenance de Gymlib grâce au paquet imapflow
et récupère le code de contremarque dans le contenu dans le mail préalablement parsé par mailparser
.
Le formulaire ayant un token CSRF, le plus rapide à mettre en place a été de faire remplir le formulaire en utilisant Puppeteer,
presque tous les champs du formulaire peuvent être remplis dynamiquement grâce à la variable d'environnement : FORM_RESPONSE
.
D'ailleurs, en phase de tests, vous pouvez désactiver l'envoi du formulaire grâce à la variable d'environnement FORM_SUBMIT_ENABLED=false
.
3. Recevoir une notification dès que l'UCPA a validé les informations avec des créneaux arrangeants qui sont disponibles
Même principe que pour la première étape, le code détecte un e-mail en provenance de l'UCPA pour valider la contremarque et dire que l'e-billet est disponible sur votre espace personnel. Ensuite, le code cherche les créneaux qui vous arrangent, pour cela, il se base sur la variable d'environnement :
TIME_SLOTS_PREFERENCES='{
"sun": [
"17h00",
],
"mon": [
"19h00",
"20h00"
],
}'
Cette variable d'environnement n'a pas besoin d'avoir tous les jours de la semaine renseignée.
Tous les créneaux réservés sont ajoutés à un calendrier en utilisant la librairie ical-generator
.
Le calendrier est un lien auquel on s'abonne, il est disponible sous l'url /reservations/calendar/${CALENDAR_ID}
,
où CALENDAR_ID
correspond à ce qu'il y a dans la variable d'environnement.
La génération du pass est gérée par la librairie passkit-generator
, il faut avoir un compte Apple Developer pour générer des pass.
Les prérequis sont :
- Avoir un compte Apple Developer
- Générer tous les certificats nécessaires aux pass et les avoir mis dans le dossier
certs
- Fournir les variables d'environnement nécessaire pour le pass et sa mise à jour
CERTIFICATES_SIGNER_KEY_PASSPHRASE=
APPLE_PASS_TYPE_IDENTIFIER=
APPLE_PASS_TEAM_IDENTIFIER=
NOTIFICATIONS_APPLE_URL=
Pour le pass, il faut d'abord en créer un. Pour ça, nous devons récupérer un token :
ACCESS_TOKEN=$(node --input-type=module --eval "console.log(await (await import('./src/infrastructure/jsonWebTokenAdapter.js')).jsonWebTokenAdapter.generateToken({}));")
Après avoir obtenu notre token, nous pouvons faire un curl pour créer et obtenir le pass :
curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" http://localhost:4000/pass -o "ucpa.pkpass"
- Me notifier de créneaux qui m'arrangent qui se libèrent
- Copier le sample.env dans un fichier .env
cp sample.env .env
- Renseigner les différentes variables d'environnement
- Installer les paquets
npm ci
- Lancer la base de données
docker compose up -d
- Créer la base de données
npm run db:prepare
- Lancer le projet
npm start
Voilà votre environnement est prêt !
Les contributions sont les bienvenues ! Que ce soit pour corriger des bugs, ajouter de nouvelles fonctionnalités ou améliorer la documentation, n'hésitez pas à ouvrir une issue ou à proposer une pull request.