- Pour éviter que les pizzas au point de ravitaillement ne soient épuisées lors de la Gravel Worlds Long Voyage dans le Nebraska, j’ai créé une automatisation qui précommande une pizza Casey's à partir de la position GPS du vélo
- L’architecture repose sur une géofence AWS Location qui détecte la sortie du traceur GPS, puis sur une Lambda qui passe la commande en ligne en fonction de l’ETA au prochain arrêt
- Casey's n’ayant pas d’API de commande publique, j’ai utilisé Playwright pour faire du screen scraping du site web basé sur React, et configuré la réception du résultat de la commande via des notifications push sur iPhone et Apple Watch
- Pendant la vraie course, une notification de commande réussie est bien arrivée, mais le magasin n’avait aucune trace de la commande, révélant un faux positif de l’automatisation de navigateur dans le cloud
- Ensuite, après avoir modifié le système pour conserver dans S3 une vidéo du comportement du navigateur, une commande de test a réussi, mais il reste difficile d’être certain de la fiabilité dans l’environnement Lambda avec de simples tests locaux
Pourquoi je voulais sécuriser une pizza pendant la course
- J’ai participé à la course cycliste Gravel Worlds Long Voyage dans le Nebraska, pendant la saison des récoltes dans le Midwest
- L’année précédente, les coureurs les plus rapides étaient arrivés les premiers et avaient pris toutes les pizzas Casey's du point de ravitaillement ; quand je suis arrivé, il n’en restait plus
- Cette année, l’objectif était de précommander une pizza fraîche pour qu’elle soit prête au moment de mon arrêt
- Sur mon traceur GPS de vélo serverless existant, je voulais ajouter un mécanisme qui lance un script de commande lorsqu’il quitte une géofence donnée
Comment la commande était déclenchée avec le GPS et Lambda
- La conception globale repose sur une géofence d’AWS Location qui surveille le traceur GPS
- Lorsque le traceur quitte la géofence, elle déclenche une fonction Lambda
- Lambda calcule l’ETA jusqu’au prochain point d’arrêt
- La pizza Casey's est commandée en fonction de l’heure calculée
- Casey's ne proposant pas d’API publique pour les commandes en ligne, j’ai opté pour du screen scraping du site web
- Le site de Casey's était une application React complexe rendue côté client
- J’ai utilisé Playwright plutôt qu’un scraper classique
- Faire fonctionner Playwright dans Lambda était assez délicat pour mériter un article à part
- Pour vérifier l’état de la commande, j’ai configuré l’envoi de notifications push sur mon téléphone et ma montre en cas de succès ou d’échec
- Faire fonctionner Web Push sur des appareils iOS aurait aussi pu faire l’objet d’un article séparé
Un résultat sur le terrain différent de la notification de succès
- La géofence servant à déclencher la commande était placée autour du point des 180 miles de la course
- La pizza devait être récupérée au point des 200 miles
- Quand j’ai quitté la géofence, une notification push de succès de la commande de pizza est arrivée sur ma montre
- À mon arrivée au point d’arrêt, il n’y avait aucune commande au comptoir, et le magasin n’avait aucune trace de commande
- Après vérification du compte, aucune commande réelle n’avait été créée : il s’agissait d’un faux positif où seule la notification de succès avait été générée
- Sur place, il restait quelques parts de pizza préparées à l’avance, que j’ai achetées
- Jusqu’à la fin de la course de 300 miles, je n’ai pas cessé de me demander ce qui avait mal tourné dans la fonction Lambda
La capture vidéo a laissé des indices là où les logs n’en donnaient pas
- Après la course, j’ai consulté les logs, mais ils ne contenaient aucune information expliquant la cause de l’échec
- D’après les logs, tout semblait avoir réussi silencieusement, ce qui laissait peu d’indices pour déboguer
- Quelques jours plus tard, j’ai modifié Lambda pour capturer en vidéo le comportement du navigateur et l’uploader dans un bucket S3
- Avec ce comportement modifié, une commande de test a réellement réussi, et j’ai pu récupérer correctement une pizza hawaïenne
- La cause exacte n’a pas été confirmée
- Il est possible que Lambda ait terminé le traitement dès l’exécution du dernier
form.submit()dans le navigateur Playwright intégré - Il est possible que le site de commande en ligne n’ait pas pu vérifier la réception de la réponse de succès par le navigateur, et n’ait donc pas finalisé la commande
- Le temps supplémentaire nécessaire au traitement et à l’upload de la vidéo a peut-être donné au navigateur assez de temps pour se nettoyer correctement
- Il est possible que Lambda ait terminé le traitement dès l’exécution du dernier
Ce que je changerais si je le refaisais
- Faire du screen scraping fiable d’une application client React via un navigateur dans le cloud est possible, mais très délicat
- Si je le refaisais, j’envisagerais de rétroconcevoir l’app native de Casey's afin de déclencher directement son API interne
- Il faut un bon workflow pour simuler les comportements géospatiaux
- Au début, j’ai créé des géofences autour de chez moi pour tester
- Aller réellement marcher dehors à 23 h pour faire des tests devient vite pénible
- Il ne faut pas réduire les tests en environnement réel
- Avant la course, j’ai surtout testé la fonction en l’exécutant sur ma station de travail locale
- Les succès en local m’ont donné une fausse certitude que cela fonctionnerait correctement aussi dans l’environnement Lambda
- Si l’idée que Casey's soit à court de pizza vous inquiète, une autre solution consiste à laisser plus de 30 minutes d’écart avec le groupe de tête, afin de donner au magasin le temps de préparer de nouvelles parts de pizza
- Le code est publié sur GitHub : https://github.com/mattdsteele/spot-tracker-tracker/…
1 commentaires
Commentaires sur Hacker News
Colin peut aussi préparer la pizza pendant qu’il la livre : https://youtu.be/YjyJRTM0knE?si=fes2lbRntUlciPSH
Le défaut fatal de ce plan apparemment bien ficelé, c’est que quand le camion passait sur les irrégularités de la route, les pizzas s’envolaient et perdaient toutes leurs garnitures : https://gizmodo.com/zume-softbank-ai-pizza-delivery-stellar-...
Cette vidéo m’a fait rire plus fort que tout ce que j’ai vu sur YouTube cette année.
Je n’arrive toujours pas à trancher, et bizarrement ça rend ses vidéos difficiles à regarder. Bien sûr, il ne publierait sans doute pas une vidéo où quelque chose tourne vraiment très mal.
J’ai regardé pendant deux heures et demie une vidéo où ce type creuse un tunnel entre sa maison et son hangar ; c’est une chaîne vraiment divertissante.
Excellent. On dirait une interprétation XXIe siècle de pizzatool.
https://donhopkins.medium.com/the-story-of-sun-microsystems-...
À noter que la pizzeria Waypoint Pizza, à Tiburon, peut aussi livrer sur l’eau dans la baie de San Francisco si on le demande gentiment. C’est assez pratique lors de courses de voile un peu moins sérieuses et atypiques, comme la Three Bridge Fiasco.
Dean Karnazes a fait quelque chose de similaire, sans technologie, lors d’une course d’ultra-running.
Apparemment, il courait en tenant une pizza roulée comme un burrito : https://gffmag.com/the-raw-endurance-of-ultramarathon-man-de...
Si c’est un site web en React, il y a de fortes chances qu’il existe une API directement utilisable.
Il faudra peut-être se connecter pour obtenir un token, mais ce serait beaucoup plus robuste.
C’est bien moins cher et bien plus robuste ; est-ce que quelque chose m’échappe ?
J’ai vraiment beaucoup apprécié cet article.
Un problème technique amusant, de la pizza, le fait que ça m’ait fait chercher ce que signifie « s-tier », une prémisse déjà drôle en soi avec encore plus d’humour par-dessus, puis le mea culpa final et l’hypothèse sur la cause du bug : il y avait beaucoup de bons éléments. Cette théorie semble plausible, même si ce n’est pas certain.
Ça m’a donné l’impression de concentrer tout ce qu’il y a de mauvais dans la technologie moderne.
Franchement, c’est plutôt cool. Je me demande si on pourrait faire quelque chose de similaire avec des services comme Deliveroo.
À une date X donnée, si certaines conditions sont réunies — par exemple quand on fait des heures sup — passer une commande Y prédéfinie quand on est à environ Z distance de chez soi ; ça semble faisable.
Je ne vois pas pourquoi ils ne faciliteraient pas l’intégration des commandes et paiements de repas dans des bricolages à la IFTTT.
J’ai de bons souvenirs d’avoir grandi avec les pizzas de Casey’s.
J’en prends à chaque fois que je retourne dans le Midwest ; je ne saurais pas dire exactement pourquoi, mais elles ont un charme bien à elles.
Ah, donc au final ça n’a pas fonctionné.
S’en rendre compte au 200e mile a dû être assez dur.
Logiciel, vélo et pizza : ce sont des choses que j’aime dans la vie.
J’ai vraiment pris plaisir à lire ce projet et cet article, et ça m’a donné des idées similaires.
À sa place, j’aurais probablement appelé en mains libres, ou demandé à un ami d’appeler, déclenché par un message.
Et il parle sans cesse de « livraison », mais en réalité ce n’est pas plutôt un retrait sur place ?