mardi 21 janvier 2014

Script qui scanne une page web tous les x minutes et envoie une notification

En langage abscon: wget / if true then notification / loop / cron

Tu aimerais t'inscrire sur le site de grtgyh.com pour être le premier à recevoir le truc top que tout le monde va t'envier, et qui va t'offrir le respect  / l'amour éternel. Mais petit problème, les demandes sont nombreuses, et les offres rares, ils ouvrent leurs inscriptions une fois tous les Random(x) jours, et dans les 5 minutes, toutes les inscriptions sont raflées, et il ne reste rien pour toi, pauvre choux !

J'ai la solution à tes malheurs, un script qui va scanner le site web en question toutes les minutes et t'avertir sur ton téléphone android dès que les inscriptions seront ouvertes !

Prérequis :
  • Avoir une machine linux qui tourne 24h/24. (Un Raspberry Pi par exemple?)
  • Sur cette machine avoir installé le package curl (sudo apt-get install curl)
  • Avoir créé un compte sur le site web Notify my android + avoir installé l'application sur ton téléphone avec les infos de ton compte nouvellement créé.

Tu vas aller sur le site de notify my android, et puis tu vas créer une clef (My Account > Manage API keys > Generate new key) et tu la retiens dans ta petite tête.

Tu télécharges le script nma.sh, tu écris la valeur de ton API key dans la variable APIKey (15e ligne).

Et puis tu peux faire un test pour voir si tu reçois bien les notifivations sur ton téléphone:
./nma.sh check_tram_events free 2014-01-22 1

Et on en vient à mon exemple: Je voudrais organiser un repas en amoureux avec mon amoureuse dans un tram à Bruxelles. 

Mais les réservations sont toutes complètes jusque le 1er mars (dernière date disponible). Et ils disent qu'il faut revenir régulièrement pour voir si de nouvelles dates ne sont pas disponibles. Bon, alors, on va sortir notre arme fatale!

Dans firebug (F12 dans le navigateur), je peux voir que dans le calendrier quand je clique sur une date, il fait un appel AJAX qui affiche le détail pour la journée.

On peut voir que le calendrier (quand on clique sur une date), fait appel à http:// ticketing . visit brussels . be / index.php/fr/order/dispos-by-date et qu'il donne en paramètre en POST la date choisie, ici : date = 2014-03-01

Donc, si on veut avoir le résultat de cet appel en console, on écrirait :
wget -qO- --post-data="date=2014-03-01" http:// ticketing . visit brussels . be / index.php/fr/order/dispos-by-date

On va faire une boucle sur cette commande pour les prochaines dates avenir, s'il y a un résultat (que la page n'est pas vide), on notifie mon téléphone. On va créer le script notice_for_a_free_tram.sh
#!/bin/sh
LOG_FILE=/tmp/tram-events-checking.txt
NOW=$(date +"%d-%m-%Y %k:%M")
FILE_FOUND=/tmp/tramfound
if [ !  -f "$FILE_FOUND" ];
        then
        for datereservation in 2014-03-08, 2014-03-09
        do
                RESULT_PAGE=$(wget -qO- --post-data="date=$datereservation" http://ticket.com | grep -B3 -A5 "2 personnes")
                if [ -n "$RESULT_PAGE" ];
                        then
                                ./nma.sh check_tram_events free $datereservation 1
                                echo "$NOW: $datereservation is AVAILABLE!!!" >> $LOG_FILE
                                echo "found" > $FILE_FOUND
                                exit 1
                        else
                                echo "$NOW: $datereservation is unavailable"  >> $LOG_FILE
                                if [ -f "$FILE_FOUND" ];
                                        then
                                        rm $FILE_FOUND
                                fi
                fi
        done
fi
exit 1
Il ne reste plus qu'à ajouter une tâche cron associée à ce script:
crontab -e
*/5 * * * * /home/user/check_website/check_tram_events.sh

Et pour être rapide lorsque la fameuse notification arrivera, à chaque lever de soleil, faites un étirement de doigt et remémorez-vous votre numéro de carte de crédit. Amen.

Aucun commentaire:

Enregistrer un commentaire