
Un AppleScript destiné à parser les cartes de prévisions météorologiques départementales, sur le site de Meteo France.
Le script utilise la commande curl deux fois successivement, une première fois pour récupérer le code source de la page HTML, et, une deuxième fois pour récupérer l'image GIF et la télécharger vers le dossier renseigné par la propriété myfolder. C'est d'ailleurs le seul résultat (utile) de ce script que de finalement télécharger une image.
weather.scpt
(*
weather.scpt
HP <http://blogosx.jupiterii.com>
updated Jul. 18, 2007
*)
property dpt : "75"
property myfolder : "/Users/path/to/folder"
property line2parse : "7"
--debug
property debug : false
on run
if debug is true then
set scriptname to string2get("/", (POSIX path of (path to me)) as string, "last")
set begin to timestamp("begin of " & scriptname) & return
end if
set page to "http://www.meteofrance.com/FR/mameteo/prevDept_iframe.jsp?LIEUID=DEPT" & dpt
set m to curl4content(page, "<img src=\"/img/picto/cte/moy/")
if first word of m is not "curlbug" then
try
--parse the result of curl4content
set m to string2get(return, m, line2parse)
set m to string2get("<img src=\"", m, 2)
set m to string2get("\"", m, 1)
--wURL is partially based on 'page' variable (declared above)
set wURL to "http://" & (string2get("/", page, 3)) & m
--remove old pic and curl the new one (no string returned if property debug is false)
return rm2curl(myfolder, wURL)
on error bug
beep
--error displayed with some useful information
return timestamp(((POSIX path of (path to me)) as string) & space & bug)
end try
else
return timestamp(((POSIX path of (path to me)) as string) & space & m)
return
end if
end run
--functions
on curl4content(page, delim)
try
if delim is not "" then
return do shell script "curl " & page & " | grep " & quoted form of delim
else
return do shell script "curl " & page
end if
on error bug
beep
return "curlbug:" & return & bug
end try
end curl4content
on replaceString(theText, oldString, newString)
set text item delimiters to oldString
set tempList to every text item of theText
set text item delimiters to newString
set theText to the tempList as string
set text item delimiters to ""
return theText
end replaceString
on string2get(delim, istring, pos)
set text item delimiters to delim
set temp to every text item of istring
set text item delimiters to ""
if pos is "last" then
return ((last item) of temp)
else if pos is "first" then
return ((first item) of temp)
else
return ((item pos) of temp)
end if
end string2get
on rm2curl(myfolder, wURL)
global begin, scriptname
try
--remove old pic (try because no verification before)
do shell script "rm " & quoted form of ((myfolder) & "/weather.gif")
end try
do shell script "curl " & quoted form of wURL & " >" & quoted form of ((myfolder) & "/weather.gif")
if debug is true then
return (begin) & timestamp("end of " & scriptname)
end if
end rm2curl
on timestamp(output)
return (do shell script "date '+%d/%m/%y'") & space & (time string of (current date)) & " : " & output
end timestamp
La propriété line2parse doit être renseignée après avoir lu le code source de la page pour y repérer l'emplacement de la localité pour laquelle on veut obtenir la météo, dépendamment de sa position dans le code source ; il faut, alors, compter manuellement les occurrences de cette chaîne : <img src="/img/picto/cte/moy/ (par exemple).
Le résultat est : le téléchargement de l'image correspondant aux prévisions à 08h, 14h ou 20h ; selon l'heure à laquelle le script s'exécute.
Si le (mini)mode débug est activé (property debug : true), la date et l'heure de démarrage et de fin de l'exécution du script peuvent être affichés si tout se passe bien ; sinon on a l'affichage de l'erreur rencontrée, et ce, que debug soit activé ou non. Pour l'utilisation avec Geektool, prévoir un emplacement, au cas où… on peut s'aider de property debug : true pour obtenir une sortie même si le script se déroule sans erreur ; pour avoir ainsi tout loisir de régler les dimensions de la zone de texte, la couleur et la police de caractères, etc.
Utilisation avec GeekTool
Cet AppleScript est destiné à être utilisé avec GeekTool, qui permettra d'une part d'exécuter le script à intervalles réguliers et d'autre part d'afficher l'image obtenue. Il faudra donc configurer GeekTool pour qu'il exécute le script :
osascript /path/to/weather.scpt
et pour qu'il affiche l'image.
Qualités, défauts (surtout), éventuels développements (???)
Les 3 variables les plus nécessaires à la configuration du script sont donc déclarées sous forme de propriétés et placées au début du script (dpt, myfolder, line2parse). Au pire des cas, une petite imprécision lors du renseignement de la propriété line2parse ne doit pas être réellement gênant en comparaison de ce que l'on doit pouvoir obtenir comme précision en utilisant, par exemple, weather.com ; ceci dit, une meilleur utilisation de grep pourrait peut être améliorer ce défaut en évitant de devoir compter les lignes en se basant plutôt sur le nom de la localité… pour le moment, je n'ai pas réussi à faire mieux.
Les images de meteofrance.com ne sont pas trop moches et, de plus, elles sont bien détourées, ce qui n'est pas le cas d'autres sites.
La rapidité d'exécution du script est satisfaisante (de l'ordre de la seconde). Je regrette cependant de ne pas avoir réussi, avec une seule commande curl (la première) associée à grep, à réussir un meilleur parsage et ainsi récupérer plus d'information, comme la température et le reste de cette chaîne texte. Peut-être pour une prochaine fois, en réglant aussi le souci décrit en 1er paragraphe… pour pourquoi pas, faire un petit script utilisant le système de notifications Growl ?