08/07/07
AppleScript Météo-France pour GeekTool

Un AppleScript destiné à parser les cartes de prévisions météorologiques départementales[1], 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[2].
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[3] ?
Notes
[1] exemple de carte départementale de prévisions : Paris et Petite Couronne
[2] voir la documentation de Geektool