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.

stock-notification-4-fr.png

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.

stock-notification-1.png

Pour afficher la ligne de code HTML qui contient la valeur du stock, je passe par l’outil inspecteur de Firefox.

stock-notification-2.png

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.

stock-notification-3.png

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
  1. Relancer pour que le système prenne en compte les changements :

     systemctl daemon-reload
    
  2. 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.

  1. Activer le timer et le service au démarrage :

     systemctl enable notify.timer
     systemctl start  notify.timer
    
  2. 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.

screenshot-stock-notification.png

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.