Comment être notifié du retour en stock d'un produit ?
La plupart des sites de commerce en ligne offrent la possibilité de s’abonner par courriel pour être informé de la disponibilité du produit, c’est la solution la plus usuelle.
Néanmoins, je ne trouve pas d’information sur le fonctionnement de ces notifications et suivant les commerçants cela peut changer.
Est-ce que la notification est envoyée dès que le stock est mis à jour ? Apparemment non, car dans mon cas je n’ai jamais rien reçu !
Ou alors, est-ce que la notification est envoyée une fois par jour et seulement s’il y a du stock disponible. Peut-être mais alors que se passe t-il si le stock est écoulé en seulement quelques heures ?
De plus, recevoir une notification par courriel n’est pas un usage des plus adapté pour moi, je préfère recevoir un message par SMS.
C’est pour ces raisons que je vais travailler sur la mise en place de ma propre solution.
1. Récupérer la valeur du stock
Je me rends sur la page du produit, je clique sur “Sélectionnez une taille”, cela affiche une liste déroulante. Chaque taille à son propre stock.
Pour afficher la ligne de code HTML qui contient la valeur du stock, je passe par l’outil inspecteur de Firefox.
Afin de vérifier si la valeur du stock est affiché au moment du chargement de la page ou au moment du chargement de la liste déroulante, je lance la commande suivante :
$ (curl https://www.decathlon.fr/p/maillot-manches-courtes-vtt-st-100-homme/_/R-p-301154?mc=8517601&c=NOIR && echo "") | grep -F '<span class="low stock" aria-hidden="true">4 </span>'
La commande ne retourne rien, ce qui confirme la deuxième hypothèse : la valeur du stock est affiché au moment du chargement de la liste déroulante. Ça complique les choses : je ne peux pas récupérer avec un curl simplement le stock en parsant la page html brut.
Maintenant que j’ai inspecté la page HTML, j’inspecte toutes les requêtes réseaux avec l’outil moniteur réseau de Firefox.
Ici non plus, je ne vois rien de pertinant.
Jusqu’à présent j’ai fait mes recherches sur le site français, je teste alors d’autres extensions tel que .com
et .co.uk
Je fais les mêmes recherches sur les autres sites, et en effet, sur le site anglais en .co.uk
je trouve une requête qui retourne une réponse au format JSON. La requête est appellée au moment où je sélectionne une taille.
Ce commerçant à des sites web différents suivant les pays.
On peut voir sur la capture d’écran ci-dessous, dans l’encadré rouge, une requête avec la clé skuIds
, dont les valeus correspondent à un identifiant unique d’un produit.
SKU signifie Stock Keeping Unit 1.
Les identifiants sont-ils différents par pays ou est-ce le même pour tous?
Pour vérifier si l’identifiant du produit existe aussi sur le site français, je lance un grep pour voir si je retrouve le même identifiant. Et c’est bon j’ai une correspondance.
Puisque j’ai vérifié que le skuid
est unique, je remplace .co.uk
par .fr
et en
par fr
, comme je m’en doutais j’obtiens le même résultat que j’ai trouvé sur le site anglais.
$ curl -s https://www.decathlon.fr/fr/ajax/nfs/stocks/online?skuIds=2501406
{"2501406":{"stockOnline":4}}
2. Le programme
Pour le programme, je crée un script bash :
notify.sh
#!/bin/bash
stockOnline=$(curl -s "https://www.decathlon.co.uk/en/ajax/nfs/stocks/online?skuIds=2606856" | jq .\"2606856\".stockOnline)
if (( $stockOnline > 0 )); then
curl "https://smsapi.free-mobile.fr/sendmsg?user=***&pass=***&msg=${stockOnline}"
else
exit 0
fi
J’utilise curl
pour récupérer le JSON et ensuite je parse le résultat avec jq
, cela me permet d’extraire le nombre de produit en stock.
Dès que la valeur du stock est supérieur à 0, j’exécute une requête à l’api de Free. Cela me permet de m’envoyer un message par SMS.
Le script est hebergé sur mon serveur.
3. Automatiser l’exécution du programme
J’ai découvert récemment l’outil systemd timers comme alternative au cron jobs. Je profite de ce projet pour apprendre à l’utiliser.
A la différence de cron, deux fichiers sont nécessaires :
- un fichier
service
écrivant :quoi faire
- un fichier
timer
décrivant :quand le faire
.
Le service :
/etc/systemd/system/notify.service
[Unit]
Description=Check stock
After=network.target
[Service]
Type=oneshot
ExecStart=/notify.sh
Le timer :
/etc/systemd/system/notify.timer
[Unit]
Description=Run notification job
[Timer]
OnCalendar=*-*-* 08..18:0/10:00
RandomizedDelaySec=5m
[Install]
WantedBy=timers.target
-
Relancer pour que le système prenne en compte les changements :
systemctl daemon-reload
-
Vérifier la validité des fichiers systemd :
systemd-analyze verify notify.service systemd-analyze verify notify.timer
Si la commande ne renvoie rien, c’est que c’est bon ! Les fichiers sont valides.
-
Activer le timer et le service au démarrage :
systemctl enable notify.timer systemctl start notify.timer
-
Pour afficher une vue claire et détaillé de la liste des timer il y a la commande suivant :
$ systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES 13:00:45 7min left 12:49:15 4min ago notify.timer notify.service $ date 12:53:08
4. Résultat
Finalement, 2 mois plus tard, un vendredi après-midi, j’ai eu la belle surprise de recevoir un message sur mon téléphone portable !
D’après la date de réception des messages, le stock est parti très vite, en moins d’une heure.
La réalisation de ce projet a été intéressante, j’ai bien aimé mener l’enquêté et cela m’a finalement bien rendu service.