Lifehack - Notification des horaires par SMS
Cela fait longtemps que je n'ai pas parlé de technique de Lifehacking. Dans cet article, je vais vous présenter une utilité que j'ai trouvé aux notifications par SMS disponible chez Freemobile. En partant le matin, je fais un trajet bus + train + marche à pied. En revenant le soir, je le trajet inverse marche à pied + train + bus. Ces trajets sont quasiment à heures fixes tous les jours. J'ai donc créer un script mis en tâche planifiée/crontab dans une machine qui tourne 24h sur 24h et qui est reliée à Internet. Ce script va récupérer les horaires de bus et RER et me les envoie par SMS sur mon trajet. Ainsi je sais si je dois me hâter ou ralentir, quel train ou bus j'aurais pour mon déplacement. Je peux réagir à des retards/suppressions qui viendraient perturber un rythme journalier bien rôdé.
Pourquoi par SMS et ne pas aller consulter les sites 3g ? Parce que je n'ai pas forcément la 3G sur le chemin, qu'il faut lancer un navigateur, ouvrir le raccourci/favori, que le site s'affiche... Le SMS lui arrive tout seul, à une heure fixe.
Les services fournis par les transporteurs
Pour une ligne RATP de bus donnée, on a une version WAP (plus légère du site et qui va à l'essentiel) de la forme :
http://wap.ratp.fr/siv/schedule?service=next&reseau=bus&lineid=BXXX&stationid=XXX_XXX
Cette URL, avec l'ID du bus et le numéro de station donne les horaires de prochain passage.
http://www.transilien.mobi/train/result?idOrigin=XXX&idDest=YYY
Pour la SNCF et les RER transilien, c'est cette URL avec la gare de départ et la gare d'arrivée, dont le code est sur 3 lettres.
Une fois que l'on a les bons liens d'intérêts (pour les différents trajets), on peut passer à la suite.
Le script en crontab
J'ai donc crée un un script Python (basé sur beautifulsoup), qui récupère la page, parse le HTML, en extrait un texte important (heure de passage, direction...) et formate un SMS qu'il envoie via l'API de notifications par SMS de Freemobile.
# -*-coding:Utf-8 -*
import urllib
import sys
import bs4 as BeautifulSoup
import re
from urllib.request import urlopen
from urllib.parse import quote
#------------------------------------------------------------
# En fonction de l'argument, on a les différentes URL
#------------------------------------------------------------
# A changer : remplacer XXX et YYY par le code des stations de départ/arrivée de transilien
#pageFile = urlopen("http://www.transilien.mobi/train/result?idOrigin=XXX&idDest=YYY")
# Cas d'une page d'horaires de BUS Ratp
#pageFile = urlopen("http://wap.ratp.fr/siv/schedule?service=next&reseau=bus&lineid=BXXX&stationid=XXX_XXX_XXX")
#--------------------------------------------
# Partie pour le parsing de la page SNCF
#--------------------------------------------
def parsingSNCF(pageHtml):
soup = BeautifulSoup.BeautifulSoup(pageHtml)
gDepart = soup.find_all('div',class_='GareDepart')
gArrivee = soup.find_all('div',class_='GareArrivee')
sAll = soup.find_all('li', class_=re.compile('resultat_gare*'))
nomGareDepart=((gDepart[0].find_all('a',class_='bluefont'))[0].get_text()).replace(" ","").strip()
nomGareArrivee=((gArrivee[0].find_all('a',class_='bluefont'))[0].get_text()).replace(" ","").strip()
trajet=nomGareDepart+' - '+nomGareArrivee+'\\n'
texte=''
texte=texte+trajet
#print (sAll)
i=0
for var in sAll:
heure = var.find_all('span',class_='heure_train')
valHeure = heure[0].get_text()
destination = var.find_all('span',class_='garearrivee')
valdestination = destination[0].get_text()
nomTrain = var.find_all('span',class_='train_mission')
valNomTrain = nomTrain[0].get_text().replace("(","").replace(")","")
texte=texte+valHeure+' '+valNomTrain+'\\n'
i += 1
if i>=4:
break
return texte
#Fin parsing page SNCF
#--------------------------------------------
# Partie pour le parsing de la page RATP
#--------------------------------------------
def parsingRATP(maPageHtml):
soup = BeautifulSoup.BeautifulSoup(maPageHtml)
texte=''
sDirection = soup.find_all('span',class_='direction')
for sDir in sDirection:
print(sDir.get_text())
sBWhite = soup.find_all('tbody')
for var in sBWhite:
sTh= var.find_all('td')
for th in sTh:
print(th.get_text())
return texte
#--------------------------------------
# Lecture de la page HTML
#--------------------------------------
#Si on parse une page SNCF
pageHtml = pageFile.read()
texte = parsingSNCF(pageHtml)
pageFile.close()
#Si on veut paser une page RATP
# pageHtml = pageFile.read()
# texte = parsingRATP(pageHtml)
# pageFile.close()
#--------------------------------------
# ENVOI SMS FREE
#--------------------------------------
user='identifiantFourniParFreeMobile' # A changer
pas='motDePasseEnvoiSMSViaFreeMobile' # A changer
#quote convertit en ascii la chaine utf8
texte = str(texte)
url = 'https://smsapi.free-mobile.fr/sendmsg?&user='+user+'&pass='+pas+'&msg='+ quote(texte)
reponse = urlopen(url)
#A faire : tester la réponse pour le cas où il y a une erreur
Ce mini-projet m'a permis de commencer à apprendre le Python. Cela me permet si besoin de recevoir SMS qui me préviennent au bon moment pour me dire quel seront les prochains bus et RER que je dois prendre pour rentrer chez moi, si je dois prévoir d'être en retard ou si je serai à l'heure...
A voir également Ma page de raccourcis d'horaires de bus/train où là c'est en mode "connexion en ligne sur les sites" avec utilisation des mêmes URL.